/* This file is part of Pazpar2.
- Copyright (C) 2006-2012 Index Data
+ Copyright (C) 2006-2013 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
int num_records;
struct reclist_bucket *sorted_list;
struct reclist_bucket *sorted_ptr;
- struct reclist_bucket **last;
NMEM nmem;
YAZ_MUTEX mutex;
};
struct reclist_bucket
{
struct record_cluster *record;
- struct reclist_bucket *hnext;
- struct reclist_bucket *snext;
+ struct reclist_bucket *hash_next;
+ struct reclist_bucket *sorted_next;
struct reclist_sortparms *sort_parms;
};
return res;
}
+void reclist_limit(struct reclist *l, struct session *se, int lazy)
+{
+ unsigned i;
+ int num = 0;
+ struct reclist_bucket **pp = &l->sorted_list;
+
+ reclist_enter(l);
+
+ if (!lazy || !*pp)
+ {
+ for (i = 0; i < l->hash_size; i++)
+ {
+ struct reclist_bucket *p;
+ for (p = l->hashtable[i]; p; p = p->hash_next)
+ {
+ if (session_check_cluster_limit(se, p->record))
+ {
+ *pp = p;
+ pp = &p->sorted_next;
+ num++;
+ }
+ }
+ }
+ *pp = 0;
+ }
+ l->num_records = num;
+ reclist_leave(l);
+}
+
void reclist_sort(struct reclist *l, struct reclist_sortparms *parms)
{
struct reclist_bucket **flatlist = xmalloc(sizeof(*flatlist) * l->num_records);
{
ptr->sort_parms = parms;
flatlist[i] = ptr;
- ptr = ptr->snext;
+ ptr = ptr->sorted_next;
i++;
}
assert(i == l->num_records);
for (i = 0; i < l->num_records; i++)
{
*prev = flatlist[i];
- prev = &flatlist[i]->snext;
+ prev = &flatlist[i]->sorted_next;
}
*prev = 0;
- l->last = prev;
xfree(flatlist);
if (l && l->sorted_ptr)
{
struct record_cluster *t = l->sorted_ptr->record;
- l->sorted_ptr = l->sorted_ptr->snext;
+ l->sorted_ptr = l->sorted_ptr->sorted_next;
return t;
}
else
res->sorted_ptr = 0;
res->sorted_list = 0;
- res->last = &res->sorted_list;
res->num_records = 0;
res->mutex = 0;
{
if (l)
{
- struct reclist_bucket *rb;
-
- for (rb = l->sorted_list; rb; rb = rb->snext)
+ unsigned i;
+ for (i = 0; i < l->hash_size; i++)
{
- wrbuf_destroy(rb->record->relevance_explain1);
- wrbuf_destroy(rb->record->relevance_explain2);
+ struct reclist_bucket *p;
+ for (p = l->hashtable[i]; p; p = p->hash_next)
+ {
+ wrbuf_destroy(p->record->relevance_explain1);
+ wrbuf_destroy(p->record->relevance_explain2);
+ }
}
yaz_mutex_destroy(&l->mutex);
}
bucket = jenkins_hash((unsigned char*) merge_key) % l->hash_size;
yaz_mutex_enter(l->mutex);
- for (p = &l->hashtable[bucket]; *p; p = &(*p)->hnext)
+ for (p = &l->hashtable[bucket]; *p; p = &(*p)->hash_next)
{
// We found a matching record. Merge them
if (!strcmp(merge_key, (*p)->record->merge_key))
record->next = 0;
new->record = cluster;
- new->hnext = 0;
+ new->hash_next = 0;
cluster->records = record;
cluster->merge_key = nmem_strdup(l->nmem, merge_key);
cluster->relevance_score = 0;
cluster->relevance_explain2 = wrbuf_alloc();
/* attach to hash list */
*p = new;
-
- /* append to sorted_list */
- *l->last = new;
- l->last = &new->snext;
- l->sorted_ptr = l->sorted_list;
- new->snext = 0;
-
l->num_records++;
}
yaz_mutex_leave(l->mutex);