X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzsets.c;h=a8d8ce9cef7df6378759a142337b1116ef9c0d30;hb=0af00389d43835ef54928dc22f7d34ae30f3c723;hp=ecbee31f24f317b44012fc5d1917738ad16b2efc;hpb=d8b7f92dc036c81ed51a5f22b8c5bc9a5ae74487;p=idzebra-moved-to-github.git diff --git a/index/zsets.c b/index/zsets.c index ecbee31..a8d8ce9 100644 --- a/index/zsets.c +++ b/index/zsets.c @@ -1,5 +1,5 @@ -/* $Id: zsets.c,v 1.97 2006-01-12 13:21:45 adam Exp $ - Copyright (C) 1995-2005 +/* $Id: zsets.c,v 1.107 2006-06-07 10:14:42 adam Exp $ + Copyright (C) 1995-2006 Index Data ApS This file is part of the Zebra server. @@ -30,6 +30,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #endif #include "index.h" +#include "rank.h" #include #include @@ -39,8 +40,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA struct zebra_set_term_entry { int reg_type; char *db; - int set; - int use; + char *index_name; char *term; }; @@ -53,6 +53,7 @@ struct zebra_set { int num_bases; char **basenames; Z_RPNQuery *rpn; + Z_SortKeySpecList *sortSpec; struct zset_sort_info *sort_info; struct zebra_set_term_entry *term_entries; int term_entries_max; @@ -179,9 +180,9 @@ ZEBRA_RES resultSetAddRPN (ZebraHandle zh, NMEM m, Z_RPNQuery *rpn, return res; } -void resultSetAddTerm (ZebraHandle zh, ZebraSet s, int reg_type, - const char *db, int set, - int use, const char *term) +void resultSetAddTerm(ZebraHandle zh, ZebraSet s, int reg_type, + const char *db, const char *index_name, + const char *term) { assert(zh); /* compiler shut up */ if (!s->nmem) @@ -200,9 +201,8 @@ void resultSetAddTerm (ZebraHandle zh, ZebraSet s, int reg_type, { s->term_entries[s->hits].reg_type = reg_type; s->term_entries[s->hits].db = nmem_strdup (s->nmem, db); - s->term_entries[s->hits].set = set; - s->term_entries[s->hits].use = use; - s->term_entries[s->hits].term = nmem_strdup (s->nmem, term); + s->term_entries[s->hits].index_name = nmem_strdup(s->nmem, index_name); + s->term_entries[s->hits].term = nmem_strdup(s->nmem, term); } (s->hits)++; } @@ -267,6 +267,7 @@ ZebraSet resultSetAdd(ZebraHandle zh, const char *name, int ov) s->rset_nmem = 0; s->nmem = 0; s->rpn = 0; + s->sortSpec = 0; s->cache_position = 0; s->cache_rfd = 0; s->approx_limit = zh->approx_limit; @@ -287,6 +288,13 @@ ZebraSet resultSetGet(ZebraHandle zh, const char *name) if (!s->rset_nmem) s->rset_nmem=nmem_create(); resultSetSearch(zh, nmem, s->rset_nmem, s->rpn, s); + if (s->rset && s->sortSpec) + { + int sort_status; + yaz_log(log_level_resultsets, "resort %s", name); + resultSetSortSingle (zh, nmem, s, s->rset, s->sortSpec, + &sort_status); + } nmem_destroy (nmem); } return s; @@ -528,7 +536,11 @@ void zebra_meta_records_destroy (ZebraHandle zh, ZebraMetaRecord *records, struct sortKeyInfo { int relation; +#if 0 int attrUse; +#else + int ord; +#endif int numerical; }; @@ -544,8 +556,12 @@ void resultSetInsertSort (ZebraHandle zh, ZebraSet sset, sortIdx_sysno (zh->reg->sortIdx, sysno); for (i = 0; ireg->sortIdx, criteria[i].attrUse); - sortIdx_read (zh->reg->sortIdx, this_entry.buf[i]); + memset(this_entry.buf[i], '\0', SORT_IDX_ENTRYSIZE); + if (criteria[i].ord != -1) + { + sortIdx_type (zh->reg->sortIdx, criteria[i].ord); + sortIdx_read (zh->reg->sortIdx, this_entry.buf[i]); + } } i = sort_info->num_entries; while (--i >= 0) @@ -566,7 +582,7 @@ void resultSetInsertSort (ZebraHandle zh, ZebraSet sset, else { rel = memcmp (this_entry.buf[j], sort_info->entries[i]->buf[j], - SORT_IDX_ENTRYSIZE); + SORT_IDX_ENTRYSIZE); } if (rel) break; @@ -654,13 +670,13 @@ void resultSetInsertRank (ZebraHandle zh, struct zset_sort_info *sort_info, new_entry->score = score; } -static Z_RPNQuery *copy_RPNQuery(Z_RPNQuery *src_rpn, NMEM dst) +static Z_RPNQuery *copy_RPNQuery(Z_RPNQuery *src, NMEM nmem) { - Z_RPNQuery *dst_rpn = 0; + Z_RPNQuery *dst = 0; ODR encode = odr_createmem(ODR_ENCODE); ODR decode = odr_createmem(ODR_DECODE); - if (z_RPNQuery(encode, &src_rpn, 0, 0)) + if (z_RPNQuery(encode, &src, 0, 0)) { int len; char *buf = odr_getbuf(encode, &len, 0); @@ -668,13 +684,36 @@ static Z_RPNQuery *copy_RPNQuery(Z_RPNQuery *src_rpn, NMEM dst) if (buf) { odr_setbuf(decode, buf, len, 0); - z_RPNQuery(decode, &dst_rpn, 0, 0); + z_RPNQuery(decode, &dst, 0, 0); } } - nmem_transfer(dst, decode->mem); + nmem_transfer(nmem, decode->mem); odr_destroy(encode); odr_destroy(decode); - return dst_rpn; + return dst; +} + +static Z_SortKeySpecList *copy_SortKeySpecList(Z_SortKeySpecList *src, NMEM nmem) +{ + Z_SortKeySpecList *dst = 0; + ODR encode = odr_createmem(ODR_ENCODE); + ODR decode = odr_createmem(ODR_DECODE); + + if (z_SortKeySpecList(encode, &src, 0, 0)) + { + int len; + char *buf = odr_getbuf(encode, &len, 0); + + if (buf) + { + odr_setbuf(decode, buf, len, 0); + z_SortKeySpecList(decode, &dst, 0, 0); + } + } + nmem_transfer(nmem, decode->mem); + odr_destroy(encode); + odr_destroy(decode); + return dst; } ZebraSet resultSetClone(ZebraHandle zh, const char *setname, @@ -739,6 +778,7 @@ ZEBRA_RES resultSetSort(ZebraHandle zh, NMEM nmem, } if (strcmp (output_setname, input_setnames[0])) sset = resultSetClone(zh, output_setname, sset); + sset->sortSpec = copy_SortKeySpecList(sort_sequence, sset->nmem); return resultSetSortSingle (zh, nmem, sset, rset, sort_sequence, sort_status); } @@ -764,7 +804,6 @@ ZEBRA_RES resultSetSortSingle(ZebraHandle zh, NMEM nmem, if (zh->m_staticrank) sysno_mem_index = 1; - assert(nmem); /* compiler shut up about unused param */ sset->sort_info->num_entries = 0; @@ -780,7 +819,16 @@ ZEBRA_RES resultSetSortSingle(ZebraHandle zh, NMEM nmem, { Z_SortKeySpec *sks = sort_sequence->specs[i]; Z_SortKey *sk; + ZEBRA_RES res; + + sort_criteria[i].ord = -1; + sort_criteria[i].numerical = 0; + if (sks->which == Z_SortKeySpec_missingValueData) + { + zebra_setError(zh, YAZ_BIB1_UNSUPP_MISSING_DATA_ACTION, 0); + return ZEBRA_FAIL; + } if (*sks->sortRelation == Z_SortKeySpec_ascending) sort_criteria[i].relation = 'A'; else if (*sks->sortRelation == Z_SortKeySpec_descending) @@ -806,8 +854,18 @@ ZEBRA_RES resultSetSortSingle(ZebraHandle zh, NMEM nmem, case Z_SortKey_sortField: yaz_log(log_level_sort, "key %d is of type sortField", i+1); - zebra_setError(zh, YAZ_BIB1_CANNOT_SORT_ACCORDING_TO_SEQUENCE, 0); - return ZEBRA_FAIL; + sort_criteria[i].numerical = 0; + sort_criteria[i].ord = + zebraExplain_lookup_attr_str(zh->reg->zei, 's', + sk->u.sortField); + if (sks->which != Z_SortKeySpec_null + && sort_criteria[i].ord == -1) + { + zebra_setError(zh, + YAZ_BIB1_CANNOT_SORT_ACCORDING_TO_SEQUENCE, 0); + return ZEBRA_FAIL; + } + break; case Z_SortKey_elementSpec: yaz_log(log_level_sort, "key %d is of type elementSpec", i+1); @@ -815,23 +873,11 @@ ZEBRA_RES resultSetSortSingle(ZebraHandle zh, NMEM nmem, return ZEBRA_FAIL; case Z_SortKey_sortAttributes: yaz_log(log_level_sort, "key %d is of type sortAttributes", i+1); - sort_criteria[i].attrUse = - zebra_maps_sort (zh->reg->zebra_maps, - sk->u.sortAttributes, - &sort_criteria[i].numerical); - yaz_log(log_level_sort, "use value = %d", sort_criteria[i].attrUse); - if (sort_criteria[i].attrUse == -1) - { - zebra_setError( - zh, YAZ_BIB1_USE_ATTRIBUTE_REQUIRED_BUT_NOT_SUPPLIED, 0); + res = zebra_sort_get_ord(zh, sk->u.sortAttributes, + &sort_criteria[i].ord, + &sort_criteria[i].numerical); + if (sks->which != Z_SortKeySpec_null && res != ZEBRA_OK) return ZEBRA_FAIL; - } - if (sortIdx_type (zh->reg->sortIdx, sort_criteria[i].attrUse)) - { - zebra_setError( - zh, YAZ_BIB1_CANNOT_SORT_ACCORDING_TO_SEQUENCE, 0); - return ZEBRA_FAIL; - } break; } } @@ -908,7 +954,7 @@ ZEBRA_RES resultSetRank(ZebraHandle zh, ZebraSet zebraSet, { RSFD rfd = rset_open(rset, RSETF_READ); struct rank_control *rc = rank_class->control; - double score; + int score; zint count = 0; void *handle = @@ -1126,8 +1172,8 @@ ZEBRA_RES zebra_snippets_hit_vector(ZebraHandle zh, const char *setname, NMEM nmem = nmem_create(); struct it_key key; RSET rsets[2], rset_comb; - RSET rset_temp = rstemp_create(nmem, kc, kc->scope, - res_get (zh->res, "setTmpDir"),0 ); + RSET rset_temp = rset_create_temp(nmem, kc, kc->scope, + res_get (zh->res, "setTmpDir"),0 ); TERMID termid; RSFD rsfd = rset_open(rset_temp, RSETF_WRITE); @@ -1143,7 +1189,7 @@ ZEBRA_RES zebra_snippets_hit_vector(ZebraHandle zh, const char *setname, rsets[0] = rset_temp; rsets[1] = rset_dup(sset->rset); - rset_comb = rsmulti_and_create(nmem, kc, kc->scope, 2, rsets); + rset_comb = rset_create_and(nmem, kc, kc->scope, 2, rsets); rsfd = rset_open(rset_comb, RSETF_READ); @@ -1168,3 +1214,11 @@ ZEBRA_RES zebra_snippets_hit_vector(ZebraHandle zh, const char *setname, return ZEBRA_OK; } +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +