X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzsets.c;h=5c02dd422acf07d246dd1ab39da8f05ea99cdcd5;hb=b2200ef6f97a9b967723643d27a4ffb388883f6d;hp=556e9179bc2dcbe7905078da73b2308fe94b2a74;hpb=4478d785b7769691261005c98063b98a5a5971b3;p=idzebra-moved-to-github.git diff --git a/index/zsets.c b/index/zsets.c index 556e917..5c02dd4 100644 --- a/index/zsets.c +++ b/index/zsets.c @@ -1,4 +1,4 @@ -/* $Id: zsets.c,v 1.110 2006-08-14 10:40:15 adam Exp $ +/* $Id: zsets.c,v 1.113 2006-11-30 10:33:19 adam Exp $ Copyright (C) 1995-2006 Index Data ApS @@ -83,7 +83,7 @@ static int log_level_searchhits=0; static int log_level_searchterms=0; static int log_level_resultsets=0; -static void loglevels() +static void loglevels(void) { if (log_level_set) return; @@ -94,6 +94,7 @@ static void loglevels() log_level_set = 1; } + ZEBRA_RES resultSetSearch(ZebraHandle zh, NMEM nmem, NMEM rset_nmem, Z_RPNQuery *rpn, ZebraSet sset) { @@ -115,6 +116,9 @@ ZEBRA_RES resultSetSearch(ZebraHandle zh, NMEM nmem, NMEM rset_nmem, sort_sequence->specs[i] = 0; attrset = oid_getentbyoid (rpn->attributeSetId); + + rpn_get_top_approx_limit(zh, rpn->RPNStructure, &sset->approx_limit); + res = rpn_search_top(zh, rpn->RPNStructure, attrset->value, nmem, rset_nmem, sort_sequence, @@ -534,12 +538,9 @@ void zebra_meta_records_destroy (ZebraHandle zh, ZebraMetaRecord *records, struct sortKeyInfo { int relation; -#if 0 - int attrUse; -#else int ord; -#endif int numerical; + int index_type; }; void resultSetInsertSort(ZebraHandle zh, ZebraSet sset, @@ -573,12 +574,22 @@ void resultSetInsertSort(ZebraHandle zh, ZebraSet sset, cmp_buf[j] + i * SORT_IDX_ENTRYSIZE; if (criteria[j].numerical) { - double diff = atof(this_entry_buf) - atof(other_entry_buf); - rel = 0; + char this_entry_org[1024]; + char other_entry_org[1024]; + double diff; + int index_type = criteria[j].index_type; + zebra_term_untrans(zh, index_type, this_entry_org, + this_entry_buf); + zebra_term_untrans(zh, index_type, other_entry_org, + other_entry_buf); + diff = atof(this_entry_org) - atof(other_entry_org); + if (diff > 0.0) rel = 1; else if (diff < 0.0) rel = -1; + else + rel = 0; } else { @@ -872,8 +883,7 @@ ZEBRA_RES resultSetSortSingle(ZebraHandle zh, NMEM nmem, sort_criteria[i].ord = zebraExplain_lookup_attr_str(zh->reg->zei, zinfo_index_category_sort, - 's', - sk->u.sortField); + -1, sk->u.sortField); if (sks->which != Z_SortKeySpec_null && sort_criteria[i].ord == -1) { @@ -890,12 +900,20 @@ ZEBRA_RES resultSetSortSingle(ZebraHandle zh, NMEM nmem, case Z_SortKey_sortAttributes: yaz_log(log_level_sort, "key %d is of type sortAttributes", i+1); 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; break; } + if (zebraExplain_lookup_ord(zh->reg->zei, sort_criteria[i].ord, + &sort_criteria[i].index_type, + 0, 0)) + { + zebra_setError(zh, YAZ_BIB1_CANNOT_SORT_ACCORDING_TO_SEQUENCE, 0); + return ZEBRA_FAIL; + } } /* allocate space for each cmpare buf + one extra for tmp comparison */ for (i = 0; i