From 2cb08a89ee65d8ae2646b91dcf27bc3883759691 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Tue, 24 May 2005 11:35:41 +0000 Subject: [PATCH] Added support for temr hit counts. This was not in place for earlier 1.4 versions, but is present in the 1.3 series. Bug #124. --- NEWS | 3 + include/idzebra/api.h | 14 ++- include/rset.h | 47 ++++++---- index/trunc.c | 15 ++-- index/zrpn.c | 31 ++++--- index/zserver.c | 20 ++--- index/zsets.c | 236 ++++++++++++++++++++++++++++++++----------------- rset/rsbetween.c | 81 ++++++++--------- rset/rsbool.c | 12 +-- rset/rset.c | 202 +++++++++++++++++++++++++++++------------- rset/rsisamb.c | 5 +- rset/rsisamc.c | 9 +- rset/rsisams.c | 9 +- rset/rsmultiandor.c | 142 ++++++++++++++--------------- rset/rsnull.c | 16 ++-- rset/rsprox.c | 67 ++++++-------- rset/rstemp.c | 8 +- test/api/t10.c | 60 ++++++------- test/api/t9.c | 6 +- 19 files changed, 566 insertions(+), 417 deletions(-) diff --git a/NEWS b/NEWS index 35e328f..1952f13 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,6 @@ +Added support for term hit counts. This was not in place for earlier +1.4 versions, but is present in the 1.3 series. Bug #124. + Implemented the 'equivalent' directive for .chr-files. Added zebra_get_bfs to get BFile handle for session. diff --git a/include/idzebra/api.h b/include/idzebra/api.h index 9cbb6fa..1886b5b 100644 --- a/include/idzebra/api.h +++ b/include/idzebra/api.h @@ -1,4 +1,4 @@ -/* $Id: api.h,v 1.23 2005-05-09 10:16:12 adam Exp $ +/* $Id: api.h,v 1.24 2005-05-24 11:35:41 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -237,6 +237,18 @@ int zebra_deleteResultSet(ZebraHandle zh, int function, int num_setnames, char **setnames, int *statuses); + + +YAZ_EXPORT +ZEBRA_RES zebra_result_set_term_no(ZebraHandle zh, const char *setname, + int *num_terms); + +YAZ_EXPORT +ZEBRA_RES zebra_result_set_term_info(ZebraHandle zh, const char *setname, + int no, zint *count, int *approx, + char *termbuf, size_t *termlen); + + /** \fn ZEBRA_RES zebra_scan(ZebraHandle zh, ODR stream, \ Z_AttributesPlusTerm *zapt, oid_value attributeset, \ diff --git a/include/rset.h b/include/rset.h index f9ea485..23f7d0d 100644 --- a/include/rset.h +++ b/include/rset.h @@ -1,4 +1,4 @@ -/* $Id: rset.h,v 1.51 2005-05-03 09:11:34 adam Exp $ +/* $Id: rset.h,v 1.52 2005-05-24 11:35:41 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -62,6 +62,8 @@ struct rsfd { /* the stuff common to all rsfd's. */ RSET rset; /* ptr to the rset this FD is opened to */ void *priv; /* private parameters for this type */ RSFD next; /* to keep lists of used/free rsfd's */ + zint counted_items; + char *counted_buf; }; @@ -98,6 +100,9 @@ struct rset_control int rset_default_forward(RSFD rfd, void *buf, TERMID *term, const void *untilbuf); +/** rset_default_read implements a generic read */ +int rset_default_read(RSFD rfd, void *buf, TERMID *term); + /** rset_get_no_terms is a getterms function for those that don't have any */ void rset_get_no_terms(RSET ct, TERMID *terms, int maxterms, int *curterm); @@ -140,15 +145,21 @@ typedef struct rset { const struct rset_control *control; struct rset_key_control *keycontrol; - int count; /* reference count */ - void *priv; /* stuff private to the given type of rset */ - NMEM nmem; /* nibble memory for various allocs */ - char my_nmem; /* Should the nmem be destroyed with the rset? */ - /* 1 if created with it, 0 if passed from above */ + int refcount; /* reference count */ + void *priv; /* stuff private to the given type of rset */ + NMEM nmem; /* nibble memory for various allocs */ + char my_nmem; /* Should the nmem be destroyed with the rset? */ + /* 1 if created with it, 0 if passed from above */ RSFD free_list; /* all rfd's allocated but not currently in use */ RSFD use_list; /* all rfd's in use */ - int scope; /* On what level do we count hits and compare them? */ - TERMID term; /* the term thing for ranking etc */ + int scope; /* On what level do we count hits and compare them? */ + TERMID term; /* the term thing for ranking etc */ + int no_children; + RSET *children; + zint hits_limit; + zint hits_count; + zint hits_round; + int hits_approx; } rset; /* rset is a "virtual base class", which will never exist on its own * all instances are rsets of some specific type, like rsisamb, or rsbool @@ -168,30 +179,27 @@ typedef struct rset */ RSFD rfd_create_base(RSET rs); -void rfd_delete_base(RSFD rfd); int rfd_is_last(RSFD rfd); RSET rset_create_base(const struct rset_control *sel, NMEM nmem, struct rset_key_control *kcontrol, int scope, - TERMID term); + TERMID term, + int no_children, RSET *children); void rset_delete(RSET rs); RSET rset_dup (RSET rs); - +void rset_close(RSFD rfd); #define RSETF_READ 0 #define RSETF_WRITE 1 /* RSFD rset_open(RSET rs, int wflag); */ #define rset_open(rs, wflag) (*(rs)->control->f_open)((rs), (wflag)) -/* void rset_close(RSFD rfd); */ -#define rset_close(rfd) (*(rfd)->rset->control->f_close)(rfd) - /* int rset_forward(RSFD rfd, void *buf, TERMID term, void *untilbuf); */ #define rset_forward(rfd, buf, term, untilbuf) \ - (*(rfd)->rset->control->f_forward)((rfd),(buf),(term),(untilbuf)) + rset_default_forward((rfd), (buf), (term), (untilbuf)) /* void rset_getterms(RSET ct, TERMID *terms, int maxterms, int *curterm); */ #define rset_getterms(ct, terms, maxterms, curterm) \ @@ -202,8 +210,7 @@ RSET rset_dup (RSET rs); (*(rfd)->rset->control->f_pos)((rfd),(cur),(tot)) /* int rset_read(RSFD rfd, void *buf, TERMID term); */ -#define rset_read(rfd, buf, term) \ - (*(rfd)->rset->control->f_read)((rfd), (buf), (term)) +#define rset_read(rfd, buf, term) rset_default_read((rfd), (buf), (term)) /* int rset_write(RSFD rfd, const void *buf); */ #define rset_write(rfd, buf) (*(rfd)->rset->control->f_write)((rfd), (buf)) @@ -217,7 +224,7 @@ zint rset_count(RSET rs); RSET rstemp_create(NMEM nmem, struct rset_key_control *kcontrol, int scope, const char *temp_path, TERMID term); -RSET rsnull_create(NMEM nmem, struct rset_key_control *kcontrol); +RSET rsnull_create(NMEM nmem, struct rset_key_control *kcontrol, TERMID term); RSET rsbool_create_and(NMEM nmem, struct rset_key_control *kcontrol, int scope, RSET rset_l, RSET rset_r); @@ -233,7 +240,7 @@ RSET rsbetween_create(NMEM nmem, struct rset_key_control *kcontrol, RSET rset_attr); RSET rsmulti_or_create(NMEM nmem, struct rset_key_control *kcontrol, - int scope, int no_rsets, RSET* rsets); + int scope, TERMID termid, int no_rsets, RSET* rsets); RSET rsmulti_and_create(NMEM nmem, struct rset_key_control *kcontrol, int scope, int no_rsets, RSET* rsets); @@ -251,6 +258,8 @@ RSET rsisamc_create(NMEM nmem, struct rset_key_control *kcontrol, RSET rsisams_create(NMEM nmem, struct rset_key_control *kcontrol, int scope, ISAMS is, ISAM_P pos, TERMID term); +void rset_visit(RSET rset, int level); + YAZ_END_CDECL #endif diff --git a/index/trunc.c b/index/trunc.c index 891f9a7..e432a32 100644 --- a/index/trunc.c +++ b/index/trunc.c @@ -1,4 +1,4 @@ -/* $Id: trunc.c,v 1.57 2005-05-03 09:11:34 adam Exp $ +/* $Id: trunc.c,v 1.58 2005-05-24 11:35:42 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -405,10 +405,10 @@ RSET rset_trunc(ZebraHandle zi, ISAM_P *isam_p, int no, RSET result; int trunc_chunk; + termid = rset_term_create(term, length, flags, term_type, rset_nmem); if (no < 1) - return rsnull_create(rset_nmem, kctrl); + return rsnull_create(rset_nmem, kctrl, termid); - termid = rset_term_create(term, length, flags, term_type, rset_nmem); if (zi->reg->isams) { if (no == 1) @@ -436,8 +436,11 @@ RSET rset_trunc(ZebraHandle zi, ISAM_P *isam_p, int no, int i; for (i = 0; ireg->isamb, isam_p[i], termid); - r = rsmulti_or_create( rset_nmem, kctrl, scope, no, rsets); + zi->reg->isamb, isam_p[i], + 0 /* termid */); + r = rsmulti_or_create(rset_nmem, kctrl, scope, + termid /* termid */, + no, rsets); xfree(rsets); return r; } @@ -446,7 +449,7 @@ RSET rset_trunc(ZebraHandle zi, ISAM_P *isam_p, int no, else { yaz_log(YLOG_WARN, "Unknown isam set in rset_trunc"); - return rsnull_create(rset_nmem, kctrl); + return rsnull_create(rset_nmem, kctrl, 0); } trunc_chunk = atoi(res_get_def(zi->res, "truncchunk", "100")); result = rset_trunc_r(zi, term, length, flags, isam_p, 0, no, trunc_chunk, diff --git a/index/zrpn.c b/index/zrpn.c index f3ef7a8..71c99d5 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -1,4 +1,4 @@ -/* $Id: zrpn.c,v 1.191 2005-05-11 12:39:37 adam Exp $ +/* $Id: zrpn.c,v 1.192 2005-05-24 11:35:42 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -1608,7 +1608,7 @@ static ZEBRA_RES rpn_search_APT_phrase(ZebraHandle zh, if (res != ZEBRA_OK) return res; if (num_result_sets == 0) - *rset = rsnull_create (rset_nmem, kc); + *rset = rsnull_create (rset_nmem, kc, 0); else if (num_result_sets == 1) *rset = result_sets[0]; else @@ -1646,11 +1646,11 @@ static ZEBRA_RES rpn_search_APT_or_list(ZebraHandle zh, if (res != ZEBRA_OK) return res; if (num_result_sets == 0) - *rset = rsnull_create (rset_nmem, kc); + *rset = rsnull_create (rset_nmem, kc, 0); else if (num_result_sets == 1) *rset = result_sets[0]; else - *rset = rsmulti_or_create(rset_nmem, kc, kc->scope, + *rset = rsmulti_or_create(rset_nmem, kc, kc->scope, 0 /* termid */, num_result_sets, result_sets); if (!*rset) return ZEBRA_FAIL; @@ -1683,7 +1683,7 @@ static ZEBRA_RES rpn_search_APT_and_list(ZebraHandle zh, if (res != ZEBRA_OK) return res; if (num_result_sets == 0) - *rset = rsnull_create (rset_nmem, kc); + *rset = rsnull_create (rset_nmem, kc, 0); else if (num_result_sets == 1) *rset = result_sets[0]; else @@ -1956,7 +1956,7 @@ static ZEBRA_RES rpn_search_APT_numeric(ZebraHandle zh, return ZEBRA_FAIL; } if (num_result_sets == 0) - *rset = rsnull_create(rset_nmem, kc); + *rset = rsnull_create(rset_nmem, kc, 0); if (num_result_sets == 1) *rset = result_sets[0]; else @@ -1998,6 +1998,7 @@ static ZEBRA_RES rpn_sort_spec(ZebraHandle zh, Z_AttributesPlusTerm *zapt, oid_value attributeSet, NMEM stream, Z_SortKeySpecList *sort_sequence, const char *rank_type, + NMEM rset_nmem, RSET *rset, struct rset_key_control *kc) { @@ -2066,7 +2067,7 @@ static ZEBRA_RES rpn_sort_spec(ZebraHandle zh, Z_AttributesPlusTerm *zapt, sks->which = Z_SortKeySpec_null; sks->u.null = odr_nullval (); sort_sequence->specs[i] = sks; - *rset = rsnull_create (NULL, kc); + *rset = rsnull_create (rset_nmem, kc, 0); return ZEBRA_OK; } @@ -2106,10 +2107,10 @@ static RSET xpath_trunc(ZebraHandle zh, NMEM stream, const char *flags = "void"; if (grep_info_prepare(zh, 0 /* zapt */, &grep_info, '0') == ZEBRA_FAIL) - return rsnull_create(rset_nmem, kc); + return rsnull_create(rset_nmem, kc, 0); if (ord < 0) - return rsnull_create(rset_nmem, kc); + return rsnull_create(rset_nmem, kc, 0); if (prefix_len) term_dict[prefix_len++] = '|'; else @@ -2327,7 +2328,7 @@ static ZEBRA_RES rpn_search_APT(ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (sort_flag) return rpn_sort_spec(zh, zapt, attributeSet, stream, sort_sequence, - rank_type, rset, kc); + rank_type, rset_nmem, rset, kc); xpath_len = parse_xpath(zh, zapt, attributeSet, xpath, 10, stream); if (xpath_len >= 0) { @@ -2506,7 +2507,7 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs, break; case Z_Operator_or: rset = rsmulti_or_create(rset_nmem, kc, - kc->scope, + kc->scope, 0, /* termid */ *num_result_sets, *result_sets); break; case Z_Operator_and_not: @@ -2953,7 +2954,8 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, zapt->term->which,rset_nmem, kc, kc->scope); rset = rsmulti_or_create(rset_nmem, kc, - 2, kc->scope, rsets); + kc->scope, 0 /* termid */, + 2, rsets); } ptr[j]++; } @@ -2968,7 +2970,8 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, rsets[1] = rset_dup(limit_set); rset = rsmulti_and_create(rset_nmem, kc, - kc->scope, 2, rsets); + kc->scope, + 2, rsets); } /* count it */ count_set(rset, &glist[lo].occurrences); @@ -3040,7 +3043,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, zapt->term->which, rset_nmem, kc, kc->scope); rset = rsmulti_or_create(rset_nmem, kc, - 2, kc->scope, rsets); + kc->scope, 0 /* termid */, 2, rsets); ptr[j]++; } diff --git a/index/zserver.c b/index/zserver.c index 4456e8e..b499c21 100644 --- a/index/zserver.c +++ b/index/zserver.c @@ -1,4 +1,4 @@ -/* $Id: zserver.c,v 1.133 2005-05-12 10:17:07 adam Exp $ +/* $Id: zserver.c,v 1.134 2005-05-24 11:35:42 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -171,18 +171,15 @@ bend_initresult *bend_init (bend_initrequest *q) return r; } -static void search_terms (ZebraHandle zh, bend_search_rr *r) +static void search_terms(ZebraHandle zh, bend_search_rr *r) { - zint count = 0; int no_terms; int i; int type = Z_Term_general; struct Z_External *ext; Z_SearchInfoReport *sr; - /* get no of terms for result set */ - no_terms = 0; /* zebra_resultSetTerms (zh, r->setname, 0, 0, 0, 0, 0); */ - /* FIXME - Rsets don't know number of terms no more ??? */ + zebra_result_set_term_no(zh, r->setname, &no_terms); if (!no_terms) return; @@ -210,13 +207,14 @@ static void search_terms (ZebraHandle zh, bend_search_rr *r) for (i = 0; isetname, i, - &count, &type, outbuf, &len); - */ + + zebra_result_set_term_info(zh, r->setname, i, + &count, &approx, outbuf, &len); + sr->elements[i] = odr_malloc (r->stream, sizeof(**sr->elements)); sr->elements[i]->subqueryId = 0; sr->elements[i]->fullQuery = odr_malloc (r->stream, diff --git a/index/zsets.c b/index/zsets.c index 08a2cf4..fd89662 100644 --- a/index/zsets.c +++ b/index/zsets.c @@ -1,4 +1,4 @@ -/* $Id: zsets.c,v 1.82 2005-05-11 12:39:37 adam Exp $ +/* $Id: zsets.c,v 1.83 2005-05-24 11:35:42 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -43,6 +43,7 @@ struct zebra_set_term_entry { int use; char *term; }; + struct zebra_set { char *name; RSET rset; @@ -361,9 +362,9 @@ void resultSetDestroy (ZebraHandle zh, int num, char **names,int *statuses) } } -ZebraMetaRecord *zebra_meta_records_create_range (ZebraHandle zh, - const char *name, - zint start, int num) +ZebraMetaRecord *zebra_meta_records_create_range(ZebraHandle zh, + const char *name, + zint start, int num) { zint pos_small[10]; zint *pos = pos_small; @@ -386,8 +387,8 @@ ZebraMetaRecord *zebra_meta_records_create_range (ZebraHandle zh, return mr; } -ZebraMetaRecord *zebra_meta_records_create (ZebraHandle zh, const char *name, - int num, zint *positions) +ZebraMetaRecord *zebra_meta_records_create(ZebraHandle zh, const char *name, + int num, zint *positions) { ZebraSet sset; ZebraMetaRecord *sr = 0; @@ -794,15 +795,15 @@ ZEBRA_RES resultSetSortSingle(ZebraHandle zh, NMEM nmem, } rset_close (rfd); yaz_log(log_level_sort, ZINT_FORMAT " keys, " ZINT_FORMAT " sysnos, sort", - kno, sset->hits); + kno, sset->hits); for (i = 0; i < numTerms; i++) yaz_log(log_level_sort, "term=\"%s\" type=%s count=" ZINT_FORMAT, - terms[i]->name, terms[i]->flags, rset_count(terms[i]->rset)); + terms[i]->name, terms[i]->flags, terms[i]->rset->hits_count); *sort_status = Z_SortResponse_success; return ZEBRA_OK; } -RSET resultSetRef (ZebraHandle zh, const char *resultSetId) +RSET resultSetRef(ZebraHandle zh, const char *resultSetId) { ZebraSet s; @@ -811,25 +812,19 @@ RSET resultSetRef (ZebraHandle zh, const char *resultSetId) return NULL; } -ZEBRA_RES resultSetRank (ZebraHandle zh, ZebraSet zebraSet, - RSET rset, NMEM nmem) +ZEBRA_RES resultSetRank(ZebraHandle zh, ZebraSet zebraSet, + RSET rset, NMEM nmem) { - zint kno = 0; struct it_key key; - RSFD rfd; TERMID termid; TERMID *terms; + zint kno = 0; int numTerms = 0; int n = 0; int i; ZebraRankClass rank_class; - struct rank_control *rc; struct zset_sort_info *sort_info; const char *rank_handler_name = res_get_def(zh->res, "rank", "rank-1"); - double cur,tot; - zint est=-2; /* -2 not done, -1 can't do, >0 actual estimate*/ - zint esthits; - double ratio; if (!log_level_set) loglevels(); @@ -837,90 +832,67 @@ ZEBRA_RES resultSetRank (ZebraHandle zh, ZebraSet zebraSet, sort_info->num_entries = 0; zebraSet->hits = 0; rset_getterms(rset, 0, 0, &n); - yaz_log(YLOG_LOG, "Got %d terms", n); terms = (TERMID *) nmem_malloc(nmem, sizeof(*terms)*n); rset_getterms(rset, terms, n, &numTerms); - rfd = rset_open (rset, RSETF_READ); - - rank_class = zebraRankLookup (zh, rank_handler_name); + rank_class = zebraRankLookup(zh, rank_handler_name); if (!rank_class) { yaz_log(YLOG_WARN, "No such rank handler: %s", rank_handler_name); zebra_setError(zh, YAZ_BIB1_UNSUPP_SEARCH, "Cannot find rank handler"); return ZEBRA_FAIL; } - rc = rank_class->control; - - if (rset_read (rfd, &key, &termid)) + else { - zint psysno = key.mem[0]; - int score; - void *handle = - (*rc->begin) (zh->reg, rank_class->class_handle, rset, nmem, - terms, numTerms); - (zebraSet->hits)++; - esthits = atoi(res_get_def(zh->res, "estimatehits","0")); - if (!esthits) - est = -1; /* can not do */ - do - { - zint this_sys = key.mem[0]; /* FIXME - assumes scope==2 */ - zint seqno = key.mem[key.len-1]; /* FIXME - assumes scope==2 */ - kno++; - key_logdump_txt(log_level_searchhits,&key," Got hit"); - if (this_sys != psysno) - { - score = (*rc->calc) (handle, psysno); - - resultSetInsertRank (zh, sort_info, psysno, score, 'A'); - (zebraSet->hits)++; - psysno = this_sys; - } - (*rc->add) (handle, CAST_ZINT_TO_INT(seqno), termid); - - if ((est==-2) && (zebraSet->hits==esthits)) - { /* time to estimate the hits */ - rset_pos(rfd,&cur,&tot); - if (tot>0) { - ratio = cur/tot; - est = (zint)(0.5+zebraSet->hits/ratio); - yaz_log(log_level_searchhits, "Estimating hits (%s) " - "%0.1f->" ZINT_FORMAT - "; %0.1f->" ZINT_FORMAT, - rset->control->desc, - cur, zebraSet->hits, - tot, est); - i = 0; /* round to 3 significant digits */ - while (est>1000) { - est /= 10; - i++; - } - while (i--) - est *= 10; - zebraSet->hits = est; - } - } - } - while (rset_read (rfd, &key,&termid) && (est<0) ); - score = (*rc->calc)(handle, psysno); - resultSetInsertRank(zh, sort_info, psysno, score, 'A'); - (*rc->end) (zh->reg, handle); + RSFD rfd = rset_open(rset, RSETF_READ); + struct rank_control *rc = rank_class->control; + double score; + + void *handle = + (*rc->begin) (zh->reg, rank_class->class_handle, rset, nmem, + terms, numTerms); + zint psysno = 0; + while (rset_read(rfd, &key, &termid)) + { + zint this_sys = key.mem[0]; + zint seqno = key.mem[key.len-1]; + kno++; + key_logdump_txt(log_level_searchhits, &key, " Got hit"); + if (this_sys != psysno) + { + if (rfd->counted_items >= rset->hits_limit) + break; + if (psysno) + { + score = (*rc->calc) (handle, psysno); + resultSetInsertRank (zh, sort_info, psysno, score, 'A'); + } + psysno = this_sys; + } + (*rc->add) (handle, CAST_ZINT_TO_INT(seqno), termid); + } + if (psysno) + { + score = (*rc->calc)(handle, psysno); + resultSetInsertRank(zh, sort_info, psysno, score, 'A'); + } + (*rc->end) (zh->reg, handle); + rset_close (rfd); } - rset_close (rfd); - + zebraSet->hits = rset->hits_count; + yaz_log(log_level_searchterms, ZINT_FORMAT " keys, " ZINT_FORMAT " sysnos, rank", kno, zebraSet->hits); for (i = 0; i < numTerms; i++) { yaz_log(log_level_searchterms, "term=\"%s\" type=%s count=" ZINT_FORMAT, - terms[i]->name, terms[i]->flags, rset_count(terms[i]->rset)); + terms[i]->name, terms[i]->flags, terms[i]->rset->hits_count); } return ZEBRA_OK; } -ZebraRankClass zebraRankLookup (ZebraHandle zh, const char *name) +ZebraRankClass zebraRankLookup(ZebraHandle zh, const char *name) { ZebraRankClass p = zh->reg->rank_classes; while (p && strcmp (p->control->name, name)) @@ -934,7 +906,7 @@ ZebraRankClass zebraRankLookup (ZebraHandle zh, const char *name) return p; } -void zebraRankInstall (struct zebra_register *reg, struct rank_control *ctrl) +void zebraRankInstall(struct zebra_register *reg, struct rank_control *ctrl) { ZebraRankClass p = (ZebraRankClass) xmalloc (sizeof(*p)); p->control = (struct rank_control *) xmalloc (sizeof(*p->control)); @@ -945,7 +917,7 @@ void zebraRankInstall (struct zebra_register *reg, struct rank_control *ctrl) reg->rank_classes = p; } -void zebraRankDestroy (struct zebra_register *reg) +void zebraRankDestroy(struct zebra_register *reg) { ZebraRankClass p = reg->rank_classes; while (p) @@ -960,3 +932,101 @@ void zebraRankDestroy (struct zebra_register *reg) } reg->rank_classes = NULL; } + +static int trav_rset_for_termids(RSET rset, TERMID *termid_array, + zint *hits_array, int *approx_array) +{ + int no = 0; + int i; + for (i = 0; ino_children; i++) + no += trav_rset_for_termids(rset->children[i], + (termid_array ? termid_array + no : 0), + (hits_array ? hits_array + no : 0), + (approx_array ? approx_array + no : 0)); + if (rset->term) + { + if (termid_array) + termid_array[no] = rset->term; + if (hits_array) + hits_array[no] = rset->hits_count; + 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); +#endif + no++; + } + return no; +} + +ZEBRA_RES zebra_result_set_term_no(ZebraHandle zh, const char *setname, + int *num_terms) +{ + ZebraSet sset = resultSetGet(zh, setname); + *num_terms = 0; + if (sset) + { + *num_terms = trav_rset_for_termids(sset->rset, 0, 0, 0); + return ZEBRA_OK; + } + return ZEBRA_FAIL; +} + +ZEBRA_RES zebra_result_set_term_info(ZebraHandle zh, const char *setname, + int no, zint *count, int *approx, + char *termbuf, size_t *termlen) +{ + ZebraSet sset = resultSetGet(zh, setname); + if (sset) + { + int num_terms = trav_rset_for_termids(sset->rset, 0, 0, 0); + if (no >= 0 && no < num_terms) + { + TERMID *term_array = xmalloc(num_terms * sizeof(*term_array)); + zint *hits_array = xmalloc(num_terms * sizeof(*hits_array)); + int *approx_array = xmalloc(num_terms * sizeof(*approx_array)); + + trav_rset_for_termids(sset->rset, term_array, + hits_array, approx_array); + + if (count) + *count = hits_array[no]; + if (approx) + *approx = approx_array[no]; + if (termbuf) + { + char *inbuf = term_array[no]->name; + size_t inleft = strlen(inbuf); + size_t outleft = *termlen - 1; + + if (zh->iconv_from_utf8 != 0) + { + char *outbuf = termbuf; + size_t ret; + + ret = yaz_iconv(zh->iconv_from_utf8, &inbuf, &inleft, + &outbuf, &outleft); + if (ret == (size_t)(-1)) + *termlen = 0; + else + *termlen = outbuf - termbuf; + } + else + { + if (inleft > outleft) + inleft = outleft; + *termlen = inleft; + memcpy(termbuf, inbuf, *termlen); + } + termbuf[*termlen] = '\0'; + } + + xfree(term_array); + xfree(hits_array); + xfree(approx_array); + return ZEBRA_OK; + } + } + return ZEBRA_FAIL; +} diff --git a/rset/rsbetween.c b/rset/rsbetween.c index 9078c2f..a03bea1 100644 --- a/rset/rsbetween.c +++ b/rset/rsbetween.c @@ -1,4 +1,4 @@ -/* $Id: rsbetween.c,v 1.38 2005-05-03 09:11:35 adam Exp $ +/* $Id: rsbetween.c,v 1.39 2005-05-24 11:35:43 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -69,7 +69,6 @@ static const struct rset_control control = #define ATTRTAG 3 struct rset_between_info { - RSET andset; /* the multi-and of the above */ TERMID startterm; /* pseudo terms for detecting which one we read from */ TERMID stopterm; TERMID attrterm; @@ -107,7 +106,7 @@ RSET rsbetween_create(NMEM nmem, struct rset_key_control *kcontrol, int scope, RSET rset_l, RSET rset_m, RSET rset_r, RSET rset_attr) { - RSET rnew = rset_create_base(&control, nmem, kcontrol, scope,0); + RSET rnew = rset_create_base(&control, nmem, kcontrol, scope, 0, 0, 0); struct rset_between_info *info= (struct rset_between_info *) nmem_malloc(rnew->nmem,sizeof(*info)); RSET rsetarray[4]; @@ -124,14 +123,14 @@ RSET rsbetween_create(NMEM nmem, struct rset_key_control *kcontrol, rsetarray[ATTRTAG] = rset_attr; /* make sure we have decent terms for all rsets. Create dummies if needed*/ - checkterm( rsetarray[STARTTAG], "(start)",nmem); - checkterm( rsetarray[STOPTAG], "(start)",nmem); + checkterm(rsetarray[STARTTAG], "(start)", nmem); + checkterm(rsetarray[STOPTAG], "(start)", nmem); info->startterm = rsetarray[STARTTAG]->term; info->stopterm = rsetarray[STOPTAG]->term; if (rset_attr) { - checkterm( rsetarray[ATTRTAG], "(start)",nmem); + checkterm(rsetarray[ATTRTAG], "(start)", nmem); info->attrterm = rsetarray[ATTRTAG]->term; n = 4; } @@ -140,24 +139,22 @@ RSET rsbetween_create(NMEM nmem, struct rset_key_control *kcontrol, info->attrterm = NULL; n = 3; } - info->andset = rsmulti_and_create( nmem, kcontrol, scope, n, rsetarray); + rnew->no_children = 1; + rnew->children = nmem_malloc(rnew->nmem, sizeof(RSET *)); + rnew->children[0] = rsmulti_and_create(nmem, kcontrol, + scope, n, rsetarray); rnew->priv = info; - yaz_log(log_level,"create rset at %p",rnew); + yaz_log(log_level, "create rset at %p", rnew); return rnew; } - static void r_delete(RSET ct) { - struct rset_between_info *info = (struct rset_between_info *) ct->priv; - yaz_log(log_level,"delete rset at %p",ct); - rset_delete(info->andset); } static RSFD r_open(RSET ct, int flag) { - struct rset_between_info *info = (struct rset_between_info *) ct->priv; RSFD rfd; struct rset_between_rfd *p; @@ -172,17 +169,17 @@ static RSFD r_open(RSET ct, int flag) else { p = (struct rset_between_rfd *) nmem_malloc(ct->nmem, (sizeof(*p))); rfd->priv = p; - p->recbuf = nmem_malloc(ct->nmem, (ct->keycontrol->key_size)); - p->startbuf = nmem_malloc(ct->nmem, (ct->keycontrol->key_size)); - p->attrbuf = nmem_malloc(ct->nmem, (ct->keycontrol->key_size)); + p->recbuf = nmem_malloc(ct->nmem, ct->keycontrol->key_size); + p->startbuf = nmem_malloc(ct->nmem, ct->keycontrol->key_size); + p->attrbuf = nmem_malloc(ct->nmem, ct->keycontrol->key_size); } - p->andrfd = rset_open(info->andset, RSETF_READ); - p->hits=-1; + p->andrfd = rset_open(ct->children[0], RSETF_READ); + p->hits = -1; p->depth = 0; p->attrdepth = 0; p->attrbufok = 0; p->startbufok = 0; - yaz_log(log_level,"open rset=%p rfd=%p", ct, rfd); + yaz_log(log_level, "open rset=%p rfd=%p", ct, rfd); return rfd; } @@ -191,11 +188,8 @@ static void r_close(RSFD rfd) struct rset_between_rfd *p=(struct rset_between_rfd *)rfd->priv; yaz_log(log_level,"close rfd=%p", rfd); rset_close(p->andrfd); - rfd_delete_base(rfd); } - - static int r_forward(RSFD rfd, void *buf, TERMID *term, const void *untilbuf) { @@ -206,8 +200,6 @@ static int r_forward(RSFD rfd, void *buf, return rc; } - - static void checkattr(RSFD rfd) { struct rset_between_info *info =(struct rset_between_info *) @@ -233,7 +225,6 @@ static void checkattr(RSFD rfd) } } - static int r_read(RSFD rfd, void *buf, TERMID *term) { struct rset_between_info *info = @@ -242,39 +233,39 @@ static int r_read(RSFD rfd, void *buf, TERMID *term) const struct rset_key_control *kctrl = rfd->rset->keycontrol; int cmp; TERMID dummyterm = 0; - yaz_log(log_level,"== read: term=%p",term); + yaz_log(log_level, "== read: term=%p",term); if (!term) - term=&dummyterm; - while ( rset_read(p->andrfd,buf,term) ) + term = &dummyterm; + while (rset_read(p->andrfd, buf, term)) { yaz_log(log_level,"read loop term=%p d=%d ad=%d", - *term,p->depth, p->attrdepth); + *term, p->depth, p->attrdepth); if (p->hits<0) {/* first time? */ - memcpy(p->recbuf,buf,kctrl->key_size); + memcpy(p->recbuf, buf, kctrl->key_size); p->hits = 0; cmp = rfd->rset->scope; /* force newrecord */ } else { - cmp=(kctrl->cmp)(buf,p->recbuf); - yaz_log(log_level, "cmp=%d",cmp); + cmp = (kctrl->cmp)(buf, p->recbuf); + yaz_log(log_level, "cmp=%d", cmp); } if (cmp>=rfd->rset->scope) { - yaz_log(log_level,"new record"); + yaz_log(log_level, "new record"); p->depth = 0; p->attrdepth = 0; - memcpy(p->recbuf,buf,kctrl->key_size); + memcpy(p->recbuf, buf, kctrl->key_size); } if (*term) - yaz_log(log_level," term: '%s'", (*term)->name); + yaz_log(log_level, " term: '%s'", (*term)->name); if (*term==info->startterm) { p->depth++; - yaz_log(log_level,"read start tag. d=%d",p->depth); - memcpy(p->startbuf,buf,kctrl->key_size); + yaz_log(log_level, "read start tag. d=%d", p->depth); + memcpy(p->startbuf, buf, kctrl->key_size); p->startbufok = 1; checkattr(rfd); /* in case we already saw the attr here */ } @@ -283,12 +274,13 @@ static int r_read(RSFD rfd, void *buf, TERMID *term) if (p->depth == p->attrdepth) p->attrdepth = 0; /* ending the tag with attr match */ p->depth--; - yaz_log(log_level,"read end tag. d=%d ad=%d",p->depth, p->attrdepth); + yaz_log(log_level,"read end tag. d=%d ad=%d", p->depth, + p->attrdepth); } else if (*term==info->attrterm) { yaz_log(log_level,"read attr"); - memcpy(p->attrbuf,buf,kctrl->key_size); + memcpy(p->attrbuf, buf, kctrl->key_size); p->attrbufok = 1; checkattr(rfd); /* in case the start tag came first */ } @@ -298,11 +290,11 @@ static int r_read(RSFD rfd, void *buf, TERMID *term) { p->hits++; yaz_log(log_level,"got a hit h="ZINT_FORMAT" d=%d ad=%d", - p->hits,p->depth,p->attrdepth); + p->hits, p->depth, p->attrdepth); return 1; /* we have everything in place already! */ } else yaz_log(log_level, "Ignoring hit. h="ZINT_FORMAT" d=%d ad=%d", - p->hits,p->depth,p->attrdepth); + p->hits, p->depth, p->attrdepth); } } /* while read */ @@ -321,14 +313,13 @@ static int r_write(RSFD rfd, const void *buf) static void r_pos(RSFD rfd, double *current, double *total) { struct rset_between_rfd *p=(struct rset_between_rfd *)rfd->priv; - rset_pos(p->andrfd,current, total); - yaz_log(log_level,"pos: %0.1f/%0.1f ", *current, *total); + rset_pos(p->andrfd, current, total); + yaz_log(log_level, "pos: %0.1f/%0.1f ", *current, *total); } static void r_get_terms(RSET ct, TERMID *terms, int maxterms, int *curterm) { - struct rset_between_info *info = (struct rset_between_info *) ct->priv; - rset_getterms(info->andset, terms, maxterms, curterm); + rset_getterms(ct->children[0], terms, maxterms, curterm); } diff --git a/rset/rsbool.c b/rset/rsbool.c index 520e859..1ebcea8 100644 --- a/rset/rsbool.c +++ b/rset/rsbool.c @@ -1,4 +1,4 @@ -/* $Id: rsbool.c,v 1.55 2005-05-03 09:11:36 adam Exp $ +/* $Id: rsbool.c,v 1.56 2005-05-24 11:35:43 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -106,7 +106,11 @@ static RSET rsbool_create_base(const struct rset_control *ctrl, struct rset_key_control *kcontrol, int scope, RSET rset_l, RSET rset_r) { - RSET rnew = rset_create_base(ctrl, nmem, kcontrol, scope, 0); + RSET children[2], rnew; + + children[0] = rset_l; + children[1] = rset_r; + rnew = rset_create_base(ctrl, nmem, kcontrol, scope, 0, 2, children); struct rset_private *info; info = (struct rset_private *) nmem_malloc(rnew->nmem, sizeof(*info)); info->rset_l = rset_l; @@ -139,9 +143,6 @@ RSET rsbool_create_not(NMEM nmem, struct rset_key_control *kcontrol, static void r_delete(RSET ct) { - struct rset_private *info = (struct rset_private *) ct->priv; - rset_delete (info->rset_l); - rset_delete (info->rset_r); } static RSFD r_open(RSET ct, int flag) @@ -182,7 +183,6 @@ static void r_close (RSFD rfd) rset_close (prfd->rfd_l); rset_close (prfd->rfd_r); - rfd_delete_base(rfd); } static int r_forward(RSFD rfd, void *buf, TERMID *term, diff --git a/rset/rset.c b/rset/rset.c index 7af05c9..16aaf31 100644 --- a/rset/rset.c +++ b/rset/rset.c @@ -1,4 +1,4 @@ -/* $Id: rset.c,v 1.45 2005-05-03 09:11:36 adam Exp $ +/* $Id: rset.c,v 1.46 2005-05-24 11:35:43 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -51,6 +51,7 @@ RSFD rfd_create_base(RSET rs) else { rnew = nmem_malloc(rs->nmem, sizeof(*rnew)); + rnew->counted_buf = nmem_malloc(rs->nmem, rs->keycontrol->key_size); rnew->priv = 0; rnew->rset = rs; yaz_log(log_level, "rfd_create_base (new): rfd=%p rs=%p fl=%p priv=%p", @@ -58,6 +59,7 @@ RSFD rfd_create_base(RSET rs) } rnew->next = rs->use_list; rs->use_list = rnew; + rnew->counted_items = 0; return rnew; } @@ -65,10 +67,52 @@ RSFD rfd_create_base(RSET rs) * * puts an rfd into the freelist of the rset. Only when the rset gets * deleted, will all the nmem disappear */ -void rfd_delete_base(RSFD rfd) +void rset_close(RSFD rfd) { RSFD *pfd; RSET rs = rfd->rset; + + if (rs->hits_count == 0) + { + TERMID termid; + char buf[100]; + while(rfd->counted_items < rs->hits_limit + && rset_default_read(rfd, buf, &termid)) + ; + + rs->hits_count = rfd->counted_items; + rs->hits_approx = 0; + if (rs->hits_count >= rs->hits_limit) + { + double cur, tot; + zint est; + rset_pos(rfd, &cur, &tot); + if (tot > 0) { + int i; + double ratio = cur/tot; + est = (zint)(0.5 + rs->hits_count / ratio); + yaz_log(log_level, "Estimating hits (%s) " + "%0.1f->" ZINT_FORMAT + "; %0.1f->" ZINT_FORMAT, + rs->control->desc, + cur, rs->hits_count, + tot, est); + i = 0; /* round to significant digits */ + while (est > rs->hits_round) { + est /= 10; + i++; + } + while (i--) + est *= 10; + rs->hits_count = est; + rs->hits_approx = 1; + } + } + yaz_log(log_level, "rset_close p=%p count=" ZINT_FORMAT, rs, + rs->hits_count); + } + (*rs->control->f_close)(rfd); + yaz_log(log_level, "rfd_delete_base: rfd=%p rs=%p priv=%p fl=%p", rfd, rs, rfd->priv, rs->free_list); for (pfd = &rs->use_list; *pfd; pfd = &(*pfd)->next) @@ -85,11 +129,12 @@ void rfd_delete_base(RSFD rfd) RSET rset_create_base(const struct rset_control *sel, NMEM nmem, struct rset_key_control *kcontrol, - int scope, TERMID term) + int scope, TERMID term, + int no_children, RSET *children) { - RSET rnew; + RSET rset; NMEM M; - /* assert(nmem); */ /* can not yet be used, api/t4 fails */ + assert(nmem); /* can not yet be used, api/t4 fails */ if (!log_level_initialized) { log_level = yaz_log_module_level("rset"); @@ -100,37 +145,52 @@ RSET rset_create_base(const struct rset_control *sel, M = nmem; else M = nmem_create(); - rnew = (RSET) nmem_malloc(M, sizeof(*rnew)); - yaz_log(log_level, "rs_create(%s) rs=%p (nm=%p)", sel->desc, rnew, nmem); - rnew->nmem = M; + rset = (RSET) nmem_malloc(M, sizeof(*rset)); + yaz_log(log_level, "rs_create(%s) rs=%p (nm=%p)", sel->desc, rset, nmem); + rset->nmem = M; if (nmem) - rnew->my_nmem = 0; + rset->my_nmem = 0; else - rnew->my_nmem = 1; - rnew->control = sel; - rnew->count = 1; /* refcount! */ - rnew->priv = 0; - rnew->free_list = NULL; - rnew->use_list = NULL; - rnew->keycontrol = kcontrol; + rset->my_nmem = 1; + rset->control = sel; + rset->refcount = 1; + rset->priv = 0; + rset->free_list = NULL; + rset->use_list = NULL; + rset->hits_count = 0; + rset->hits_limit = 1000; + rset->hits_round = 1000; + rset->keycontrol = kcontrol; (*kcontrol->inc)(kcontrol); - rnew->scope = scope; - rnew->term = term; + rset->scope = scope; + rset->term = term; if (term) - term->rset = rnew; - return rnew; + term->rset = rset; + + rset->no_children = no_children; + rset->children = 0; + if (no_children) + { + rset->children = (RSET*) + nmem_malloc(rset->nmem, no_children*sizeof(RSET *)); + memcpy(rset->children, children, no_children*sizeof(RSET *)); + } + return rset; } -void rset_delete (RSET rs) +void rset_delete(RSET rs) { - (rs->count)--; - yaz_log(log_level, "rs_delete(%s), rs=%p, count=%d", - rs->control->desc, rs, rs->count); - if (!rs->count) + (rs->refcount)--; + yaz_log(log_level, "rs_delete(%s), rs=%p, refcount=%d", + rs->control->desc, rs, rs->refcount); + if (!rs->refcount) { + int i; if (rs->use_list) yaz_log(YLOG_WARN, "rs_delete(%s) still has RFDs in use", rs->control->desc); + for (i = 0; ino_children; i++) + rset_delete(rs->children[i]); (*rs->control->f_delete)(rs); (*rs->keycontrol->dec)(rs->keycontrol); if (rs->my_nmem) @@ -147,40 +207,13 @@ int rfd_is_last(RSFD rfd) RSET rset_dup (RSET rs) { - (rs->count)++; - yaz_log(log_level, "rs_dup(%s), rs=%p, count=%d", - rs->control->desc, rs, rs->count); + (rs->refcount)++; + yaz_log(log_level, "rs_dup(%s), rs=%p, refcount=%d", + rs->control->desc, rs, rs->refcount); (*rs->keycontrol->inc)(rs->keycontrol); return rs; } -int rset_default_forward(RSFD rfd, void *buf, TERMID *term, - const void *untilbuf) -{ - int more = 1; - int cmp = rfd->rset->scope; - if (log_level) - { - yaz_log (log_level, "rset_default_forward starting '%s' (ct=%p rfd=%p)", - rfd->rset->control->desc, rfd->rset, rfd); - /* key_logdump(log_level, untilbuf); */ - } - while (cmp>=rfd->rset->scope && more) - { - if (log_level) /* time-critical, check first */ - yaz_log(log_level, "rset_default_forward looping m=%d c=%d", - more, cmp); - more = rset_read(rfd, buf, term); - if (more) - cmp = (rfd->rset->keycontrol->cmp)(untilbuf, buf); - } - if (log_level) - yaz_log (log_level, "rset_default_forward exiting m=%d c=%d", - more, cmp); - - return more; -} - /** * rset_count uses rset_pos to get the total and returns that. * This is ok for rsisamb/c/s, and for some other rsets, but in case of @@ -196,7 +229,6 @@ zint rset_count(RSET rs) return (zint) tot; } - /** rset_get_no_terms is a getterms function for those that don't have any */ void rset_get_no_terms(RSET ct, TERMID *terms, int maxterms, int *curterm) { @@ -204,7 +236,7 @@ void rset_get_no_terms(RSET ct, TERMID *terms, int maxterms, int *curterm) } /* rset_get_one_term gets that one term from an rset. Used by rsisamX */ -void rset_get_one_term(RSET ct,TERMID *terms,int maxterms,int *curterm) +void rset_get_one_term(RSET ct, TERMID *terms, int maxterms, int *curterm) { if (ct->term) { @@ -215,8 +247,8 @@ void rset_get_one_term(RSET ct,TERMID *terms,int maxterms,int *curterm) } -TERMID rset_term_create (const char *name, int length, const char *flags, - int type, NMEM nmem) +TERMID rset_term_create(const char *name, int length, const char *flags, + int type, NMEM nmem) { TERMID t; @@ -242,3 +274,55 @@ TERMID rset_term_create (const char *name, int length, const char *flags, t->rset = 0; return t; } + +int rset_default_read(RSFD rfd, void *buf, TERMID *term) +{ + RSET rset = rfd->rset; + int rc = (*rset->control->f_read)(rfd, buf, term); + if (rc > 0) + { + if (rfd->counted_items == 0 || + (rset->keycontrol->cmp)(buf, rfd->counted_buf) >= rset->scope) + { + memcpy(rfd->counted_buf, buf, rset->keycontrol->key_size); + rfd->counted_items++; + } + } + return rc; +} + +int rset_default_forward(RSFD rfd, void *buf, TERMID *term, + const void *untilbuf) +{ + RSET rset = rfd->rset; + int more; + + if (rset->control->f_forward && + rfd->counted_items >= rset->hits_limit) + { + assert (rset->control->f_forward != rset_default_forward); + return rset->control->f_forward(rfd, buf, term, untilbuf); + } + + while ((more = rset_read(rfd, buf, term)) > 0) + { + if ((rfd->rset->keycontrol->cmp)(untilbuf, buf) <= 1) + break; + } + if (log_level) + yaz_log (log_level, "rset_default_forward exiting m=%d c=%d", + more, rset->scope); + + return more; +} + +void rset_visit(RSET rset, int level) +{ + int i; + yaz_log(YLOG_LOG, "%*s%c " ZINT_FORMAT, level, "", + rset->hits_approx ? '~' : '=', + rset->hits_count); + for (i = 0; ino_children; i++) + rset_visit(rset->children[i], level+1); +} + diff --git a/rset/rsisamb.c b/rset/rsisamb.c index cbd6cd8..b332448 100644 --- a/rset/rsisamb.c +++ b/rset/rsisamb.c @@ -1,4 +1,4 @@ -/* $Id: rsisamb.c,v 1.33 2005-05-03 09:11:36 adam Exp $ +/* $Id: rsisamb.c,v 1.34 2005-05-24 11:35:43 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -80,7 +80,7 @@ RSET rsisamb_create(NMEM nmem, struct rset_key_control *kcontrol, { RSET rnew = rset_create_base( kcontrol->filter_func ? &control_filter : &control, - nmem, kcontrol, scope, term); + nmem, kcontrol, scope, term, 0, 0); struct rset_private *info; if (!log_level_initialized) { @@ -128,7 +128,6 @@ static void r_close(RSFD rfd) { struct rfd_private *ptinfo = (struct rfd_private *)(rfd->priv); isamb_pp_close (ptinfo->pt); - rfd_delete_base(rfd); yaz_log(log_level, "rsisamb_close"); } diff --git a/rset/rsisamc.c b/rset/rsisamc.c index 43568eb..b0c9201 100644 --- a/rset/rsisamc.c +++ b/rset/rsisamc.c @@ -1,4 +1,4 @@ -/* $Id: rsisamc.c,v 1.39 2005-05-03 09:11:36 adam Exp $ +/* $Id: rsisamc.c,v 1.40 2005-05-24 11:35:43 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -40,7 +40,7 @@ static const struct rset_control control = rset_get_one_term, r_open, r_close, - rset_default_forward, + 0, /* no forward */ r_pos, r_read, r_write, @@ -63,14 +63,14 @@ RSET rsisamc_create(NMEM nmem, struct rset_key_control *kcontrol, int scope, ISAMC is, ISAM_P pos, TERMID term) { - RSET rnew = rset_create_base(&control, nmem, kcontrol, scope,term); + RSET rnew = rset_create_base(&control, nmem, kcontrol, scope, term, 0, 0); struct rset_isamc_info *info; if (!log_level_initialized) { log_level = yaz_log_module_level("rsisamc"); log_level_initialized = 1; } - info = (struct rset_isamc_info *) nmem_malloc(rnew->nmem,sizeof(*info)); + info = (struct rset_isamc_info *) nmem_malloc(rnew->nmem, sizeof(*info)); info->is = is; info->pos = pos; rnew->priv = info; @@ -113,7 +113,6 @@ static void r_close (RSFD rfd) struct rset_pp_info *p = (struct rset_pp_info *)(rfd->priv); isamc_pp_close(p->pt); - rfd_delete_base(rfd); } diff --git a/rset/rsisams.c b/rset/rsisams.c index 50b559a..5fd70cf 100644 --- a/rset/rsisams.c +++ b/rset/rsisams.c @@ -1,4 +1,4 @@ -/* $Id: rsisams.c,v 1.22 2005-05-03 09:11:36 adam Exp $ +/* $Id: rsisams.c,v 1.23 2005-05-24 11:35:43 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -39,7 +39,7 @@ static const struct rset_control control = rset_get_one_term, r_open, r_close, - rset_default_forward, + 0, /* no foward */ r_pos, r_read, r_write, @@ -59,7 +59,7 @@ RSET rsisams_create(NMEM nmem, struct rset_key_control *kcontrol, int scope, ISAMS is, ISAM_P pos, TERMID term) { - RSET rnew = rset_create_base(&control, nmem, kcontrol, scope, term); + RSET rnew = rset_create_base(&control, nmem, kcontrol, scope, term, 0, 0); struct rset_private *info; info = (struct rset_private *) nmem_malloc(rnew->nmem,sizeof(*info)); rnew->priv = info; @@ -71,10 +71,8 @@ RSET rsisams_create(NMEM nmem, struct rset_key_control *kcontrol, static void r_delete (RSET ct) { yaz_log (YLOG_DEBUG, "rsisams_delete"); - rset_delete(ct); } - RSFD r_open (RSET ct, int flag) { struct rset_private *info = (struct rset_private *) ct->priv; @@ -103,7 +101,6 @@ static void r_close (RSFD rfd) struct rfd_private *ptinfo = (struct rfd_private *)(rfd->priv); isams_pp_close (ptinfo->pt); - rfd_delete_base(rfd); } diff --git a/rset/rsmultiandor.c b/rset/rsmultiandor.c index c0c48fc..b810c54 100644 --- a/rset/rsmultiandor.c +++ b/rset/rsmultiandor.c @@ -1,4 +1,4 @@ -/* $Id: rsmultiandor.c,v 1.18 2005-05-18 11:47:50 adam Exp $ +/* $Id: rsmultiandor.c,v 1.19 2005-05-24 11:35:43 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -108,8 +108,7 @@ typedef struct heap *HEAP; struct rset_private { - int no_rsets; - RSET *rsets; + int dummy; }; @@ -265,10 +264,12 @@ int compare_ands(const void *x, const void *y) static RSET rsmulti_andor_create(NMEM nmem, struct rset_key_control *kcontrol, - int scope, int no_rsets, RSET* rsets, + int scope, TERMID termid, + int no_rsets, RSET* rsets, const struct rset_control *ctrl) { - RSET rnew = rset_create_base(ctrl, nmem, kcontrol, scope, 0); + RSET rnew = rset_create_base(ctrl, nmem, kcontrol, scope, termid, + no_rsets, rsets); struct rset_private *info; if (!log_level_initialized) { @@ -276,44 +277,35 @@ static RSET rsmulti_andor_create(NMEM nmem, log_level_initialized = 1; } yaz_log(log_level, "rsmultiand_andor_create scope=%d", scope); - info = (struct rset_private *) nmem_malloc(rnew->nmem,sizeof(*info)); - info->no_rsets = no_rsets; - info->rsets = (RSET*)nmem_malloc(rnew->nmem, no_rsets*sizeof(*rsets)); - memcpy(info->rsets,rsets,no_rsets*sizeof(*rsets)); + info = (struct rset_private *) nmem_malloc(rnew->nmem, sizeof(*info)); rnew->priv = info; return rnew; } RSET rsmulti_or_create(NMEM nmem, struct rset_key_control *kcontrol, - int scope, int no_rsets, RSET* rsets) + int scope, TERMID termid, int no_rsets, RSET* rsets) { - return rsmulti_andor_create(nmem, kcontrol, scope, + return rsmulti_andor_create(nmem, kcontrol, scope, termid, no_rsets, rsets, &control_or); } RSET rsmulti_and_create(NMEM nmem, struct rset_key_control *kcontrol, int scope, int no_rsets, RSET* rsets) { - return rsmulti_andor_create(nmem, kcontrol, scope, + return rsmulti_andor_create(nmem, kcontrol, scope, 0, no_rsets, rsets, &control_and); } static void r_delete (RSET ct) { - struct rset_private *info = (struct rset_private *) ct->priv; - int i; - for(i = 0; ino_rsets; i++) - rset_delete(info->rsets[i]); } - /* Opening and closing fd's on them *********************/ static RSFD r_open_andor (RSET ct, int flag, int is_and) { RSFD rfd; struct rfd_private *p; - struct rset_private *info = (struct rset_private *) ct->priv; const struct rset_key_control *kctrl = ct->keycontrol; int i; @@ -336,14 +328,14 @@ static RSFD r_open_andor (RSET ct, int flag, int is_and) p->h = 0; p->tailbits = 0; if (is_and) - p->tailbits = nmem_malloc(ct->nmem, info->no_rsets*sizeof(char) ); + p->tailbits = nmem_malloc(ct->nmem, ct->no_children*sizeof(char) ); else - p->h = heap_create( ct->nmem, info->no_rsets, kctrl); - p->items=(struct heap_item *) nmem_malloc(ct->nmem, - info->no_rsets*sizeof(*p->items)); - for (i = 0; ino_rsets; i++) + p->h = heap_create( ct->nmem, ct->no_children, kctrl); + p->items = (struct heap_item *) + nmem_malloc(ct->nmem, ct->no_children*sizeof(*p->items)); + for (i = 0; ino_children; i++) { - p->items[i].rset = info->rsets[i]; + p->items[i].rset = ct->children[i]; p->items[i].buf = nmem_malloc(ct->nmem, kctrl->key_size); } } @@ -353,17 +345,17 @@ static RSFD r_open_andor (RSET ct, int flag, int is_and) p->tailcount = 0; if (is_and) { /* read the array and sort it */ - for (i = 0; ino_rsets; i++){ - p->items[i].fd = rset_open(info->rsets[i],RSETF_READ); + for (i = 0; ino_children; i++){ + p->items[i].fd = rset_open(ct->children[i], RSETF_READ); if (!rset_read(p->items[i].fd, p->items[i].buf, &p->items[i].term)) p->eof = 1; p->tailbits[i] = 0; } - qsort(p->items, info->no_rsets, sizeof(p->items[0]), compare_ands); + qsort(p->items, ct->no_children, sizeof(p->items[0]), compare_ands); } else { /* fill the heap for ORing */ - for (i = 0; ino_rsets; i++){ - p->items[i].fd = rset_open(info->rsets[i],RSETF_READ); + for (i = 0; ino_children; i++){ + p->items[i].fd = rset_open(ct->children[i],RSETF_READ); if ( rset_read(p->items[i].fd, p->items[i].buf, &p->items[i].term)) heap_insert(p->h, &(p->items[i])); } @@ -384,23 +376,20 @@ static RSFD r_open_and (RSET ct, int flag) static void r_close (RSFD rfd) { - struct rset_private *info= - (struct rset_private *)(rfd->rset->priv); struct rfd_private *p=(struct rfd_private *)(rfd->priv); int i; if (p->h) heap_destroy (p->h); - for (i = 0; ino_rsets; i++) + for (i = 0; irset->no_children; i++) if (p->items[i].fd) rset_close(p->items[i].fd); - rfd_delete_base(rfd); } static int r_forward_or(RSFD rfd, void *buf, - TERMID *term,const void *untilbuf) + TERMID *term, const void *untilbuf) { /* while heap head behind untilbuf, forward it and rebalance heap */ struct rfd_private *p = rfd->priv; const struct rset_key_control *kctrl = rfd->rset->keycontrol; @@ -419,22 +408,29 @@ static int r_forward_or(RSFD rfd, void *buf, } } - return r_read_or(rfd,buf,term); + return r_read_or(rfd, buf, term); } static int r_read_or (RSFD rfd, void *buf, TERMID *term) { + RSET rset = rfd->rset; struct rfd_private *mrfd = rfd->priv; - const struct rset_key_control *kctrl = rfd->rset->keycontrol; + const struct rset_key_control *kctrl = rset->keycontrol; struct heap_item *it; int rdres; if (heap_empty(mrfd->h)) return 0; it = mrfd->h->heap[1]; - memcpy(buf,it->buf, kctrl->key_size); + memcpy(buf, it->buf, kctrl->key_size); if (term) - *term = it->term; + { + if (rset->term) + *term = rset->term; + else + *term = it->term; + assert(*term); + } (mrfd->hits)++; rdres = rset_read(it->fd, it->buf, &it->term); if ( rdres ) @@ -455,8 +451,8 @@ static int r_read_and (RSFD rfd, void *buf, TERMID *term) /* value. Mark all as being in the tail. Read next from that */ /* item, and if not in the same record, clear its tail bit */ struct rfd_private *p = rfd->priv; - const struct rset_key_control *kctrl = rfd->rset->keycontrol; - struct rset_private *info = rfd->rset->priv; + RSET ct = rfd->rset; + const struct rset_key_control *kctrl = ct->keycontrol; int i, mintail; int cmp; @@ -464,9 +460,9 @@ static int r_read_and (RSFD rfd, void *buf, TERMID *term) if (p->tailcount) { /* we are tailing, find lowest tail and return it */ mintail = 0; - while ((mintailno_rsets) && !p->tailbits[mintail]) + while ((mintailno_children) && !p->tailbits[mintail]) mintail++; /* first tail */ - for (i = mintail+1; ino_rsets; i++) + for (i = mintail+1; ino_children; i++) { if (p->tailbits[i]) { @@ -483,15 +479,15 @@ static int r_read_and (RSFD rfd, void *buf, TERMID *term) &p->items[mintail].term)) { p->eof = 1; /* game over, once tails have been returned */ - p->tailbits[mintail]=0; + p->tailbits[mintail] = 0; (p->tailcount)--; (p->hits)++; return 1; } /* still a tail? */ - cmp=(*kctrl->cmp)(p->items[mintail].buf,buf); + cmp = (*kctrl->cmp)(p->items[mintail].buf,buf); if (cmp >= rfd->rset->scope){ - p->tailbits[mintail]=0; + p->tailbits[mintail] = 0; (p->tailcount)--; } (p->hits)++; @@ -502,9 +498,9 @@ static int r_read_and (RSFD rfd, void *buf, TERMID *term) if (p->eof) return 0; /* nothing more to see */ i = 1; /* assume items[0] is highest up */ - while (ino_rsets) { - cmp=(*kctrl->cmp)(p->items[0].buf,p->items[i].buf); - if (cmp<=-rfd->rset->scope) { /* [0] was behind, forward it */ + while (ino_children) { + cmp = (*kctrl->cmp)(p->items[0].buf, p->items[i].buf); + if (cmp <= -rfd->rset->scope) { /* [0] was behind, forward it */ if (!rset_forward(p->items[0].fd, p->items[0].buf, &p->items[0].term, p->items[i].buf)) { @@ -526,9 +522,9 @@ static int r_read_and (RSFD rfd, void *buf, TERMID *term) /* if we get this far, all rsets are now within +- scope of [0] */ /* ergo, we have a hit. Mark them all as tailing, and let the */ /* upper 'if' return the hits in right order */ - for (i = 0; ino_rsets; i++) + for (i = 0; ino_children; i++) p->tailbits[i] = 1; - p->tailcount = info->no_rsets; + p->tailcount = ct->no_children; } /* while 1 */ } @@ -537,13 +533,13 @@ static int r_forward_and(RSFD rfd, void *buf, TERMID *term, const void *untilbuf) { struct rfd_private *p = rfd->priv; - const struct rset_key_control *kctrl = rfd->rset->keycontrol; - struct rset_private *info = rfd->rset->priv; + RSET ct = rfd->rset; + const struct rset_key_control *kctrl = ct->keycontrol; int i; int cmp; int killtail = 0; - for (i = 0; ino_rsets; i++) + for (i = 0; ino_children; i++) { cmp = (*kctrl->cmp)(p->items[i].buf,untilbuf); if (cmp <= -rfd->rset->scope) @@ -560,7 +556,7 @@ static int r_forward_and(RSFD rfd, void *buf, TERMID *term, } if (killtail) { - for (i = 0; ino_rsets; i++) + for (i = 0; ino_children; i++) p->tailbits[i] = 0; p->tailcount = 0; } @@ -569,14 +565,13 @@ static int r_forward_and(RSFD rfd, void *buf, TERMID *term, static void r_pos (RSFD rfd, double *current, double *total) { - struct rset_private *info = - (struct rset_private *)(rfd->rset->priv); + RSET ct = rfd->rset; struct rfd_private *mrfd = (struct rfd_private *)(rfd->priv); double cur, tot; double scur = 0.0, stot = 0.0; int i; - for (i = 0; ino_rsets; i++){ + for (i = 0; ino_children; i++){ rset_pos(mrfd->items[i].fd, &cur, &tot); yaz_log(log_level, "r_pos: %d %0.1f %0.1f", i, cur,tot); scur += cur; @@ -602,22 +597,27 @@ static int r_write (RSFD rfd, const void *buf) } static void r_get_terms(RSET ct, TERMID *terms, int maxterms, int *curterm) - /* Special case: Some multi-ors have all terms pointing to the same */ - /* term. We do not want to duplicate those. Other multiors (and ands) */ - /* have different terms under them. Those we want. */ { - struct rset_private *info = - (struct rset_private *) ct->priv; - int firstterm= *curterm; - int i; - for (i = 0; ino_rsets; i++) + if (ct->term) + rset_get_one_term(ct, terms, maxterms, curterm); + else { - rset_getterms(info->rsets[i], terms, maxterms, curterm); - if ( ( *curterm > firstterm+1 ) && - ( *curterm <= maxterms ) && - ( terms[(*curterm)-1] == terms[firstterm] ) - ) - (*curterm)--; /* forget the term, seen that before */ + /* Special case: Some multi-ors have all terms pointing to the same + term. We do not want to duplicate those. Other multiors (and ands) + have different terms under them. Those we want. + */ + int firstterm= *curterm; + int i; + + for (i = 0; ino_children; i++) + { + rset_getterms(ct->children[i], terms, maxterms, curterm); + if ( ( *curterm > firstterm+1 ) && + ( *curterm <= maxterms ) && + ( terms[(*curterm)-1] == terms[firstterm] ) + ) + (*curterm)--; /* forget the term, seen that before */ + } } } diff --git a/rset/rsnull.c b/rset/rsnull.c index 09ee8c2..cc427c7 100644 --- a/rset/rsnull.c +++ b/rset/rsnull.c @@ -1,4 +1,4 @@ -/* $Id: rsnull.c,v 1.34 2005-05-03 09:11:36 adam Exp $ +/* $Id: rsnull.c,v 1.35 2005-05-24 11:35:43 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -39,15 +39,16 @@ static const struct rset_control control = rset_get_no_terms, r_open, r_close, - rset_default_forward, + 0, /* no forward */ r_pos, r_read, r_write, }; -RSET rsnull_create(NMEM nmem, struct rset_key_control *kcontrol ) +RSET rsnull_create(NMEM nmem, struct rset_key_control *kcontrol, + TERMID term) { - RSET rnew = rset_create_base(&control, nmem, kcontrol, 0, 0); + RSET rnew = rset_create_base(&control, nmem, kcontrol, 0, term, 0, 0); rnew->priv = 0; return rnew; } @@ -67,7 +68,6 @@ static RSFD r_open(RSET ct, int flag) static void r_close(RSFD rfd) { - rfd_delete_base(rfd); } static void r_delete(RSET ct) @@ -79,8 +79,8 @@ static void r_pos(RSFD rfd, double *current, double *total) assert(rfd); assert(current); assert(total); - *total=0; - *current=0; + *total = 0; + *current = 0; } static int r_read(RSFD rfd, void *buf, TERMID *term) @@ -92,7 +92,7 @@ static int r_read(RSFD rfd, void *buf, TERMID *term) static int r_write(RSFD rfd, const void *buf) { - yaz_log (YLOG_FATAL, "NULL set type is read-only"); + yaz_log(YLOG_FATAL, "NULL set type is read-only"); return -1; } diff --git a/rset/rsprox.c b/rset/rsprox.c index 1a846d0..334a2f7 100644 --- a/rset/rsprox.c +++ b/rset/rsprox.c @@ -1,4 +1,4 @@ -/* $Id: rsprox.c,v 1.28 2005-05-03 09:11:36 adam Exp $ +/* $Id: rsprox.c,v 1.29 2005-05-24 11:35:43 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -55,8 +55,6 @@ static const struct rset_control control = }; struct rset_prox_info { - RSET *rset; /* array of 'child' rsets */ - int rset_no; /* how many of them */ int ordered; int exclusion; int relation; @@ -78,13 +76,10 @@ RSET rsprox_create(NMEM nmem, struct rset_key_control *kcontrol, int ordered, int exclusion, int relation, int distance) { - RSET rnew = rset_create_base(&control, nmem, kcontrol, scope,0); + RSET rnew = rset_create_base(&control, nmem, kcontrol, scope, 0, + rset_no, rset); struct rset_prox_info *info; info = (struct rset_prox_info *) nmem_malloc(rnew->nmem,sizeof(*info)); - info->rset = nmem_malloc(rnew->nmem,rset_no * sizeof(*info->rset)); - memcpy(info->rset, rset, - rset_no * sizeof(*info->rset)); - info->rset_no = rset_no; info->ordered = ordered; info->exclusion = exclusion; info->relation = relation; @@ -95,16 +90,10 @@ RSET rsprox_create(NMEM nmem, struct rset_key_control *kcontrol, static void r_delete (RSET ct) { - struct rset_prox_info *info = (struct rset_prox_info *) ct->priv; - int i; - - for (i = 0; irset_no; i++) - rset_delete(info->rset[i]); } static RSFD r_open (RSET ct, int flag) { - struct rset_prox_info *info = (struct rset_prox_info *) ct->priv; RSFD rfd; struct rset_prox_rfd *p; int i; @@ -116,25 +105,25 @@ static RSFD r_open (RSET ct, int flag) } rfd = rfd_create_base(ct); if (rfd->priv) - p=(struct rset_prox_rfd *)(rfd->priv); + p = (struct rset_prox_rfd *)(rfd->priv); else { p = (struct rset_prox_rfd *) nmem_malloc(ct->nmem,sizeof(*p)); rfd->priv = p; - p->more = nmem_malloc (ct->nmem,sizeof(*p->more) * info->rset_no); - p->buf = nmem_malloc(ct->nmem,sizeof(*p->buf) * info->rset_no); - p->terms = nmem_malloc(ct->nmem,sizeof(*p->terms) * info->rset_no); - for (i = 0; i < info->rset_no; i++) + p->more = nmem_malloc (ct->nmem,sizeof(*p->more) * ct->no_children); + p->buf = nmem_malloc(ct->nmem,sizeof(*p->buf) * ct->no_children); + p->terms = nmem_malloc(ct->nmem,sizeof(*p->terms) * ct->no_children); + for (i = 0; i < ct->no_children; i++) { p->buf[i] = nmem_malloc(ct->nmem,ct->keycontrol->key_size); p->terms[i] = 0; } - p->rfd = nmem_malloc(ct->nmem,sizeof(*p->rfd) * info->rset_no); + p->rfd = nmem_malloc(ct->nmem,sizeof(*p->rfd) * ct->no_children); } yaz_log(YLOG_DEBUG,"rsprox (%s) open [%p] n=%d", - ct->control->desc, rfd, info->rset_no); + ct->control->desc, rfd, ct->no_children); - for (i = 0; i < info->rset_no; i++) { - p->rfd[i] = rset_open (info->rset[i], RSETF_READ); + for (i = 0; i < ct->no_children; i++) { + p->rfd[i] = rset_open (ct->children[i], RSETF_READ); p->more[i] = rset_read (p->rfd[i], p->buf[i], &p->terms[i]); } p->hits = 0; @@ -143,20 +132,20 @@ static RSFD r_open (RSET ct, int flag) static void r_close (RSFD rfd) { - struct rset_prox_info *info = (struct rset_prox_info *)(rfd->rset->priv); - struct rset_prox_rfd *p=(struct rset_prox_rfd *)(rfd->priv); + RSET ct = rfd->rset; + struct rset_prox_rfd *p = (struct rset_prox_rfd *)(rfd->priv); int i; - for (i = 0; irset_no; i++) - rset_close (p->rfd[i]); - rfd_delete_base(rfd); + for (i = 0; ino_children; i++) + rset_close(p->rfd[i]); } static int r_forward(RSFD rfd, void *buf, TERMID *term, const void *untilbuf) { - struct rset_prox_info *info = (struct rset_prox_info *)(rfd->rset->priv); + RSET ct = rfd->rset; + struct rset_prox_info *info = (struct rset_prox_info *)(ct->priv); struct rset_prox_rfd *p = (struct rset_prox_rfd *)(rfd->priv); - const struct rset_key_control *kctrl = rfd->rset->keycontrol; + const struct rset_key_control *kctrl = ct->keycontrol; int cmp = 0; int i; @@ -173,7 +162,7 @@ static int r_forward(RSFD rfd, void *buf, TERMID *term, const void *untilbuf) { while (p->more[0]) { - for (i = 1; i < info->rset_no; i++) + for (i = 1; i < ct->no_children; i++) { if (!p->more[i]) { @@ -206,7 +195,7 @@ static int r_forward(RSFD rfd, void *buf, TERMID *term, const void *untilbuf) break; } } - if (i == info->rset_no) + if (i == ct->no_children) { memcpy (buf, p->buf[0], kctrl->key_size); if (term) @@ -217,7 +206,7 @@ static int r_forward(RSFD rfd, void *buf, TERMID *term, const void *untilbuf) } } } - else if (info->rset_no == 2) + else if (ct->no_children == 2) { while (p->more[0] && p->more[1]) { @@ -305,7 +294,7 @@ static int r_write (RSFD rfd, const void *buf) static void r_pos (RSFD rfd, double *current, double *total) { - struct rset_prox_info *info = (struct rset_prox_info *)(rfd->rset->priv); + RSET ct = rfd->rset; struct rset_prox_rfd *p = (struct rset_prox_rfd *)(rfd->priv); int i; double r = 0.0; @@ -314,7 +303,7 @@ static void r_pos (RSFD rfd, double *current, double *total) yaz_log(YLOG_DEBUG, "rsprox_pos"); - for (i = 0; i < info->rset_no; i++) + for (i = 0; i < ct->no_children; i++) { rset_pos(p->rfd[i], &cur, &tot); if (tot>0) { @@ -337,14 +326,10 @@ static void r_pos (RSFD rfd, double *current, double *total) i,*current, *total, r); } - - static void r_get_terms(RSET ct, TERMID *terms, int maxterms, int *curterm) { - struct rset_prox_info *info = - (struct rset_prox_info *) ct->priv; int i; - for (i = 0; irset_no; i++) - rset_getterms(info->rset[i], terms, maxterms, curterm); + for (i = 0; ino_children; i++) + rset_getterms(ct->children[i], terms, maxterms, curterm); } diff --git a/rset/rstemp.c b/rset/rstemp.c index c4b1b03..3ad1422 100644 --- a/rset/rstemp.c +++ b/rset/rstemp.c @@ -1,4 +1,4 @@ -/* $Id: rstemp.c,v 1.63 2005-05-03 09:11:36 adam Exp $ +/* $Id: rstemp.c,v 1.64 2005-05-24 11:35:43 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -51,7 +51,7 @@ static const struct rset_control control = rset_get_one_term, r_open, r_close, - rset_default_forward, + 0, /* no forward */ r_pos, r_read, r_write, @@ -83,7 +83,8 @@ static int log_level_initialized = 0; RSET rstemp_create(NMEM nmem, struct rset_key_control *kcontrol, int scope, const char *temp_path, TERMID term) { - RSET rnew = rset_create_base(&control, nmem, kcontrol, scope, term); + RSET rnew = rset_create_base(&control, nmem, kcontrol, scope, term, + 0, 0); struct rset_private *info; if (!log_level_initialized) { @@ -230,7 +231,6 @@ static void r_close(RSFD rfd) info->fd = -1; } } - rfd_delete_base(rfd); } diff --git a/test/api/t10.c b/test/api/t10.c index cd68776..56b68a2 100644 --- a/test/api/t10.c +++ b/test/api/t10.c @@ -1,4 +1,4 @@ -/* $Id: t10.c,v 1.7 2005-04-28 11:25:24 adam Exp $ +/* $Id: t10.c,v 1.8 2005-05-24 11:35:43 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -41,34 +41,32 @@ struct tst { struct tst tests[] = { - {"ntc-atn", "first title", 1000, "first title", 1000, "second title",862 }, - {"ntc-ntn", "first title", 1000, "first title", 1000, "second title",862 }, - {"ntc-btn", "first title", 1000, "first title", 1000, "second title",862 }, - {"ntc-apn", "first title", 1000, "first title", 1000, "second title",862 }, - {"ntc-npn", "first title", 1000, "first title", 1000, "second title",862 }, - {"ntc-bpn", "first title", 1000, "first title", 1000, "second title",862 }, - - {"atc-atn", "first title", 1000, "first title", 1000, "second title", 989 }, - {"atc-ntn", "first title", 1000, "first title", 1000, "second title", 989 }, - {"atc-btn", "first title", 1000, "first title", 1000, "second title", 989 }, - {"atc-apn", "first title", 1000, "first title", 1000, "second title", 989 }, - {"atc-npn", "first title", 1000, "first title", 1000, "second title", 989 }, - {"atc-bpn", "first title", 1000, "first title", 1000, "second title", 989 }, - - {"npc-atn", "first title", 1000, "first title", 1000, "second title", 862 }, - {"npc-ntn", "first title", 1000, "first title", 1000, "second title", 862 }, - {"npc-btn", "first title", 1000, "first title", 1000, "second title", 862 }, - {"npc-apn", "first title", 1000, "first title", 1000, "second title", 862 }, - {"npc-npn", "first title", 1000, "first title", 1000, "second title", 862 }, - {"npc-bpn", "first title", 1000, "first title", 1000, "second title", 862 }, - - {"apc-atn", "first title", 1000, "first title", 1000, "second title", 989 }, - {"apc-ntn", "first title", 1000, "first title", 1000, "second title", 989 }, - {"apc-btn", "first title", 1000, "first title", 1000, "second title", 989 }, - {"apc-apn", "first title", 1000, "first title", 1000, "second title", 989 }, - {"apc-npn", "first title", 1000, "first title", 1000, "second title", 989 }, - {"apc-bpn", "first title", 1000, "first title", 1000, "second title", 989 }, - + {"ntc-atn", "first title", 0, "first title", 1000, "first title",1000 }, + {"ntc-ntn", "first title", 0, "first title", 1000, "first title",1000 }, + {"ntc-btn", "first title", 0, "first title", 1000, "first title",1000 }, + {"ntc-apn", "first title", 0, "first title", 1000, "first title",1000 }, + {"ntc-npn", "first title", 0, "first title", 1000, "first title",1000 }, + {"ntc-bpn", "first title", 0, "first title", 1000, "first title",1000 }, + {"atc-atn", "first title", 0, "first title", 1000, "first title", 1000 }, + {"atc-ntn", "first title", 0, "first title", 1000, "first title", 1000 }, + {"atc-btn", "first title", 0, "first title", 1000, "first title", 1000 }, + {"atc-apn", "first title", 0, "first title", 1000, "first title", 1000 }, + {"atc-npn", "first title", 0, "first title", 1000, "first title", 1000 }, + {"atc-bpn", "first title", 0, "first title", 1000, "first title", 1000 }, + + {"npc-atn", "first title", 0, "first title", 1000, "first title", 1000 }, + {"npc-ntn", "first title", 0, "first title", 1000, "first title", 1000 }, + {"npc-btn", "first title", 0, "first title", 1000, "first title", 1000 }, + {"npc-apn", "first title", 0, "first title", 1000, "first title", 1000 }, + {"npc-npn", "first title", 0, "first title", 1000, "first title", 1000 }, + {"npc-bpn", "first title", 0, "first title", 1000, "first title", 1000 }, + + {"apc-atn", "first title", 0, "first title", 1000, "first title", 1000 }, + {"apc-ntn", "first title", 0, "first title", 1000, "first title", 1000 }, + {"apc-btn", "first title", 0, "first title", 1000, "first title", 1000 }, + {"apc-apn", "first title", 0, "first title", 1000, "first title", 1000 }, + {"apc-npn", "first title", 0, "first title", 1000, "first title", 1000 }, + {"apc-bpn", "first title", 0, "first title", 1000, "first title", 1000 }, {0,0,0,0,0,0,0}, }; @@ -78,16 +76,14 @@ int main(int argc, char **argv) ZebraService zs = start_up("zebrazv.cfg", argc, argv); ZebraHandle zh = zebra_open (zs); - int loglevel = yaz_log_mask_str("zvrank,rank1,t10"); init_data(zh, recs); zebra_close(zh); - yaz_log_init_level(loglevel); for (i = 0; tests[i].schema; i++) { zh = zebra_open (zs); zebra_select_database(zh, "Default"); zebra_set_resource(zh, "zvrank.weighting-scheme", tests[i].schema); - yaz_log(loglevel,"============%d: %s ===========", i, tests[i].schema); + yaz_log(YLOG_LOG,"============%d: %s ===========", i, tests[i].schema); ranking_query( __LINE__, zh, "@attr 1=1016 @attr 2=102 the", 3, tests[i].hit1, tests[i].score1); diff --git a/test/api/t9.c b/test/api/t9.c index 014045d..435991e 100644 --- a/test/api/t9.c +++ b/test/api/t9.c @@ -1,4 +1,4 @@ -/* $Id: t9.c,v 1.5 2005-01-15 19:38:35 adam Exp $ +/* $Id: t9.c,v 1.6 2005-05-24 11:35:43 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -37,7 +37,7 @@ int main(int argc, char **argv) init_data(zh, recs); qry( zh, "@attr 1=1016 @attr 2=102 the", - 3, "first title", 872 ); + 3, "first title", 997 ); qry( zh, "@attr 1=1016 @attr 2=102 foo", 3, "second title", 850 ); @@ -45,7 +45,7 @@ int main(int argc, char **argv) /* get the record with the most significant hit, that is the 'bar' */ /* as that is the rarest of my search words */ qry( zh, "@attr 1=1016 @attr 2=102 @or @or the foo bar", - 3, "third title", 895 ); + 3, "third title", 940 ); return close_down(zh, zs, 0); } -- 1.7.10.4