From 6f514a5c6e5430d6bd9cc036e0faaa4477d04410 Mon Sep 17 00:00:00 2001 From: Heikki Levanto Date: Tue, 28 Sep 2004 16:39:46 +0000 Subject: [PATCH] multiand seesm to work. Is used for and-lists (@attr 4=6) --- include/rset.h | 12 ++++++++---- index/zrpn.c | 15 ++++++--------- rset/rsmultiandor.c | 34 +++++++++++++++++++++++++++++++--- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/include/rset.h b/include/rset.h index 48dfb65..fad81d0 100644 --- a/include/rset.h +++ b/include/rset.h @@ -1,4 +1,4 @@ -/* $Id: rset.h,v 1.34 2004-09-09 10:08:04 heikki Exp $ +/* $Id: rset.h,v 1.35 2004-09-28 16:39:46 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -166,14 +166,18 @@ RSET rsbool_create_not( NMEM nmem, const struct key_control *kcontrol, int scope, RSET rset_l, RSET rset_r); -RSET rsbetween_create( NMEM nmem, const struct key_control *kcontrol, +RSET rsbetween_create( NMEM nmem, const struct key_control *kcontrol, int scope, RSET rset_l, RSET rset_m, RSET rset_r, RSET rset_attr); -RSET rsmultior_create( NMEM nmem, const struct key_control *kcontrol, +RSET rsmultior_create( NMEM nmem, const struct key_control *kcontrol, int scope, - int no_rsets, RSET* rsets); + int no_rsets, RSET* rsets); + +RSET rsmultiand_create( NMEM nmem, const struct key_control *kcontrol, + int scope, + int no_rsets, RSET* rsets); RSET rsprox_create( NMEM nmem, const struct key_control *kcontrol, int scope, diff --git a/index/zrpn.c b/index/zrpn.c index c7cb156..9f9a0a8 100644 --- a/index/zrpn.c +++ b/index/zrpn.c @@ -1,4 +1,4 @@ -/* $Id: zrpn.c,v 1.153 2004-09-15 08:13:51 adam Exp $ +/* $Id: zrpn.c,v 1.154 2004-09-28 16:39:46 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -1464,8 +1464,8 @@ static RSET rpn_search_APT_and_list (ZebraHandle zh, NMEM rset_nmem) { char term_dst[IT_MAX_WORD+1]; - RSET rset[60], result; - int i, rset_no = 0; + RSET rset[60]; /* FIXME - bug 160 - should be dynamic somehow */ + int rset_no = 0; struct grep_info grep_info; char *termz = normalize_term(zh, zapt, termz_org, stream, reg_type); const char *termp = termz; @@ -1490,12 +1490,9 @@ static RSET rpn_search_APT_and_list (ZebraHandle zh, grep_info_delete (&grep_info); if (rset_no == 0) return rsnull_create (rset_nmem,key_it_ctrl); - result = rset[0]; - /* FIXME - Use a proper rsmultiand */ - for (i = 1; iscope, - result, rset[i] ); - return result; + + return rsmultiand_create( rset_nmem, key_it_ctrl, key_it_ctrl->scope, + rset_no, rset); } static int numeric_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, diff --git a/rset/rsmultiandor.c b/rset/rsmultiandor.c index 2caa88b..7b6b69a 100644 --- a/rset/rsmultiandor.c +++ b/rset/rsmultiandor.c @@ -1,4 +1,4 @@ -/* $Id: rsmultiandor.c,v 1.2 2004-09-28 16:12:42 heikki Exp $ +/* $Id: rsmultiandor.c,v 1.3 2004-09-28 16:39:46 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -500,8 +500,36 @@ static int r_read_and (RSFD rfd, void *buf) static int r_forward_and(RSFD rfd, void *buf, const void *untilbuf) -{ - return 0; +{ + struct rset_multiandor_rfd *p=rfd->priv; + const struct key_control *kctrl=rfd->rset->keycontrol; + struct rset_multiandor_info *info=rfd->rset->priv; + int i; + int cmp; + int killtail=0; + + for (i=0; ino_rsets;i++) + { + cmp=(*kctrl->cmp)(p->items[i].buf,untilbuf); + if ( cmp <= -rfd->rset->scope ) + { + killtail=1; /* we are moving to a different hit */ + if (!rset_forward(p->items[i].fd, p->items[i].buf, + untilbuf)) + { + p->eof=1; /* game over */ + p->tailcount=0; + return 0; + } + } + } + if (killtail) + { + for (i=0; ino_rsets;i++) + p->tailbits[i]=0; + p->tailcount=0; + } + return r_read_and(rfd,buf); } static void r_pos (RSFD rfd, double *current, double *total) -- 1.7.10.4