X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=index%2Fzsets.c;h=a1687304db170f5f44215eaa81372f267a2de2bc;hp=225876c72a63050eee47be89617c75b7d4ef001d;hb=96e4c5479e111511f5df3531b6648931251b9e5d;hpb=b81eb4e30e5febe06da7118cd9a84a63604cb1e0 diff --git a/index/zsets.c b/index/zsets.c index 225876c..a168730 100644 --- a/index/zsets.c +++ b/index/zsets.c @@ -1,5 +1,5 @@ /* This file is part of the Zebra server. - Copyright (C) 1995-2008 Index Data + Copyright (C) 1994-2011 Index Data Zebra is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -18,6 +18,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#if HAVE_CONFIG_H +#include +#endif #include #include #ifdef WIN32 @@ -113,6 +116,7 @@ static ZEBRA_RES resultSetSearch(ZebraHandle zh, NMEM nmem, NMEM rset_nmem, rpn_get_top_approx_limit(zh, rpn->RPNStructure, &sset->approx_limit); res = rpn_search_top(zh, rpn->RPNStructure, rpn->attributeSetId, + sset->approx_limit, nmem, rset_nmem, sort_sequence, sset->num_bases, sset->basenames, @@ -125,7 +129,8 @@ static ZEBRA_RES resultSetSearch(ZebraHandle zh, NMEM nmem, NMEM rset_nmem, for (i = 0; sort_sequence->specs[i]; i++) ; sort_sequence->num_specs = i; - rset->hits_limit = sset->approx_limit; + rset_set_hits_limit(rset, sset->approx_limit); + if (!i) { res = resultSetRank(zh, sset, rset, rset_nmem); @@ -576,8 +581,11 @@ void resultSetInsertSort(ZebraHandle zh, ZebraSet sset, criteria[i].ord[database_no]); zebra_sort_type(zh->reg->sort_index, criteria[i].ord[database_no]); wrbuf_rewind(w); - if (zebra_sort_read(zh->reg->sort_index, w)) + if (zebra_sort_read(zh->reg->sort_index, 0, w)) { + /* consider each sort entry and take lowest/highest one + of the one as sorting key depending on whether sort is + ascending/descending */ int off = 0; while (off != wrbuf_len(w)) { @@ -586,27 +594,16 @@ void resultSetInsertSort(ZebraHandle zh, ZebraSet sset, if (l >= SORT_IDX_ENTRYSIZE) l = SORT_IDX_ENTRYSIZE-1; - if (off == 0) + if ( (off == 0) + || (criteria[i].relation == 'A' + && strcmp(wrbuf_buf(w)+off, this_entry_buf) < 0) + || (criteria[i].relation == 'D' + && strcmp(wrbuf_buf(w)+off, this_entry_buf) > 0) + ) { memcpy(this_entry_buf, wrbuf_buf(w)+off, l); this_entry_buf[l] = '\0'; } - else if (criteria[i].relation == 'A') - { - if (strcmp(wrbuf_buf(w)+off, this_entry_buf) < 0) - { - memcpy(this_entry_buf, wrbuf_buf(w)+off, l); - this_entry_buf[l] = '\0'; - } - } - else if (criteria[i].relation == 'D') - { - if (strcmp(wrbuf_buf(w)+off, this_entry_buf) > 0) - { - memcpy(this_entry_buf, wrbuf_buf(w)+off, l); - this_entry_buf[l] = '\0'; - } - } off += 1 + strlen(wrbuf_buf(w)+off); } } @@ -631,12 +628,6 @@ void resultSetInsertSort(ZebraHandle zh, ZebraSet sset, char this_entry_org[1024]; char other_entry_org[1024]; double diff; - /* when searching multiple databases, we use the index - type of the first one. So if they differ between - databases, we have a problem here we could store the - index_type for each database, but if we didn't find the - record in any sort index, then we still don't know to - which database it belongs. */ const char *index_type = criteria[j].index_type; zebra_term_untrans(zh, index_type, this_entry_org, this_entry_buf); @@ -917,7 +908,6 @@ ZEBRA_RES resultSetSortSingle(ZebraHandle zh, NMEM nmem, { Z_SortKeySpec *sks = sort_sequence->specs[i]; Z_SortKey *sk; - ZEBRA_RES res; sort_criteria[i].ord = (int *) nmem_malloc(nmem, sizeof(int)*numbases); @@ -989,13 +979,12 @@ ZEBRA_RES resultSetSortSingle(ZebraHandle zh, NMEM nmem, for (ib = 0; ib < numbases; ib++) { zebraExplain_curDatabase(zh->reg->zei, zh->basenames[ib]); - res = zebra_sort_get_ord(zh, sk->u.sortAttributes, - &sort_criteria[i].ord[ib], - &sort_criteria[i].numerical[ib]); + if (zebra_sort_get_ord(zh, sk->u.sortAttributes, + &sort_criteria[i].ord[ib], + &sort_criteria[i].numerical[ib]) != + ZEBRA_OK && sks->which != Z_SortKeySpec_null) + return ZEBRA_FAIL; } - - if (sks->which != Z_SortKeySpec_null && res != ZEBRA_OK) - return ZEBRA_FAIL; break; } /* right now we look up the index type based on the first database @@ -1158,6 +1147,11 @@ ZEBRA_RES resultSetRank(ZebraHandle zh, ZebraSet zebraSet, } if (rfd->counted_items > rset->hits_limit) stop_flag = 1; + if (stop_flag) + { + zebraSet->estimated_hit_count = 1; + break; + } if (psysno) { /* only if we did have a previous record */ score = (*rc->calc)(handle, psysno, pstaticrank, @@ -1166,12 +1160,6 @@ ZEBRA_RES resultSetRank(ZebraHandle zh, ZebraSet zebraSet, resultSetInsertRank(zh, sort_info, psysno, score, 'A'); count++; } - if (stop_flag) - { - zebraSet->estimated_hit_count = 1; - rset_set_hits_limit(rset, 0); - break; - } psysno = this_sys; if (zh->m_staticrank) pstaticrank = key.mem[0]; @@ -1537,6 +1525,7 @@ void zebra_count_set(ZebraHandle zh, RSET rset, zint *count, /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab