multiand seesm to work. Is used for and-lists (@attr 4=6)
authorHeikki Levanto <heikki@indexdata.dk>
Tue, 28 Sep 2004 16:39:46 +0000 (16:39 +0000)
committerHeikki Levanto <heikki@indexdata.dk>
Tue, 28 Sep 2004 16:39:46 +0000 (16:39 +0000)
include/rset.h
index/zrpn.c
rset/rsmultiandor.c

index 48dfb65..fad81d0 100644 (file)
@@ -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, 
index c7cb156..9f9a0a8 100644 (file)
@@ -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; i<rset_no; i++)
-        result= rsbool_create_and(rset_nmem,key_it_ctrl,key_it_ctrl->scope,
-                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,
index 2caa88b..7b6b69a 100644 (file)
@@ -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; i<info->no_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; i<info->no_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)