X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=index%2Fzsets.c;h=65e527268aeb69f16e0ec3f37a76035c019bbe44;hb=f7a3769dede0071696bdcc13ae2ee1efe6d52d96;hp=1b76097b9d96e0970204962fce83b94fca5c3ac3;hpb=11de0965b256736f01e55b17a603eb9ebad5ec12;p=idzebra-moved-to-github.git diff --git a/index/zsets.c b/index/zsets.c index 1b76097..65e5272 100644 --- a/index/zsets.c +++ b/index/zsets.c @@ -1,5 +1,5 @@ -/* $Id: zsets.c,v 1.95 2005-08-26 10:13:31 adam Exp $ - Copyright (C) 1995-2005 +/* $Id: zsets.c,v 1.102 2006-05-18 12:03:05 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 @@ -53,6 +54,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; @@ -267,6 +269,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 +290,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 +538,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,7 +558,7 @@ void resultSetInsertSort (ZebraHandle zh, ZebraSet sset, sortIdx_sysno (zh->reg->sortIdx, sysno); for (i = 0; ireg->sortIdx, criteria[i].attrUse); + sortIdx_type (zh->reg->sortIdx, criteria[i].ord); sortIdx_read (zh->reg->sortIdx, this_entry.buf[i]); } i = sort_info->num_entries; @@ -654,6 +668,77 @@ void resultSetInsertRank (ZebraHandle zh, struct zset_sort_info *sort_info, new_entry->score = score; } +static Z_RPNQuery *copy_RPNQuery(Z_RPNQuery *src, NMEM nmem) +{ + Z_RPNQuery *dst = 0; + ODR encode = odr_createmem(ODR_ENCODE); + ODR decode = odr_createmem(ODR_DECODE); + + if (z_RPNQuery(encode, &src, 0, 0)) + { + int len; + char *buf = odr_getbuf(encode, &len, 0); + + if (buf) + { + odr_setbuf(decode, buf, len, 0); + z_RPNQuery(decode, &dst, 0, 0); + } + } + nmem_transfer(nmem, decode->mem); + odr_destroy(encode); + odr_destroy(decode); + 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, + ZebraSet rset) +{ + ZebraSet nset; + int i; + + nset = resultSetAdd(zh, setname, 1); + if (!nset) + return 0; + + nset->nmem = nmem_create(); + + nset->num_bases = rset->num_bases; + nset->basenames = + nmem_malloc (nset->nmem, nset->num_bases * sizeof(*rset->basenames)); + for (i = 0; inum_bases; i++) + nset->basenames[i] = nmem_strdup(nset->nmem, rset->basenames[i]); + + if (rset->rset) + nset->rset = rset_dup(rset->rset); + if (rset->rpn) + nset->rpn = copy_RPNQuery(rset->rpn, nset->nmem); + return nset; +} + ZEBRA_RES resultSetSort(ZebraHandle zh, NMEM nmem, int num_input_setnames, const char **input_setnames, const char *output_setname, @@ -690,11 +775,8 @@ ZEBRA_RES resultSetSort(ZebraHandle zh, NMEM nmem, return ZEBRA_FAIL; } if (strcmp (output_setname, input_setnames[0])) - { - rset = rset_dup (rset); - sset = resultSetAdd (zh, output_setname, 1); - sset->rset = rset; - } + sset = resultSetClone(zh, output_setname, sset); + sset->sortSpec = copy_SortKeySpecList(sort_sequence, sset->nmem); return resultSetSortSingle (zh, nmem, sset, rset, sort_sequence, sort_status); } @@ -771,22 +853,28 @@ 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); - return ZEBRA_FAIL; - } - if (sortIdx_type (zh->reg->sortIdx, sort_criteria[i].attrUse)) + if (1) { - zebra_setError( - zh, YAZ_BIB1_CANNOT_SORT_ACCORDING_TO_SEQUENCE, 0); - return ZEBRA_FAIL; + int ord; + int use = zebra_maps_sort(zh->reg->zebra_maps, + sk->u.sortAttributes, + &sort_criteria[i].numerical); + yaz_log(log_level_sort, "use value = %d", use); + if (use == -1) + { + zebra_setError( + zh, YAZ_BIB1_USE_ATTRIBUTE_REQUIRED_BUT_NOT_SUPPLIED, 0); + return ZEBRA_FAIL; + } + ord = zebraExplain_lookup_attr_su_any_index(zh->reg->zei, + VAL_IDXPATH, use); + if (ord == -1) + { + zebra_setError( + zh, YAZ_BIB1_CANNOT_SORT_ACCORDING_TO_SEQUENCE, 0); + return ZEBRA_FAIL; + } + sort_criteria[i].ord = ord; } break; } @@ -1119,7 +1207,16 @@ ZEBRA_RES zebra_snippets_hit_vector(ZebraHandle zh, const char *setname, rset_delete(rset_comb); nmem_destroy(nmem); + kc->dec(kc); } return ZEBRA_OK; } +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +