#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 */
+ /* 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)
{
- 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;
+ session_log(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 position=%d must fetch",
+ field, increasing, position);
+ 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)
{
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);
session_leave(se);
return p;
}
-
-struct termlist_score **get_termlist_score(struct session *se,
- const char *name, int *num)
-{
- int i;
- struct termlist_score **tl = 0;
-
- session_enter(se);
- for (i = 0; i < se->num_termlists; i++)
- if (!strcmp((const char *) se->termlists[i].name, name))
- {
- tl = termlist_highscore(se->termlists[i].termlist, num);
- break;
- }
- session_leave(se);
- return tl;
-}
// Compares two hitsbytarget nodes by hitcount
static int cmp_ht(const void *p1, const void *p2)
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;