Merge branch 'master' of ssh://git.indexdata.com/home/git/pub/pazpar2
[pazpar2-moved-to-github.git] / src / client.c
index dd3b58c..9367153 100644 (file)
@@ -425,40 +425,42 @@ static int nativesyntax_to_type(struct session_database *sdb, char *type,
  */
 void client_report_facets(struct client *cl, ZOOM_resultset rs)
 {
-    int facet_idx;
     struct session_database *sdb = client_get_database(cl);
     ZOOM_facet_field *facets = ZOOM_resultset_facets(rs);
-    int facet_num;
-    struct session *se = client_get_session(cl);
-    struct setting *s;
-    facet_num = ZOOM_resultset_facets_size(rs);
-    yaz_log(YLOG_DEBUG, "client_report_facets: %d", facet_num);
 
-    for (s = sdb->settings[PZ_FACETMAP]; s; s = s->next)
+    if (sdb && facets)
     {
-        const char *p = strchr(s->name + 3, ':');
-        if (p && p[1] && s->value && s->value[0])
+        struct session *se = client_get_session(cl);
+        int facet_num = ZOOM_resultset_facets_size(rs);
+        struct setting *s;
+
+        for (s = sdb->settings[PZ_FACETMAP]; s; s = s->next)
         {
-            p++; /* p now holds logical facet name */
-            for (facet_idx = 0; facet_idx < facet_num; facet_idx++)
+            const char *p = strchr(s->name + 3, ':');
+            if (p && p[1] && s->value && s->value[0])
             {
-                const char *native_name =
-                    ZOOM_facet_field_name(facets[facet_idx]);
-                if (native_name && !strcmp(s->value, native_name))
+                int facet_idx;
+                p++; /* p now holds logical facet name */
+                for (facet_idx = 0; facet_idx < facet_num; facet_idx++)
                 {
-                    size_t term_idx;
-                    size_t term_num =
-                        ZOOM_facet_field_term_count(facets[facet_idx]);
-                    for (term_idx = 0; term_idx < term_num; term_idx++ )
+                    const char *native_name =
+                        ZOOM_facet_field_name(facets[facet_idx]);
+                    if (native_name && !strcmp(s->value, native_name))
                     {
-                        int freq;
-                        const char *term =
-                            ZOOM_facet_field_get_term(facets[facet_idx],
-                                                      term_idx, &freq);
-                        if (term)
-                            add_facet(se, p, term, freq);
+                        size_t term_idx;
+                        size_t term_num =
+                            ZOOM_facet_field_term_count(facets[facet_idx]);
+                        for (term_idx = 0; term_idx < term_num; term_idx++ )
+                        {
+                            int freq;
+                            const char *term =
+                                ZOOM_facet_field_get_term(facets[facet_idx],
+                                                          term_idx, &freq);
+                            if (term)
+                                add_facet(se, p, term, freq);
+                        }
+                        break;
                     }
-                    break;
                 }
             }
         }
@@ -943,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)
     {
@@ -988,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);