sortmap relevance always uses increasing=1 PAZ-930
[pazpar2-moved-to-github.git] / src / client.c
index 2002c69..fbfc564 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of Pazpar2.
-   Copyright (C) 2006-2013 Index Data
+   Copyright (C) Index Data
 
 Pazpar2 is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
@@ -73,7 +73,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 static YAZ_MUTEX g_mutex = 0;
 static int no_clients = 0;
-static int no_clients_total = 0;
 
 static int client_use(int delta)
 {
@@ -82,8 +81,6 @@ static int client_use(int delta)
         yaz_mutex_create(&g_mutex);
     yaz_mutex_enter(g_mutex);
     no_clients += delta;
-    if (delta > 0)
-        no_clients_total += delta;
     clients = no_clients;
     yaz_mutex_leave(g_mutex);
     yaz_log(YLOG_DEBUG, "%s clients=%d",
@@ -96,18 +93,6 @@ int clients_count(void)
     return client_use(0);
 }
 
-int clients_count_total(void)
-{
-    int total = 0;
-    if (!g_mutex)
-        return 0;
-    yaz_mutex_enter(g_mutex);
-    total = no_clients_total;
-    yaz_mutex_leave(g_mutex);
-    return total;
-}
-
-
 /** \brief Represents client state for a connection to one search target */
 struct client {
     struct session_database *database;
@@ -882,12 +867,14 @@ int client_start_search(struct client *cl)
     /* Nothing has changed and we already have a result */
     if (cl->same_search == 1 && rc_prep_connection == 2)
     {
-        session_log(se, YLOG_LOG, "client %s REUSE result", client_get_id(cl));
+        session_log(se, YLOG_LOG, "client %s resuse result", client_get_id(cl));
         return client_reingest(cl);
     }
     else if (!rc_prep_connection)
     {
-        session_log(se, YLOG_LOG, "client %s FAILED to search: No connection.", client_get_id(cl));
+        session_log(se, YLOG_LOG, "client %s postponing search: No connection",
+                    client_get_id(cl));
+        client_set_state_nb(cl, Client_Working);
         return -1;
     }
     co = client_get_connection(cl);
@@ -895,7 +882,7 @@ int client_start_search(struct client *cl)
     link = connection_get_link(co);
     assert(link);
 
-    session_log(se, YLOG_LOG, "client %s NEW search", client_get_id(cl));
+    session_log(se, YLOG_LOG, "client %s new search", client_get_id(cl));
 
     cl->diagnostic = 0;
     cl->filtered = 0;
@@ -1015,6 +1002,7 @@ struct client *client_create(const char *id)
     cl->id = xstrdup(id);
     client_use(1);
 
+    yaz_log(YLOG_DEBUG, "client_create c=%p %s", cl, id);
     return cl;
 }
 
@@ -1355,7 +1343,7 @@ static int apply_limit(struct session_database *sdb,
 // return -1 on query error
 // return -2 on limit error
 int client_parse_query(struct client *cl, const char *query,
-                       facet_limits_t facet_limits)
+                       facet_limits_t facet_limits, const char **error_msg)
 {
     struct session *se = client_get_session(cl);
     struct conf_service *service = se->service;
@@ -1400,6 +1388,8 @@ int client_parse_query(struct client *cl, const char *query,
     ccl_qual_rm(&ccl_map);
     if (!cn)
     {
+        if (error_msg)
+            *error_msg = ccl_err_msg(cerror);
         client_set_state(cl, Client_Error);
         session_log(se, YLOG_WARN, "Client %s: Failed to parse CCL query '%s'",
                     client_get_id(cl),
@@ -1458,6 +1448,7 @@ int client_parse_query(struct client *cl, const char *query,
         session_log(se, YLOG_WARN, "Invalid PQF query for Client %s: %s",
                     client_get_id(cl), cl->pquery);
         ret_value = -1;
+        *error_msg = "Invalid PQF after CCL to PQF conversion";
     }
     else
     {
@@ -1472,7 +1463,10 @@ int client_parse_query(struct client *cl, const char *query,
             else
                 cl->cqlquery = make_cqlquery(cl, zquery);
             if (!cl->cqlquery)
+            {
+                *error_msg = "Cannot convert PQF to Solr/CQL";
                 ret_value = -1;
+            }
             else
                 session_log(se, YLOG_LOG, "Client %s native query: %s (%s)",
                             client_get_id(cl), cl->cqlquery, sru);
@@ -1501,6 +1495,8 @@ int client_parse_sort(struct client *cl, struct reclist_sortparms *sp)
         const char *sort_strategy_and_spec =
             get_strategy_plus_sort(cl, sp->name);
         int increasing = sp->increasing;
+        if (!strcmp(sp->name, "relevance"))
+            increasing = 1;
         if (sort_strategy_and_spec && strlen(sort_strategy_and_spec) < 40)
         {
             char strategy[50], *p;