#include <libxml/tree.h>
-#define TERMLIST_HIGH_SCORE 100
-
#define MAX_CHUNK 15
#define MAX(a,b) ((a)>(b)?(a):(b))
}
s->termlists[i].name = nmem_strdup(s->nmem, type);
- s->termlists[i].termlist
- = termlist_create(s->nmem, TERMLIST_HIGH_SCORE);
+ s->termlists[i].termlist = termlist_create(s->nmem);
s->num_termlists = i + 1;
}
}
static void session_clear_set(struct session *se,
- const char *sort_field, int increasing)
+ const char *sort_field, int increasing, int position)
{
reclist_destroy(se->reclist);
se->reclist = 0;
se->sorted_results = nmem_malloc(se->nmem, sizeof(*se->sorted_results));
se->sorted_results->field = nmem_strdup(se->nmem, sort_field);
se->sorted_results->increasing = increasing;
+ se->sorted_results->position = position;
se->sorted_results->next = 0;
se->reclist = reclist_create(se->nmem);
}
void session_sort(struct session *se, const char *field, int increasing,
- int clear_set)
+ int position)
{
struct session_sorted_results *sr;
struct client_list *l;
session_enter(se);
- yaz_log(YLOG_LOG, "session_sort field=%s", field);
- if (clear_set)
+ yaz_log(YLOG_LOG, "session_sort field=%s increasing=%d position=%d", field, increasing, position);
+ /* see if we already have sorted for this critieria */
+ for (sr = se->sorted_results; sr; sr = sr->next)
{
- session_clear_set(se, field, increasing);
+ if (!strcmp(field, sr->field) && increasing == sr->increasing && sr->position == position)
+ break;
}
- else
+ if (sr)
{
- /* see if we already have sorted for this critieria */
- for (sr = se->sorted_results; sr; sr = sr->next)
- {
- if (!strcmp(field, sr->field) && increasing == sr->increasing)
- break;
- }
- if (sr)
- {
- session_log(se, YLOG_DEBUG, "search_sort: field=%s increasing=%d already fetched",
- field, increasing);
- session_leave(se);
- return;
- }
- 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->next = se->sorted_results;
- se->sorted_results = sr;
+ z(se, YLOG_DEBUG, "search_sort: field=%s increasing=%d position=%d already fetched",
+ field, increasing, position);
+ session_leave(se);
+ return;
}
+ if (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;
for (l = se->clients_active; l; l = l->next)
{
wrbuf_puts(c->wrbuf, "\">\n");
must_generate_empty = 0;
- p = termlist_highscore(se->termlists[i].termlist, &len);
+ p = termlist_highscore(se->termlists[i].termlist, &len,
+ nmem_tmp);
if (p)
{
int i;