X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=rset%2Frsmultiandor.c;h=4f4bdcdd6d745c59cbd883c580bbd248f31b5f73;hb=3c547fb0a2e275ef21871d865116e288114c0910;hp=fceb7727b7559d59862c57c7329dc7badb88e9fc;hpb=c5bc0f71fe718b3c66d86b48b1b8669278e94c18;p=idzebra-moved-to-github.git diff --git a/rset/rsmultiandor.c b/rset/rsmultiandor.c index fceb772..4f4bdcd 100644 --- a/rset/rsmultiandor.c +++ b/rset/rsmultiandor.c @@ -1,4 +1,4 @@ -/* $Id: rsmultiandor.c,v 1.6 2004-10-15 10:07:34 heikki Exp $ +/* $Id: rsmultiandor.c,v 1.7 2004-10-22 10:12:52 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -55,11 +55,13 @@ static int r_forward_and(RSFD rfd, void *buf, TERMID *term, static int r_forward_or(RSFD rfd, void *buf, TERMID *term, const void *untilbuf); static void r_pos (RSFD rfd, double *current, double *total); +static void r_get_terms(RSET ct, TERMID *terms, int maxterms, int *curterm); static const struct rset_control control_or = { "multi-or", r_delete, + r_get_terms, r_open_or, r_close, r_forward_or, @@ -71,6 +73,7 @@ static const struct rset_control control_and = { "multi-and", r_delete, + r_get_terms, r_open_and, r_close, r_forward_and, @@ -579,3 +582,26 @@ static int r_write (RSFD rfd, const void *buf) logf (LOG_FATAL, "multior set type is read-only"); return -1; } + +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_multiandor_info *info = + (struct rset_multiandor_info *) ct->priv; + int firstterm= *curterm; + int i; + for (i=0;ino_rsets;i++) + { + rset_getterms(info->rsets[i], terms, maxterms, curterm); + yaz_log(LOG_DEBUG,"rsmulti: getterms: i=%d *cur=%d",i,*curterm); + /* FIXME - remove this log once we know it works */ + if ( ( (*curterm) > firstterm+1 ) && + ( (*curterm) <= maxterms ) && + ( terms[(*curterm)-1] == terms[firstterm] ) ) + *curterm--; /* forget the term, seen that before */ + } +} + +