34 #include <yaz/diagbib1.h>
37 #define ZSET_SORT_MAX_LEVEL 10
103 Z_SortKeySpecList *sort_sequence;
107 sort_sequence = (Z_SortKeySpecList *)
108 nmem_malloc(nmem,
sizeof(*sort_sequence));
109 sort_sequence->num_specs = 10;
110 sort_sequence->specs = (Z_SortKeySpec **)
111 nmem_malloc(nmem, sort_sequence->num_specs *
112 sizeof(*sort_sequence->specs));
113 for (i = 0; i<sort_sequence->num_specs; i++)
114 sort_sequence->specs[i] = 0;
129 for (i = 0; sort_sequence->specs[i]; i++)
131 sort_sequence->num_specs = i;
141 sort_sequence, &sort_status);
149 int num_bases,
char **basenames,
151 zint *hits,
int *estimated_hit_count)
158 *estimated_hit_count = 0;
170 nmem_malloc(zebraSet->
nmem, num_bases *
sizeof(*zebraSet->
basenames));
171 for (i = 0; i<num_bases; i++)
172 zebraSet->
basenames[i] = nmem_strdup(zebraSet->
nmem, basenames[i]);
176 *hits = zebraSet->
hits;
178 *estimated_hit_count = 1;
189 const char *db,
const char *index_name,
194 s->
nmem = nmem_create();
221 if (!strcmp(s->
name, name))
240 nmem_destroy(s->
nmem);
250 s->
name = xstrdup(name);
287 if (!strcmp(s->
name, name))
291 NMEM nmem = nmem_create();
311 const char ***basenames,
int *num_bases)
327 for (; s; s = s->
next)
350 for (i = 0; i<num; i++)
351 statuses[i] = Z_DeleteStatus_resultSetDidNotExist;
358 for (i = 0; i<num; i++)
359 if (!strcmp(s->
name, names[i]))
362 statuses[i] = Z_DeleteStatus_success;
376 nmem_destroy(s->
nmem);
398 zint *pos = pos_small;
402 if (num > 10000 || num <= 0)
406 pos = xmalloc(
sizeof(*pos) * num);
408 for (i = 0; i<num; i++)
419 int num,
zint *positions)
426 size_t sysno_mem_index = 0;
440 for (i = 0; i<num; i++)
457 for (i = 0; i<num; i++)
469 for (i = 0; i<num; i++)
471 position = positions[i];
472 if (position > 0 && position <= sort_info->
num_entries)
475 " (sorted)", position);
482 for (i = 0; i<num; i++)
497 while (num_i < num && positions[num_i] <= position)
513 while (num_i < num &&
rset_read(rfd, &key, 0))
515 zint this_sys = key.
mem[sysno_mem_index];
516 if (this_sys != psysno)
530 if (position == positions[num_i])
532 sr[num_i].
sysno = psysno;
534 sr[num_i].
score = -1;
565 char *cmp_buf[],
char *tmp_cmp_buf[])
570 WRBUF w = wrbuf_alloc();
573 for (i = 0; i<num_criteria; i++)
575 char *this_entry_buf = tmp_cmp_buf[i];
578 if (criteria[i].ord[database_no] != -1)
581 criteria[i].ord[database_no]);
590 while (off != wrbuf_len(w))
592 size_t l = strlen(wrbuf_buf(w)+off);
593 assert(off < wrbuf_len(w));
598 || (criteria[i].relation ==
'A'
599 && strcmp(wrbuf_buf(w)+off, this_entry_buf) < 0)
600 || (criteria[i].relation ==
'D'
601 && strcmp(wrbuf_buf(w)+off, this_entry_buf) > 0)
604 memcpy(this_entry_buf, wrbuf_buf(w)+off, l);
605 this_entry_buf[l] =
'\0';
607 off += 1 + strlen(wrbuf_buf(w)+off);
613 yaz_log(
log_level_sort,
"criteria[i].ord is -1 so not reading from sort index");
621 for (j = 0; j<num_criteria; j++)
623 char *this_entry_buf = tmp_cmp_buf[j];
624 char *other_entry_buf =
626 if (criteria[j].numerical[database_no])
628 char this_entry_org[1024];
629 char other_entry_org[1024];
631 const char *index_type = criteria[j].
index_type;
636 diff = atof(this_entry_org) - atof(other_entry_org);
647 rel = memcmp(this_entry_buf, other_entry_buf,
657 if (criteria[j].relation ==
'A')
662 else if (criteria[j].relation ==
'D')
669 yaz_log(
log_level_sort,
"ok, we want to insert record at position %d",i);
672 yaz_log(
log_level_sort,
"sort_info->max_entries reached (%d) abort sort",j);
680 new_entry = sort_info->
entries[j];
685 for (k = 0; k<num_criteria; k++)
695 sort_info->
entries[i] = new_entry;
698 for (i = 0; i<num_criteria; i++)
701 char *this_entry_buf = tmp_cmp_buf[i];
704 new_entry->
sysno = sysno;
705 new_entry->
score = -1;
709 zint sysno,
int score,
int relation)
727 else if (relation ==
'A')
743 new_entry = sort_info->
entries[j];
749 sort_info->
entries[i] = new_entry;
758 ODR encode = odr_createmem(ODR_ENCODE);
759 ODR decode = odr_createmem(ODR_DECODE);
761 if (z_RPNQuery(encode, &src, 0, 0))
764 char *buf = odr_getbuf(encode, &len, 0);
768 odr_setbuf(decode, buf, len, 0);
769 z_RPNQuery(decode, &dst, 0, 0);
772 nmem_transfer(nmem, decode->mem);
780 Z_SortKeySpecList *dst = 0;
781 ODR encode = odr_createmem(ODR_ENCODE);
782 ODR decode = odr_createmem(ODR_DECODE);
784 if (z_SortKeySpecList(encode, &src, 0, 0))
787 char *buf = odr_getbuf(encode, &len, 0);
791 odr_setbuf(decode, buf, len, 0);
792 z_SortKeySpecList(decode, &dst, 0, 0);
795 nmem_transfer(nmem, decode->mem);
811 nset->
nmem = nmem_create();
816 for (i = 0; i<
rset->num_bases; i++)
827 int num_input_setnames,
const char **input_setnames,
828 const char *output_setname,
829 Z_SortKeySpecList *sort_sequence,
int *sort_status)
834 if (num_input_setnames == 0)
836 zebra_setError(zh, YAZ_BIB1_NO_RESULT_SET_NAME_SUPPLIED_ON_SORT, 0);
839 if (num_input_setnames > 1)
847 *input_setnames, output_setname);
861 if (strcmp(output_setname, input_setnames[0]))
870 Z_SortKeySpecList *sort_sequence,
887 size_t sysno_mem_index = 0;
899 terms = (
TERMID *) nmem_malloc(nmem,
sizeof(*terms)*n);
903 num_criteria = sort_sequence->num_specs;
907 for (i = 0; i < num_criteria; i++)
909 Z_SortKeySpec *sks = sort_sequence->specs[i];
912 sort_criteria[i].
ord = (
int *)
913 nmem_malloc(nmem,
sizeof(
int)*numbases);
915 nmem_malloc(nmem,
sizeof(
int)*numbases);
918 for (ib = 0; ib < numbases; ib++)
920 sort_criteria[i].
ord[ib] = -1;
924 if (sks->which == Z_SortKeySpec_missingValueData)
929 if (*sks->sortRelation == Z_SortKeySpec_ascending)
931 else if (*sks->sortRelation == Z_SortKeySpec_descending)
938 if (sks->sortElement->which == Z_SortElement_databaseSpecific)
943 else if (sks->sortElement->which != Z_SortElement_generic)
948 sk = sks->sortElement->u.generic;
951 case Z_SortKey_sortField:
953 for (ib = 0; ib < numbases; ib++)
957 sort_criteria[i].
ord[ib] =
961 if (sks->which != Z_SortKeySpec_null
962 && sort_criteria[i].
ord[ib] == -1)
965 YAZ_BIB1_CANNOT_SORT_ACCORDING_TO_SEQUENCE, 0);
970 case Z_SortKey_elementSpec:
972 zebra_setError(zh, YAZ_BIB1_CANNOT_SORT_ACCORDING_TO_SEQUENCE, 0);
974 case Z_SortKey_sortAttributes:
979 for (ib = 0; ib < numbases; ib++)
983 &sort_criteria[i].
ord[ib],
985 ZEBRA_OK && sks->which != Z_SortKeySpec_null)
998 zebra_setError(zh, YAZ_BIB1_CANNOT_SORT_ACCORDING_TO_SEQUENCE, 0);
1007 for (i = 0; i<num_criteria; i++)
1016 zint this_sys = key.
mem[sysno_mem_index];
1020 if (this_sys != psysno)
1022 int database_no = 0;
1036 if (numbases > 1 && termid->
ol)
1038 const char *this_db = 0;
1042 for (ib = 0; ib < numbases; ib++)
1043 if (!strcmp(this_db, zh->
basenames[ib]))
1048 yaz_log(YLOG_LOG,
"sysno=" ZINT_FORMAT " database_no=%d", this_sys,
1053 sort_criteria, num_criteria, psysno, cmp_buf,
1060 for (i = 0; i<num_criteria; i++)
1063 xfree(tmp_cmp_buf[i]);
1068 for (i = 0; i < numTerms; i++)
1071 *sort_status = Z_SortResponse_success;
1096 const char *rank_handler_name =
res_get_def(zh->
res,
"rank",
"rank-1");
1097 size_t sysno_mem_index = 0;
1100 sysno_mem_index = 1;
1109 terms = (
TERMID *) nmem_malloc(nmem,
sizeof(*terms)*n);
1115 yaz_log(YLOG_WARN,
"No such rank handler: %s", rank_handler_name);
1116 zebra_setError(zh, YAZ_BIB1_UNSUPP_SEARCH,
"Cannot find rank handler");
1126 nmem, terms, numTerms);
1128 zint pstaticrank = 0;
1132 zint this_sys = key.
mem[sysno_mem_index];
1138 if (this_sys != psysno)
1144 yaz_log(YLOG_LOG,
"Aborted search");
1157 score = (*rc->
calc)(handle, psysno, pstaticrank,
1165 pstaticrank = key.
mem[0];
1172 score = (*rc->
calc)(handle, psysno, pstaticrank, &stop_flag);
1177 (*rc->
end)(zh->
reg, handle);
1184 for (i = 0; i < numTerms; i++)
1235 zint *hits_array,
int *approx_array)
1241 (termid_array ? termid_array + no : 0),
1242 (hits_array ? hits_array + no : 0),
1243 (approx_array ? approx_array + no : 0));
1253 yaz_log(YLOG_LOG,
"rset=%p term=%s limit=" ZINT_FORMAT
1276 int no,
zint *count,
int *approx,
1277 char *termbuf,
size_t *termlen,
1278 const char **term_ref_id)
1284 if (no >= 0 && no < num_terms)
1286 TERMID *term_array = xmalloc(num_terms *
sizeof(*term_array));
1287 zint *hits_array = xmalloc(num_terms *
sizeof(*hits_array));
1288 int *approx_array = xmalloc(num_terms *
sizeof(*approx_array));
1291 hits_array, approx_array);
1294 *count = hits_array[no];
1296 *approx = approx_array[no];
1299 char *inbuf = term_array[no]->
name;
1300 size_t inleft = strlen(inbuf);
1301 size_t outleft = *termlen - 1;
1305 char *outbuf = termbuf;
1310 if (ret == (
size_t)(-1))
1316 *termlen = outbuf - termbuf;
1321 if (inleft > outleft)
1324 memcpy(termbuf, inbuf, *termlen);
1326 termbuf[*termlen] =
'\0';
1329 *term_ref_id = term_array[no]->
ref_id;
1333 xfree(approx_array);
1344 yaz_log(YLOG_DEBUG,
"zebra_get_hit_vector setname=%s zysno=" ZINT_FORMAT,
1351 NMEM nmem = nmem_create();
1353 RSET rsets[2], rset_comb;
1368 rsets[0] = rset_temp;
1380 for (ol = termid->
ol; ol; ol = ol->
next)
1397 const char **basenames,
int num_bases,
1399 zint *sysnos,
int *no_sysnos)
1402 int sysnos_offset = 0;
1407 if (sysnos_offset < *no_sysnos)
1413 for (i = 0; res ==
ZEBRA_OK && i < num_bases; i++)
1415 const char *database = basenames[i];
1418 const char *index_type =
"w";
1419 const char *use_string =
"_ALLRECORDS";
1423 index_type, use_string);
1430 ord_buf[ord_len] =
'\0';
1435 if (*info !=
sizeof(
ISAM_P))
1443 struct it_key key_until, key_found;
1447 memcpy(&isam_p, info+1,
sizeof(
ISAM_P));
1454 key_until.
mem[i++] = recid;
1455 key_until.
mem[i++] = 0;
1457 key_until.
mem[i++] = 0;
1458 key_until.
mem[i++] = 0;
1462 while (r && key_found.
mem[0] == recid)
1464 if (sysnos_offset < *no_sysnos)
1465 sysnos[sysnos_offset++] =
1466 key_found.
mem[key_found.
len-1];
1477 *no_sysnos = sysnos_offset;
1482 const char *setname,
1484 zint *sysnos,
int *no_sysnos)
1486 const char **basenames;
1495 recid, sysnos, no_sysnos);
1505 yaz_log(YLOG_DEBUG,
"count_set");
1513 if (key.
mem[0] != psysno)
1515 psysno = key.
mem[0];
const char * zebra_get_resource(ZebraHandle zh, const char *name, const char *defaultvalue)
ZEBRA_RES zebra_sort_get_ord(ZebraHandle zh, Z_SortAttributes *sortAttributes, int *ord, int *numerical)
char * dict_lookup(Dict dict, const char *p)
lookup item in dictionary
struct zebra_rank_class * ZebraRankClass
int zebra_term_untrans(ZebraHandle zh, const char *index_type, char *dst, const char *src)
void zebra_setError(ZebraHandle zh, int code, const char *addinfo)
ZEBRA_RES rpn_get_top_approx_limit(ZebraHandle zh, Z_RPNStructure *zs, zint *approx_limit)
struct zebra_set * ZebraSet
ZEBRA_RES rpn_search_top(ZebraHandle zh, Z_RPNStructure *zs, const Odr_oid *attributeSet, zint hits_limit, NMEM stream, NMEM rset_nmem, Z_SortKeySpecList *sort_sequence, int num_bases, const char **basenames, RSET *result_set)
struct rset_key_control * zebra_key_control_create(ZebraHandle zh)
ISAMB_PP isamb_pp_open(ISAMB isamb, ISAM_P pos, int scope)
int isamb_pp_forward(ISAMB_PP pp, void *buf, const void *untilbuf)
void isamb_pp_close(ISAMB_PP pp)
int isamb_pp_read(ISAMB_PP pp, void *buf)
void key_logdump_txt(int logmask, const void *p, const char *txt)
int key_SU_encode(int ch, char *out)
const char * res_get(Res r, const char *name)
const char * res_get_def(Res r, const char *name, const char *def)
void rset_delete(RSET rs)
Destructor RSETs.
void rset_set_hits_limit(RSET rs, zint l)
void ord_list_print(struct ord_list *list)
RSET rset_create_and(NMEM nmem, struct rset_key_control *kcontrol, int scope, int no_rsets, RSET *rsets)
#define rset_read(rfd, buf, term)
RSET rset_dup(RSET rs)
Duplicate an RSET.
#define rset_write(rfd, buf)
#define rset_getterms(ct, terms, maxterms, curterm)
RSET rset_create_temp(NMEM nmem, struct rset_key_control *kcontrol, int scope, const char *temp_path, TERMID term)
#define rset_open(rs, wflag)
void rset_close(RSFD rfd)
Closes a result set RFD handle.
void zebra_snippets_append(zebra_snippets *l, zint seqno, int ws, int ord, const char *term)
int zebra_sort_read(zebra_sort_index_t si, zint *section_id, WRBUF w)
reads sort entry
int zebra_sort_type(zebra_sort_index_t si, int type)
sets type for sort usage
#define SORT_IDX_ENTRYSIZE
void zebra_sort_sysno(zebra_sort_index_t si, zint sysno)
sets sort system number for read / add / delete
zint mem[IT_KEY_LEVEL_MAX]
void(* end)(struct zebra_register *reg, void *set_handle)
void *(* create)(ZebraHandle zh)
int(* calc)(void *set_handle, zint sysno, zint staticrank, int *stop_flag)
void(* destroy)(struct zebra_register *reg, void *class_handle)
void *(* begin)(struct zebra_register *reg, void *class_handle, RSET rset, NMEM nmem, TERMID *terms, int numterms)
void(* add)(void *set_handle, int seqno, TERMID term)
void(* dec)(struct rset_key_control *kc)
struct rank_control * control
struct zebra_rank_class * next
ZebraRankClass rank_classes
zebra_sort_index_t sort_index
struct zebra_register * reg
void * break_handler_data
int(* break_handler_func)(void *client_data)
yaz_iconv_t iconv_from_utf8
struct zset_sort_info * sort_info
struct zebra_set_term_entry * term_entries
Z_SortKeySpecList * sortSpec
struct zset_sort_entry ** entries
struct zset_sort_entry * all_entries
#define CAST_ZINT_TO_INT(x)
short ZEBRA_RES
Common return type for Zebra API.
int zebraExplain_curDatabase(ZebraExplainInfo zei, const char *database)
int zebraExplain_lookup_attr_str(ZebraExplainInfo zei, zinfo_index_category_t cat, const char *index_type, const char *str)
lookup ordinal from string index + index type
int zebraExplain_lookup_ord(ZebraExplainInfo zei, int ord, const char **index_type, const char **db, const char **string_index)
@ zinfo_index_category_alwaysmatches
@ zinfo_index_category_sort
ZEBRA_RES zebra_result_recid_to_sysno(ZebraHandle zh, const char *setname, zint recid, zint *sysnos, int *no_sysnos)
ZebraSet resultSetAdd(ZebraHandle zh, const char *name, int ov)
void zebraRankInstall(struct zebra_register *reg, struct rank_control *ctrl)
static int log_level_resultsets
void zebraRankDestroy(struct zebra_register *reg)
void resultSetDestroy(ZebraHandle zh, int num, char **names, int *statuses)
static void loglevels(void)
ZebraMetaRecord * zebra_meta_records_create_range(ZebraHandle zh, const char *name, zint start, int num)
RSET resultSetRef(ZebraHandle zh, const char *resultSetId)
ZebraMetaRecord * zebra_meta_records_create(ZebraHandle zh, const char *name, int num, zint *positions)
void zebra_meta_records_destroy(ZebraHandle zh, ZebraMetaRecord *records, int num)
#define ZSET_SORT_MAX_LEVEL
static ZEBRA_RES resultSetSearch(ZebraHandle zh, NMEM nmem, NMEM rset_nmem, Z_RPNQuery *rpn, ZebraSet sset)
ZEBRA_RES resultSetGetBaseNames(ZebraHandle zh, const char *setname, const char ***basenames, int *num_bases)
ZEBRA_RES resultSetRank(ZebraHandle zh, ZebraSet zebraSet, RSET rset, NMEM nmem)
void zebra_count_set(ZebraHandle zh, RSET rset, zint *count, zint approx_limit)
ZEBRA_RES resultSetSortSingle(ZebraHandle zh, NMEM nmem, ZebraSet sset, RSET rset, Z_SortKeySpecList *sort_sequence, int *sort_status)
ZEBRA_RES resultSetSort(ZebraHandle zh, NMEM nmem, int num_input_setnames, const char **input_setnames, const char *output_setname, Z_SortKeySpecList *sort_sequence, int *sort_status)
ZebraRankClass zebraRankLookup(ZebraHandle zh, const char *name)
void resultSetInsertRank(ZebraHandle zh, struct zset_sort_info *sort_info, zint sysno, int score, int relation)
void resultSetAddTerm(ZebraHandle zh, ZebraSet s, int reg_type, const char *db, const char *index_name, const char *term)
static Z_RPNQuery * copy_RPNQuery(Z_RPNQuery *src, NMEM nmem)
static Z_SortKeySpecList * copy_SortKeySpecList(Z_SortKeySpecList *src, NMEM nmem)
void resultSetInsertSort(ZebraHandle zh, ZebraSet sset, int database_no, struct sortKeyInfo *criteria, int num_criteria, zint sysno, char *cmp_buf[], char *tmp_cmp_buf[])
static int log_level_sort
ZEBRA_RES zebra_result_set_term_info(ZebraHandle zh, const char *setname, int no, zint *count, int *approx, char *termbuf, size_t *termlen, const char **term_ref_id)
returns information about a term assocated with a result set
static int log_level_searchterms
ZEBRA_RES resultSetAddRPN(ZebraHandle zh, NMEM m, Z_RPNQuery *rpn, int num_bases, char **basenames, const char *setname, zint *hits, int *estimated_hit_count)
ZebraSet resultSetClone(ZebraHandle zh, const char *setname, ZebraSet rset)
static int log_level_searchhits
ZEBRA_RES zebra_result_set_term_no(ZebraHandle zh, const char *setname, int *num_terms)
returns number of term info terms assocaited with result set
void resultSetInvalidate(ZebraHandle zh)
static int trav_rset_for_termids(RSET rset, TERMID *termid_array, zint *hits_array, int *approx_array)
ZebraSet resultSetGet(ZebraHandle zh, const char *name)
static ZEBRA_RES zebra_recid_to_sysno(ZebraHandle zh, const char **basenames, int num_bases, zint recid, zint *sysnos, int *no_sysnos)
ZEBRA_RES zebra_snippets_hit_vector(ZebraHandle zh, const char *setname, zint sysno, zebra_snippets *snippets)