Merge branch 'master' of ssh://git.indexdata.com/home/git/pub/pazpar2
authorDennis Schafroth <dennis@indexdata.com>
Wed, 10 Aug 2011 08:35:55 +0000 (10:35 +0200)
committerDennis Schafroth <dennis@indexdata.com>
Wed, 10 Aug 2011 08:35:55 +0000 (10:35 +0200)
etc/tmarc.xsl: changed ! to | in matching on d901 or d907
src/client.c: Removed local/mixed/remote option while keeping new apply_filter code.

1  2 
.project
src/client.c

diff --combined .project
+++ b/.project
                                        <value>make</value>
                                </dictionary>
                                <dictionary>
++                                      <key>org.eclipse.cdt.make.core.buildLocation</key>
++                                      <value>${workspace_loc:/pazpar2.master/Debug}</value>
++                              </dictionary>
++                              <dictionary>
                                        <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
                                        <value>clean</value>
                                </dictionary>
diff --combined src/client.c
@@@ -945,24 -945,68 +945,57 @@@ static char *make_solrquery(struct clie
      return r;
  }
  
+ static void apply_limit(struct session_database *sdb,
+                         facet_limits_t facet_limits,
+                         WRBUF w)
+ {
+     int i = 0;
+     const char *name;
+     const char *value;
+     for (i = 0; (name = facet_limits_get(facet_limits, i, &value)); i++)
+     {
+         struct setting *s = 0;
+         
+         for (s = sdb->settings[PZ_FACETMAP]; s; s = s->next)
+         {
+             const char *p = strchr(s->name + 3, ':');
+             if (p && !strcmp(p + 1, name) && s->value && s->value[0])
+             {
+                 wrbuf_insert(w, 0, "@and ", 5);
+                 wrbuf_puts(w, " @attr 1=");
+                 yaz_encode_pqf_term(w, s->value, strlen(s->value));
+                 wrbuf_puts(w, " ");
+                 yaz_encode_pqf_term(w, value, strlen(value));
+                 break;
+             }
+         }
+         if (!s)
+         {
+             yaz_log(YLOG_WARN, "facet %s used, but no facetmap defined",
+                     name);
+         }
+     }
+ }
+                         
  // Parse the query given the settings specific to this client
- int client_parse_query(struct client *cl, const char *query)
+ int client_parse_query(struct client *cl, const char *query,
+                        facet_limits_t facet_limits)
  {
      struct session *se = client_get_session(cl);
      struct session_database *sdb = client_get_database(cl);
      struct ccl_rpn_node *cn;
 -    struct ccl_rpn_node *cn_recordfilter = 0;
      int cerror, cpos;
      CCL_bibset ccl_map = prepare_cclmap(cl);
      const char *sru = session_setting_oneval(sdb, PZ_SRU);
      const char *pqf_prefix = session_setting_oneval(sdb, PZ_PQF_PREFIX);
      const char *pqf_strftime = session_setting_oneval(sdb, PZ_PQF_STRFTIME);
      const char *query_syntax = session_setting_oneval(sdb, PZ_QUERY_SYNTAX);
 -    /* Collected, Mixed, Remote */
 -    const char *option_recordfilter = session_setting_oneval(sdb, PZ_OPTION_RECORDFILTER);
      const char *record_filter = session_setting_oneval(sdb, PZ_RECORDFILTER);
      if (!ccl_map)
          return -1;
  
      yaz_log(YLOG_DEBUG, "query: %s", query);
      cn = ccl_find_str(ccl_map, query, &cerror, &cpos);
 -    if (strcmp("remote", option_recordfilter) == 0 && record_filter != 0 && record_filter[0] != 0) {
 -        int cerror, cpos;
 -        yaz_log(YLOG_DEBUG, "record_filter: %s", record_filter);
 -        cn_recordfilter = ccl_find_str(ccl_map, record_filter, &cerror, &cpos);
 -        if (!cn_recordfilter)
 -            session_log(se, YLOG_WARN, "Failed to parse CCL record filter '%s' for %s",
 -                    record_filter, client_get_database(cl)->database->url);
 -    }
      ccl_qual_rm(&ccl_map);
      if (!cn)
      {
          wrbuf_puts(se->wrbuf, " ");
      }
  
 -    if (cn_recordfilter) {
 -        wrbuf_puts(se->wrbuf, "@and ");
 -        ccl_pquery(se->wrbuf, cn_recordfilter);
 -        wrbuf_puts(se->wrbuf, " ");
 -    }
 -
+     apply_limit(sdb, facet_limits, se->wrbuf);
      if (!pqf_strftime || !*pqf_strftime)
          ccl_pquery(se->wrbuf, cn);
      else