handle date range from a limit parameter PAZ-997
[pazpar2-moved-to-github.git] / src / session.c
index ea3c0ff..325ba28 100644 (file)
@@ -204,29 +204,18 @@ void add_facet(struct session *s, const char *type, const char *value, int count
 
     if (wrbuf_len(facet_wrbuf))
     {
-        int i;
-        for (i = 0; i < s->num_termlists; i++)
-            if (!strcmp(s->termlists[i].name, type))
+        struct named_termlist **tp = &s->termlists;
+        for (; (*tp); tp = &(*tp)->next)
+            if (!strcmp((*tp)->name, type))
                 break;
-        if (i == s->num_termlists)
+        if (!*tp)
         {
-            if (i == SESSION_MAX_TERMLISTS)
-            {
-                session_log(s, YLOG_FATAL, "Too many termlists");
-                wrbuf_destroy(facet_wrbuf);
-                wrbuf_destroy(display_wrbuf);
-                return;
-            }
-
-            s->termlists[i].name = nmem_strdup(s->nmem, type);
-            s->termlists[i].termlist = termlist_create(s->nmem);
-            s->num_termlists = i + 1;
+            *tp = nmem_malloc(s->nmem, sizeof(**tp));
+            (*tp)->name = nmem_strdup(s->nmem, type);
+            (*tp)->termlist = termlist_create(s->nmem);
+            (*tp)->next = 0;
         }
-
-#if 0
-        session_log(s, YLOG_LOG, "Facets for %s: %s norm:%s (%d)", type, value, wrbuf_cstr(facet_wrbuf), count);
-#endif
-        termlist_insert(s->termlists[i].termlist, wrbuf_cstr(display_wrbuf),
+        termlist_insert((*tp)->termlist, wrbuf_cstr(display_wrbuf),
                         wrbuf_cstr(facet_wrbuf), count);
     }
     wrbuf_destroy(facet_wrbuf);
@@ -604,8 +593,7 @@ static void session_clear_set(struct session *se, struct reclist_sortparms *sp)
                     nmem_total(se->nmem));
     nmem_reset(se->nmem);
     se->total_records = se->total_merged = 0;
-    se->num_termlists = 0;
-
+    se->termlists = 0;
     relevance_clear(se->relevance);
 
     /* reset list of sorted results and clear to relevance search */
@@ -621,10 +609,8 @@ static void session_clear_set(struct session *se, struct reclist_sortparms *sp)
     se->reclist = reclist_create(se->nmem);
 }
 
-static void session_sort_unlocked(struct session *se,
-                                  struct reclist_sortparms *sp,
-                                  const char *mergekey,
-                                  const char *rank)
+void session_sort(struct session *se, struct reclist_sortparms *sp,
+                  const char *mergekey, const char *rank)
 {
     struct client_list *l;
     const char *field = sp->name;
@@ -632,6 +618,7 @@ static void session_sort_unlocked(struct session *se,
     int type  = sp->type;
     int clients_research = 0;
 
+    session_enter(se, "session_sort");
     session_log(se, YLOG_DEBUG, "session_sort field=%s increasing=%d type=%d",
                 field, increasing, type);
 
@@ -665,6 +652,7 @@ static void session_sort_unlocked(struct session *se,
         {
             session_log(se, YLOG_DEBUG, "session_sort: field=%s increasing=%d type=%d already fetched",
                         field, increasing, type);
+            session_leave(se, "session_sort");
             return;
         }
     }
@@ -682,14 +670,7 @@ static void session_sort_unlocked(struct session *se,
         client_parse_init(cl, 1);
         clients_research += client_parse_sort(cl, sp);
     }
-    if (clients_research)
-    {
-        session_log(se, YLOG_DEBUG,
-                    "session_sort: reset results due to %d clients researching",
-                    clients_research);
-        session_clear_set(se, sp);
-    }
-    else
+    if (!clients_research || se->clients_starting)
     {
         // A new sorting based on same record set
         struct reclist_sortparms *sr = nmem_malloc(se->nmem, sizeof(*sr));
@@ -699,36 +680,66 @@ static void session_sort_unlocked(struct session *se,
         sr->next = se->sorted_results;
         se->sorted_results = sr;
         session_log(se, YLOG_DEBUG, "session_sort: no research/ingesting done");
-        return ;
+        session_leave(se, "session_sort");
     }
-    session_log(se, YLOG_DEBUG, "Re- search/ingesting for clients due to change in sort order");
-
-    for (l = se->clients_active; l; l = l->next)
+    else
     {
-        struct client *cl = l->client;
-        if (client_get_state(cl) == Client_Connecting ||
-            client_get_state(cl) == Client_Idle ||
-            client_get_state(cl) == Client_Working) {
-            client_start_search(cl);
-        }
-        else
+        se->clients_starting = 1;
+        session_log(se, YLOG_DEBUG,
+                    "session_sort: reset results due to %d clients researching",
+                    clients_research);
+        session_clear_set(se, sp);
+        session_log(se, YLOG_DEBUG, "Re- search/ingesting for clients due to change in sort order");
+
+        session_leave(se, "session_sort");
+        for (l = se->clients_active; l; l = l->next)
         {
-            session_log(se, YLOG_DEBUG,
-                        "session_sort: %s: No re-start/ingest in show. "
-                        "Wrong client state: %d",
-                        client_get_id(cl), client_get_state(cl));
+            struct client *cl = l->client;
+            if (client_get_state(cl) == Client_Connecting ||
+                client_get_state(cl) == Client_Idle ||
+                client_get_state(cl) == Client_Working) {
+                client_start_search(cl);
+            }
+            else
+            {
+                session_log(se, YLOG_DEBUG,
+                            "session_sort: %s: No re-start/ingest in show. "
+                            "Wrong client state: %d",
+                            client_get_id(cl), client_get_state(cl));
+            }
         }
+        session_enter(se, "session_sort");
+        se->clients_starting = 0;
+        session_leave(se, "session_sort");
     }
 }
 
-void session_sort(struct session *se, struct reclist_sortparms *sp,
-                  const char *mergekey, const char *rank)
+void session_stop(struct session *se)
 {
-    //session_enter(se, "session_sort");
-    session_sort_unlocked(se, sp, mergekey, rank);
-    //session_leave(se, "session_sort");
-}
+    struct client_list *l;
+    session_enter(se, "session_stop1");
+    if (se->clients_starting)
+    {
+        session_leave(se, "session_stop1");
+        return;
+    }
+    se->clients_starting = 1;
+    session_leave(se, "session_stop1");
+
+    session_alert_watch(se, SESSION_WATCH_SHOW);
+    session_alert_watch(se, SESSION_WATCH_BYTARGET);
+    session_alert_watch(se, SESSION_WATCH_TERMLIST);
+    session_alert_watch(se, SESSION_WATCH_SHOW_PREF);
 
+    for (l = se->clients_active; l; l = l->next)
+    {
+        struct client *cl = l->client;
+        client_stop(cl);
+    }
+    session_enter(se, "session_stop2");
+    se->clients_starting = 0;
+    session_leave(se, "session_stop2");
+}
 
 enum pazpar2_error_code session_search(struct session *se,
                                        const char *query,
@@ -1002,7 +1013,7 @@ struct session *new_session(NMEM nmem, struct conf_service *service,
     session->total_records = 0;
     session->number_of_warnings_unknown_elements = 0;
     session->number_of_warnings_unknown_metadata = 0;
-    session->num_termlists = 0;
+    session->termlists = 0;
     session->reclist = reclist_create(nmem);
     session->clients_active = 0;
     session->clients_cached = 0;
@@ -1151,7 +1162,7 @@ static int targets_termlist_nb(WRBUF wrbuf, struct session *se, int num,
 void perform_termlist(struct http_channel *c, struct session *se,
                       const char *name, int num, int version)
 {
-    int i, j;
+    int j;
     NMEM nmem_tmp = nmem_create();
     char **names;
     int num_names = 0;
@@ -1168,9 +1179,10 @@ void perform_termlist(struct http_channel *c, struct session *se,
         const char *tname;
         int must_generate_empty = 1; /* bug 5350 */
 
-        for (i = 0; i < se->num_termlists; i++)
+        struct named_termlist *t = se->termlists;
+        for (; t; t = t->next)
         {
-            tname = se->termlists[i].name;
+            tname = t->name;
             if (!strcmp(names[j], tname) || !strcmp(names[j], "*"))
             {
                 struct termlist_score **p = 0;
@@ -1181,8 +1193,7 @@ void perform_termlist(struct http_channel *c, struct session *se,
                 wrbuf_puts(c->wrbuf, "\">\n");
                 must_generate_empty = 0;
 
-                p = termlist_highscore(se->termlists[i].termlist, &len,
-                                       nmem_tmp);
+                p = termlist_highscore(t->termlist, &len, nmem_tmp);
                 if (p)
                 {
                     int i;