Merge branch 'master' of ssh://git.indexdata.com/home/git/pub/pazpar2
[pazpar2-moved-to-github.git] / src / client.c
index 0ea7512..9367153 100644 (file)
@@ -945,35 +945,57 @@ static char *make_solrquery(struct client *cl)
     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)
     {
@@ -990,11 +1012,7 @@ int client_parse_query(struct client *cl, const char *query)
         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);