Minor changes. Dictionary is lower case now.
[idzebra-moved-to-github.git] / index / zrpn.c
index 46d7afd..6a30f80 100644 (file)
@@ -1,10 +1,22 @@
 /*
- * Copyright (C) 1995, Index Data I/S 
+ * Copyright (C) 1994-1995, Index Data I/S 
  * All rights reserved.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: zrpn.c,v $
- * Revision 1.5  1995-09-06 10:33:04  adam
+ * Revision 1.8  1995-09-08 14:52:27  adam
+ * Minor changes. Dictionary is lower case now.
+ *
+ * Revision 1.7  1995/09/07  13:58:36  adam
+ * New parameter: result-set file descriptor (RSFD) to support multiple
+ * positions within the same result-set.
+ * Boolean operators: and, or, not implemented.
+ * Result-set references.
+ *
+ * Revision 1.6  1995/09/06  16:11:18  adam
+ * Option: only one word key per file.
+ *
+ * Revision 1.5  1995/09/06  10:33:04  adam
  * More work on present. Some log messages removed.
  *
  * Revision 1.4  1995/09/05  15:28:40  adam
 #include <rsisam.h>
 #include <rstemp.h>
 #include <rsnull.h>
+#include <rsbool.h>
 
 static RSET rpn_search_APT (ZServerInfo *zi, Z_AttributesPlusTerm *zapt)
 {
-    char termz[256];
+    char termz[IT_MAX_WORD+1];
     size_t sizez;
     struct rset_isam_parms parms;
     const char *info;
+    int i;
     Z_Term *term = zapt->term;
 
     if (term->which != Z_Term_general)
         return NULL; 
     sizez = term->u.general->len;
-    if (sizez > 255)
-        sizez = 255;
-    memcpy (termz, term->u.general->buf, sizez);
-    termz[sizez] = '\0';
+    if (sizez > IT_MAX_WORD)
+        sizez = IT_MAX_WORD;
+    for (i = 0; i<sizez; i++)
+        termz[i] = index_char_cvt (term->u.general->buf[i]);
+    termz[i] = '\0';
     logf (LOG_DEBUG, "dict_lookup: %s", termz);
     if (!(info = dict_lookup (zi->wordDict, termz)))
         return rset_create (rset_kind_null, NULL);
@@ -57,85 +72,41 @@ static RSET rpn_search_APT (ZServerInfo *zi, Z_AttributesPlusTerm *zapt)
     return rset_create (rset_kind_isam, &parms);
 }
 
-static RSET rpn_search_and (ZServerInfo *zi, RSET r_l, RSET r_r)
-{
-    struct it_key k1, k2;
-    RSET r_dst;
-    int i1, i2;
-    rset_open (r_l, 0);
-    rset_open (r_r, 0);
-    r_dst = rset_create (rset_kind_temp, NULL);
-    rset_open (r_dst, 1);
-    
-    i1 = rset_read (r_l, &k1);
-    i2 = rset_read (r_r, &k2);
-    while (i1 && i2)
-    {
-        if (k1.sysno > k2.sysno)
-            i2 = rset_read (r_r, &k2);
-        else if (k1.sysno < k2.sysno)
-            i1 = rset_read (r_l, &k1);
-        else if (!(i1 = key_compare_x (&k1, &k2)))
-        {
-            rset_write (r_dst, &k1);
-            i1 = rset_read (r_l, &k1);
-            i2 = rset_read (r_r, &k2);
-        }
-        else if (i1 > 0)
-        {
-            rset_write (r_dst, &k2);
-            i2 = rset_read (r_r, &k2);
-        }
-        else
-        {
-            rset_write (r_dst, &k1);
-            i1 = rset_read (r_l, &k1);
-        }
-    } 
-    rset_close (r_dst);
-    return r_dst;
-}
-
-static RSET rpn_search_or (ZServerInfo *zi, RSET r_l, RSET r_r)
-{
-    return r_l;
-}
-
-static RSET rpn_search_not (ZServerInfo *zi, RSET r_l, RSET r_r)
-{
-    return r_l;
-}
-
 static RSET rpn_search_ref (ZServerInfo *zi, Z_ResultSetId *resultSetId)
 {
-    return NULL;
+    ZServerSet *s;
+
+    if (!(s = resultSetGet (zi, resultSetId)))
+        return rset_create (rset_kind_null, NULL);
+    return s->rset;
 }
 
 static RSET rpn_search_structure (ZServerInfo *zi, Z_RPNStructure *zs)
 {
-    RSET r;
+    RSET r = NULL;
     if (zs->which == Z_RPNStructure_complex)
     {
-        RSET r_l, r_r;
+        rset_bool_parms bool_parms;
 
-        r_l = rpn_search_structure (zi, zs->u.complex->s1);
-        r_r = rpn_search_structure (zi, zs->u.complex->s2);
+        bool_parms.rset_l = rpn_search_structure (zi, zs->u.complex->s1);
+        bool_parms.rset_r = rpn_search_structure (zi, zs->u.complex->s2);
+        bool_parms.key_size = sizeof(struct it_key);
+        bool_parms.cmp = key_compare;
 
         switch (zs->u.complex->operator->which)
         {
         case Z_Operator_and:
-            rset_delete (r_r);
+            r = rset_create (rset_kind_and, &bool_parms);
             break;
         case Z_Operator_or:
-            rset_delete (r_r);
+            r = rset_create (rset_kind_or, &bool_parms);
             break;
         case Z_Operator_and_not:
-            rset_delete (r_r);
+            r = rset_create (rset_kind_not, &bool_parms);
             break;
         default:
             assert (0);
         }
-        r = r_l;
     }
     else if (zs->which == Z_RPNStructure_simple)
     {
@@ -169,6 +140,7 @@ static RSET rpn_save_set (RSET r, int *count)
 #endif
     int psysno = 0;
     struct it_key key;
+    RSFD rfd;
 
     logf (LOG_DEBUG, "rpn_save_set");
     *count = 0;
@@ -178,8 +150,8 @@ static RSET rpn_save_set (RSET r, int *count)
     rset_open (d, 1);
 #endif
 
-    rset_open (r, 0);
-    while (rset_read (r, &key))
+    rfd = rset_open (r, 0);
+    while (rset_read (r, rfd, &key))
     {
         if (key.sysno != psysno)
         {
@@ -190,7 +162,7 @@ static RSET rpn_save_set (RSET r, int *count)
         rset_write (d, &key);
 #endif
     }
-    rset_close (r);
+    rset_close (r, rfd);
 #if 0
     rset_close (d);
 #endif