yaz_log(YLOG_LOG, "session_sort field=%s increasing=%d position=%d", field, increasing, position);
/* see if we already have sorted for this critieria */
+ /* TODO I do not see the point in saving all previous sorts. Dont we re-sort anyway ? */
for (sr = se->sorted_results; sr; sr = sr->next)
{
if (!strcmp(field, sr->field) && increasing == sr->increasing && sr->position == position)
}
if (sr)
{
- z(se, YLOG_DEBUG, "search_sort: field=%s increasing=%d position=%d already fetched",
+ session_log(se, YLOG_DEBUG, "search_sort: field=%s increasing=%d position=%d already fetched",
field, increasing, position);
session_leave(se);
return;
}
+ session_log(se, YLOG_DEBUG, "search_sort: field=%s increasing=%d position=%d must fetch",
+ field, increasing, position);
if (position)
{
+ yaz_log(YLOG_DEBUG, "Reset results due to position");
session_clear_set(se, field, increasing, position);
}
-
- session_log(se, YLOG_DEBUG, "search_sort: field=%s increasing=%d must fetch",
- field, increasing);
- sr = nmem_malloc(se->nmem, sizeof(*sr));
- sr->field = nmem_strdup(se->nmem, field);
- sr->increasing = increasing;
- sr->position = position;
- sr->next = se->sorted_results;
- se->sorted_results = sr;
-
+ else {
+ sr = nmem_malloc(se->nmem, sizeof(*sr));
+ sr->field = nmem_strdup(se->nmem, field);
+ sr->increasing = increasing;
+ sr->position = position;
+ sr->next = se->sorted_results;
+ se->sorted_results = sr;
+ }
+ yaz_log(YLOG_DEBUG, "Restarting search for clients due to change in sort order");
+
for (l = se->clients_active; l; l = l->next)
{
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_get_state(cl) == Client_Working) {
+ yaz_log(YLOG_DEBUG, "Client %s: Restarting search due to change in sort order", client_get_id(cl));
client_start_search(cl);
+ }
}
session_leave(se);
}
const char *filter,
const char *limit,
const char **addinfo,
- const char *sort_field, int increasing)
+ const char *sort_field,
+ int increasing)
{
int live_channels = 0;
int no_working = 0;
session_enter(se);
se->settings_modified = 0;
- session_clear_set(se, sort_field, increasing);
+ session_clear_set(se, sort_field, increasing, 0); /* hardcoded position */
relevance_destroy(&se->relevance);
live_channels = select_targets(se, filter);