ICU chain "facet" honors YAC ICU element <display/>.
[pazpar2-moved-to-github.git] / src / session.c
index 405d53b..ee39c7b 100644 (file)
@@ -86,7 +86,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 struct parameters global_parameters = 
 {
     0,   // dump_records
-    0    // debug_mode
+    0,   // debug_mode
+    0,   // predictable sessions
 };
 
 struct client_list {
@@ -190,20 +191,31 @@ void add_facet(struct session *s, const char *type, const char *value, int count
     pp2_relevance_token_t prt;
     const char *facet_component;
     WRBUF facet_wrbuf = wrbuf_alloc();
+    WRBUF display_wrbuf = wrbuf_alloc();
     prt = pp2_relevance_tokenize(service->facet_pct);
     
     pp2_relevance_first(prt, value, 0);
     while ((facet_component = pp2_relevance_token_next(prt)))
     {
+        const char *display_component;
         if (*facet_component)
         {
             if (wrbuf_len(facet_wrbuf))
                 wrbuf_puts(facet_wrbuf, " ");
             wrbuf_puts(facet_wrbuf, facet_component);
         }
+        display_component = pp2_get_display(prt);
+        if (display_component)
+        {
+            if (wrbuf_len(display_wrbuf))
+                wrbuf_puts(display_wrbuf, " ");
+            wrbuf_puts(display_wrbuf, display_component);
+        }
     }
     pp2_relevance_token_destroy(prt);
-    
+    yaz_log(YLOG_LOG, "facet norm=%s", wrbuf_cstr(facet_wrbuf));
+    yaz_log(YLOG_LOG, "facet display=%s", wrbuf_cstr(display_wrbuf));
     if (wrbuf_len(facet_wrbuf))
     {
         int i;
@@ -228,10 +240,11 @@ void add_facet(struct session *s, const char *type, const char *value, int count
 #if 0
         session_log(s, YLOG_DEBUG, "Facets for %s: %s norm:%s (%d)", type, value, wrbuf_cstr(facet_wrbuf), count);
 #endif
-        termlist_insert(s->termlists[i].termlist, wrbuf_cstr(facet_wrbuf),
-                        count);
+        termlist_insert(s->termlists[i].termlist, wrbuf_cstr(display_wrbuf),
+                        wrbuf_cstr(facet_wrbuf), count);
     }
     wrbuf_destroy(facet_wrbuf);
+    wrbuf_destroy(display_wrbuf);
 }
 
 static xmlDoc *record_to_xml(struct session *se,
@@ -487,7 +500,7 @@ int session_set_watch(struct session *s, int what,
         ret = 0;
     }
     session_leave(s);
-    return 0;
+    return ret;
 }
 
 void session_alert_watch(struct session *s, int what)
@@ -589,12 +602,11 @@ int session_is_preferred_clients_ready(struct session *s)
     return res == 0;
 }
 
-
-
 enum pazpar2_error_code search(struct session *se,
                                const char *query,
                                const char *startrecs, const char *maxrecs,
                                const char *filter,
+                               const char *limit,
                                const char **addinfo)
 {
     int live_channels = 0;
@@ -602,6 +614,7 @@ enum pazpar2_error_code search(struct session *se,
     int no_failed = 0;
     struct client_list *l;
     struct timeval tval;
+    facet_limits_t facet_limits;
 
     session_log(se, YLOG_DEBUG, "Search");
 
@@ -628,6 +641,13 @@ enum pazpar2_error_code search(struct session *se,
     
     tval.tv_sec += 5;
 
+    facet_limits = facet_limits_create(limit);
+    if (!facet_limits)
+    {
+        *addinfo = "limit";
+        session_leave(se);
+        return PAZPAR2_MALFORMED_PARAMETER_VALUE;
+    }
     for (l = se->clients; l; l = l->next)
     {
         struct client *cl = l->client;
@@ -638,7 +658,7 @@ enum pazpar2_error_code search(struct session *se,
             client_set_startrecs(cl, atoi(startrecs));
         if (prepare_session_database(se, client_get_database(cl)) < 0)
             ;
-        else if (client_parse_query(cl, query) < 0)
+        else if (client_parse_query(cl, query, facet_limits) < 0)
             no_failed++;
         else
         {
@@ -650,6 +670,7 @@ enum pazpar2_error_code search(struct session *se,
                 client_start_search(cl);
         }
     }
+    facet_limits_destroy(facet_limits);
     session_leave(se);
     if (no_working == 0)
     {
@@ -759,12 +780,6 @@ void session_apply_setting(struct session *se, char *dbname, char *setting,
     }
 }
 
-/* Depreciated: use session_destroy */
-void destroy_session(struct session *se)
-{
-    session_destroy(se);
-}
-
 void session_destroy(struct session *se) {
     struct session_database *sdb;
     session_log(se, YLOG_DEBUG, "Destroying");
@@ -779,10 +794,13 @@ void session_destroy(struct session *se) {
     nmem_destroy(se->nmem);
     service_destroy(se->service);
     yaz_mutex_destroy(&se->session_mutex);
-    wrbuf_destroy(se->wrbuf);
-
 }
 
+/* Depreciated: use session_destroy */
+void destroy_session(struct session *se)
+{
+    session_destroy(se);
+}
 
 size_t session_get_memory_status(struct session *session) {
     size_t session_nmem;
@@ -818,7 +836,6 @@ struct session *new_session(NMEM nmem, struct conf_service *service,
     session->clients = 0;
     session->session_nmem = nmem;
     session->nmem = nmem_create();
-    session->wrbuf = wrbuf_alloc();
     session->databases = 0;
     for (i = 0; i <= SESSION_WATCH_MAX; i++)
     {
@@ -859,14 +876,16 @@ struct hitsbytarget *hitsbytarget(struct session *se, int *count, NMEM nmem)
         res[*count].state = client_get_state_str(cl);
         res[*count].connected  = client_get_connection(cl) ? 1 : 0;
         session_settings_dump(se, client_get_database(cl), w);
-        res[*count].settings_xml = w;
+        res[*count].settings_xml = nmem_strdup(nmem, wrbuf_cstr(w));
+        wrbuf_destroy(w);
         (*count)++;
     }
     session_leave(se);
     return res;
 }
 
-struct termlist_score **termlist(struct session *se, const char *name, int *num)
+struct termlist_score **get_termlist_score(struct session *se,
+                                           const char *name, int *num)
 {
     int i;
     struct termlist_score **tl = 0;
@@ -1503,7 +1522,6 @@ static int ingest_to_cluster(struct client *cl,
             // construct facets ... unless the client already has reported them
             if (ser_md->termlist && !client_has_facet(cl, (char *) type))
             {
-
                 if (ser_md->type == Metadata_type_year)
                 {
                     char year[64];