X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzsets.c;h=260f567018e1eb13e775fbdf709339d94abbf82e;hb=44082770642275dd993aa621d9dc5c5b0dc454d3;hp=b20041fcf0120230ff1070c446941ce1934b1cef;hpb=7a2d0f25682890bde5d8f2883d6020df2ed0b365;p=idzebra-moved-to-github.git diff --git a/index/zsets.c b/index/zsets.c index b20041f..260f567 100644 --- a/index/zsets.c +++ b/index/zsets.c @@ -1,4 +1,4 @@ -/* $Id: zsets.c,v 1.88 2005-06-07 14:53:39 adam Exp $ +/* $Id: zsets.c,v 1.91 2005-08-18 12:50:18 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -62,6 +62,7 @@ struct zebra_set { zint cache_position; /* last position */ RSFD cache_rfd; /* rfd (NULL if not existing) */ zint cache_psysno; /* sysno for last position */ + zint approx_limit; /* limit before we do approx */ }; struct zset_sort_entry { @@ -128,6 +129,7 @@ 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; if (!i) { res = resultSetRank (zh, sset, rset, rset_nmem); @@ -152,7 +154,7 @@ ZEBRA_RES resultSetAddRPN (ZebraHandle zh, NMEM m, Z_RPNQuery *rpn, zh->hits = 0; - zebraSet = resultSetAdd (zh, setname, 1); + zebraSet = resultSetAdd(zh, setname, 1); if (!zebraSet) return ZEBRA_FAIL; zebraSet->locked = 1; @@ -164,7 +166,7 @@ ZEBRA_RES resultSetAddRPN (ZebraHandle zh, NMEM m, Z_RPNQuery *rpn, zebraSet->basenames = nmem_malloc (zebraSet->nmem, num_bases * sizeof(*zebraSet->basenames)); for (i = 0; ibasenames[i] = nmem_strdup (zebraSet->nmem, basenames[i]); + zebraSet->basenames[i] = nmem_strdup(zebraSet->nmem, basenames[i]); res = resultSetSearch(zh, zebraSet->nmem, zebraSet->rset_nmem, rpn, zebraSet); @@ -205,7 +207,7 @@ void resultSetAddTerm (ZebraHandle zh, ZebraSet s, int reg_type, (s->hits)++; } -ZebraSet resultSetAdd (ZebraHandle zh, const char *name, int ov) +ZebraSet resultSetAdd(ZebraHandle zh, const char *name, int ov) { ZebraSet s; int i; @@ -267,10 +269,11 @@ ZebraSet resultSetAdd (ZebraHandle zh, const char *name, int ov) s->rpn = 0; s->cache_position = 0; s->cache_rfd = 0; + s->approx_limit = zh->approx_limit; return s; } -ZebraSet resultSetGet (ZebraHandle zh, const char *name) +ZebraSet resultSetGet(ZebraHandle zh, const char *name) { ZebraSet s; @@ -313,7 +316,7 @@ void resultSetInvalidate (ZebraHandle zh) } } -void resultSetDestroy (ZebraHandle zh, int num, char **names,int *statuses) +void resultSetDestroy(ZebraHandle zh, int num, char **names,int *statuses) { ZebraSet * ss = &zh->sets; int i; @@ -395,6 +398,10 @@ ZebraMetaRecord *zebra_meta_records_create(ZebraHandle zh, const char *name, RSET rset; int i; struct zset_sort_info *sort_info; + size_t sysno_mem_index = 0; + + if (zh->m_staticrank) + sysno_mem_index = 1; if (!log_level_set) loglevels(); @@ -480,7 +487,7 @@ ZebraMetaRecord *zebra_meta_records_create(ZebraHandle zh, const char *name, } while (num_i < num && rset_read (rfd, &key, 0)) { - zint this_sys = key.mem[0]; + zint this_sys = key.mem[sysno_mem_index]; if (this_sys != psysno) { psysno = this_sys; @@ -708,6 +715,11 @@ ZEBRA_RES resultSetSortSingle(ZebraHandle zh, NMEM nmem, TERMID termid; TERMID *terms; int numTerms = 0; + size_t sysno_mem_index = 0; + + if (zh->m_staticrank) + sysno_mem_index = 1; + assert(nmem); /* compiler shut up about unused param */ sset->sort_info->num_entries = 0; @@ -782,7 +794,7 @@ ZEBRA_RES resultSetSortSingle(ZebraHandle zh, NMEM nmem, rfd = rset_open (rset, RSETF_READ); while (rset_read (rfd, &key, &termid)) { - zint this_sys = key.mem[0]; + zint this_sys = key.mem[sysno_mem_index]; if (log_level_searchhits) key_logdump_txt(log_level_searchhits, &key, termid->name); kno++; @@ -835,6 +847,10 @@ ZEBRA_RES resultSetRank(ZebraHandle zh, ZebraSet zebraSet, rset_getterms(rset, 0, 0, &n); terms = (TERMID *) nmem_malloc(nmem, sizeof(*terms)*n); rset_getterms(rset, terms, n, &numTerms); + size_t sysno_mem_index = 0; + + if (zh->m_staticrank) + sysno_mem_index = 1; rank_class = zebraRankLookup(zh, rank_handler_name); if (!rank_class) @@ -848,6 +864,7 @@ ZEBRA_RES resultSetRank(ZebraHandle zh, ZebraSet zebraSet, RSFD rfd = rset_open(rset, RSETF_READ); struct rank_control *rc = rank_class->control; double score; + zint count = 0; void *handle = (*rc->begin) (zh->reg, rank_class->class_handle, rset, nmem, @@ -855,19 +872,20 @@ ZEBRA_RES resultSetRank(ZebraHandle zh, ZebraSet zebraSet, zint psysno = 0; while (rset_read(rfd, &key, &termid)) { - zint this_sys = key.mem[0]; + zint this_sys = key.mem[sysno_mem_index]; zint seqno = key.mem[key.len-1]; kno++; if (log_level_searchhits) key_logdump_txt(log_level_searchhits, &key, termid->name); if (this_sys != psysno) { - if (rfd->counted_items >= rset->hits_limit) + if (rfd->counted_items > rset->hits_limit) break; if (psysno) { score = (*rc->calc) (handle, psysno); resultSetInsertRank (zh, sort_info, psysno, score, 'A'); + count++; } psysno = this_sys; } @@ -877,6 +895,7 @@ ZEBRA_RES resultSetRank(ZebraHandle zh, ZebraSet zebraSet, { score = (*rc->calc)(handle, psysno); resultSetInsertRank(zh, sort_info, psysno, score, 'A'); + count++; } (*rc->end) (zh->reg, handle); rset_close (rfd); @@ -954,8 +973,9 @@ static int trav_rset_for_termids(RSET rset, TERMID *termid_array, if (approx_array) approx_array[no] = rset->hits_approx; #if 0 - yaz_log(YLOG_LOG, "rset=%p term=%s count=" ZINT_FORMAT, - rset, rset->term->name, rset->hits_count); + yaz_log(YLOG_LOG, "rset=%p term=%s limit=" ZINT_FORMAT + " count=" ZINT_FORMAT, + rset, rset->term->name, rset->hits_limit, rset->hits_count); #endif no++; } @@ -977,7 +997,8 @@ ZEBRA_RES zebra_result_set_term_no(ZebraHandle zh, const char *setname, ZEBRA_RES zebra_result_set_term_info(ZebraHandle zh, const char *setname, int no, zint *count, int *approx, - char *termbuf, size_t *termlen) + char *termbuf, size_t *termlen, + const char **term_ref_id) { ZebraSet sset = resultSetGet(zh, setname); if (sset) @@ -1023,6 +1044,8 @@ ZEBRA_RES zebra_result_set_term_info(ZebraHandle zh, const char *setname, } termbuf[*termlen] = '\0'; } + if (term_ref_id) + *term_ref_id = term_array[no]->ref_id; xfree(term_array); xfree(hits_array);