26 #include <yaz/yaz-util.h>
55 for (; a; a = a->
next)
58 for (; *pi; pi = &(*pi)->
next)
59 if (!strcmp((*pi)->value, a->
value))
64 (*pi)->
name = nmem_strdup_null(nmem, a->
name);
65 (*pi)->value = nmem_strdup_null(nmem, a->
value);
77 if (strlen(parms) > 256)
90 if (!(cpp = strchr(parms,
',')))
91 cpp = parms + strlen(parms);
92 strncpy(parm, parms, cpp - parms);
93 parm[cpp-parms] =
'\0';
95 if ((pp = strchr(parm,
':')))
99 else if (pp[1] ==
'0')
103 yaz_log(YLOG_FATAL,
"Bad sortkey modifier: %s", parm);
112 yaz_log(YLOG_FATAL,
"Bad sortkey modifier: %s", parm);
118 if (!strcmp(parm,
"relevance"))
122 else if (!strcmp(parm,
"position"))
126 else if (!strcmp(parm,
"retrieval"))
135 if (!strcmp(sk->
name, parm))
143 yaz_log(YLOG_FATAL,
"Sortkey not defined in service: %s",
151 yaz_log(YLOG_FATAL,
"Sortkey not defined in service: %s",
158 new->offset = offset;
160 new->increasing = increasing;
161 new->name = nmem_strdup(nmem, parm);
177 for (s = sortparms; s && res == 0; s = s->
next)
191 res = strcmp(s1, s2);
202 else if (ut1 && !ut2)
207 else if (!ut1 && ut2)
218 int pos1 = 0, pos2 = 0;
221 if (pos1 == 0 || rec->
position < pos1)
224 if (pos2 == 0 || rec->
position < pos2)
345 yaz_mutex_enter(l->
mutex);
352 yaz_mutex_leave(l->
mutex);
396 yaz_mutex_destroy(&l->
mutex);
414 for (; *rp; rp = &(*rp)->
next)
420 const char *merge_key = mkl->
value;
421 unsigned int bucket =
454 cluster = nmem_malloc(l->
nmem,
sizeof(*cluster));
498 yaz_mutex_enter(l->
mutex);
500 for (; mkl; mkl = mkl->
next)
502 const char *merge_key = mkl->
value;
503 unsigned int bucket =
511 for (; mkr; mkr = mkr->
next)
514 if (!strcmp(merge_key, mkr->
value))
525 yaz_mutex_leave(l->
mutex);
535 if (cluster != rb->
record)
553 rb = nmem_malloc(l->
nmem,
sizeof(*rb));
560 yaz_mutex_leave(l->
mutex);
569 if (sort1 == 0 || sort2 == 0)
unsigned int jenkins_hash(const unsigned char *key)
@ Metadata_type_relevance
@ Metadata_type_retrieval
@ Metadata_type_skiparticle
void pazpar2_mutex_create(YAZ_MUTEX *p, const char *name)
struct record_cluster * reclist_insert(struct reclist *l, struct relevance *r, struct conf_service *service, struct record *record, struct record_metadata_attr *merge_keys, int *total)
void reclist_sort(struct reclist *l, struct reclist_sortparms *parms)
static int reclist_cmp(const void *p1, const void *p2)
static void merge_cluster(struct reclist *l, struct relevance *r, struct record_cluster *dst, struct record_cluster *src)
struct reclist_sortparms * reclist_parse_sortparms(NMEM nmem, const char *parms, struct conf_service *service)
void reclist_enter(struct reclist *l)
void reclist_destroy(struct reclist *l)
static struct record_cluster * new_cluster(struct reclist *l, struct relevance *r, struct conf_service *service, struct record *record, struct record_metadata_attr *merge_keys)
void reclist_leave(struct reclist *l)
struct record_cluster * reclist_read_record(struct reclist *l)
int reclist_get_num_records(struct reclist *l)
void reclist_rewind(struct reclist *l)
void reclist_limit(struct reclist *l, struct session *se, int lazy)
int reclist_sortparms_cmp(struct reclist_sortparms *sort1, struct reclist_sortparms *sort2)
struct reclist * reclist_create(NMEM nmem)
static void append_merge_keys(struct record_metadata_attr **p, const struct record_metadata_attr *a, NMEM nmem)
int record_compare(struct record *r1, struct record *r2, struct conf_service *service)
void relevance_newrec(struct relevance *r, struct record_cluster *rec)
void relevance_mergerec(struct relevance *r, struct record_cluster *dst, const struct record_cluster *src)
int session_check_cluster_limit(struct session *se, struct record_cluster *rec)
struct conf_sortkey * sortkeys
enum conf_metadata_type type
struct record_cluster * record
struct reclist_bucket * hash_next
struct reclist_sortparms * next
enum conf_metadata_type type
struct reclist_bucket ** hashtable
struct record_cluster * sorted_list
struct record_cluster * sorted_ptr
struct record_metadata ** metadata
union data_types ** sortkeys
struct reclist_sortparms * sort_parms
struct record_cluster * sorted_next
struct record_metadata_attr * merge_keys
struct data_types::@3 text
struct data_types::@4 number