Added isc_type, isc_block macros.
[idzebra-moved-to-github.git] / index / zrpn.c
index 7ef2f44..1099c27 100644 (file)
@@ -4,7 +4,16 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: zrpn.c,v $
- * Revision 1.51  1996-06-11 10:54:15  quinn
+ * Revision 1.54  1996-10-29 14:09:52  adam
+ * Use of cisam system - enabled if setting isamc is 1.
+ *
+ * Revision 1.53  1996/06/26 09:21:43  adam
+ * Bug fix: local attribute set wasn't obeyed in scan.
+ *
+ * Revision 1.52  1996/06/17  14:26:20  adam
+ * Function gen_regular_rel changed to handle negative numbers.
+ *
+ * Revision 1.51  1996/06/11 10:54:15  quinn
  * Relevance work
  *
  * Revision 1.50  1996/06/07  08:51:53  adam
 
 #include <charmap.h>
 #include <rsisam.h>
+#include <rsisamc.h>
 #include <rstemp.h>
 #include <rsnull.h>
 #include <rsbool.h>
@@ -198,6 +208,27 @@ typedef struct {
     Z_AttributesPlusTerm *zapt;
 } AttrType;
 
+static RSET rset_create_isamx (ZServerInfo *zi, int pos)
+{
+    if (zi->isam)
+    {
+        rset_isam_parms parms;
+
+        parms.pos = pos;
+        parms.is = zi->isam;
+        return rset_create (rset_kind_isam, &parms);
+    }
+    if (zi->isamc)
+    {
+        rset_isamc_parms parms;
+
+        parms.pos = pos;
+        parms.is = zi->isamc;
+        return rset_create (rset_kind_isamc, &parms);
+    }
+    return rset_create (rset_kind_null, NULL);
+}
+
 static int attr_find (AttrType *src, oid_value *attributeSetP)
 {
     while (src->major < src->zapt->num_attributes)
@@ -489,7 +520,7 @@ static int isam_trunc_cmp (const void *p1, const void *p2)
 
 static RSET rset_trunc (ISAM isam, ISAM_P *isam_p, int no)
 {
-
+    assert (isam);
     qsort (isam_p, no, sizeof(*isam_p), isam_trunc_cmp);
     return rset_trunc_r (isam, isam_p, 0, no, 100);
 }
@@ -544,19 +575,45 @@ static void add_isam_p (const char *info, struct grep_info *p)
 
 static int grep_handle (char *name, const char *info, void *p)
 {
-    logf (LOG_DEBUG, "dict name: %s", name);
     add_isam_p (info, p);
     return 0;
 }
 
+/* gen_regular_rel - generate regular expression from relation
+ *  val:     border value (inclusive)
+ *  islt:    1 if <=; 0 if >=.
+ */
 static void gen_regular_rel (char *dst, int val, int islt)
 {
-    int dst_p = 1;
+    int dst_p;
     int w, d, i;
     int pos = 0;
     char numstr[20];
 
-    *dst = '(';
+    logf (LOG_DEBUG, "gen_regular_rel. val=%d, islt=%d", val, islt);
+    if (val >= 0)
+    {
+        if (islt)
+            strcpy (dst, "(-[0-9]+|");
+        else
+            strcpy (dst, "(");
+    } 
+    else
+    {
+        if (!islt)
+        {
+            strcpy (dst, "([0-9]+|-");
+            dst_p = strlen (dst);
+            islt = 1;
+        }
+        else
+        {
+            strcpy (dst, "(-");
+            islt = 0;
+        }
+        val = -val;
+    }
+    dst_p = strlen (dst);
     sprintf (numstr, "%d", val);
     for (w = strlen(numstr); --w >= 0; pos++)
     {
@@ -677,7 +734,7 @@ static int relational_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt,
         return 0;
     }
     logf (LOG_DEBUG, "dict_lookup_grep: %s", term_dict);
-    r = dict_lookup_grep (zi->wordDict, term_dict, 0, grep_info, max_pos,
+    r = dict_lookup_grep (zi->dict, term_dict, 0, grep_info, max_pos,
                           0, grep_handle);
     if (r)
         logf (LOG_WARN, "dict_lookup_grep fail, rel=gt: %d", r);
@@ -774,7 +831,7 @@ static int field_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt,
                 for (i = 0; term_sub[i]; i++)
                     verbatim_char (term_sub[i], &j, term_dict);
                 strcpy (term_dict+j, ")");
-                r = dict_lookup_grep (zi->wordDict, term_dict, 0, grep_info,
+                r = dict_lookup_grep (zi->dict, term_dict, 0, grep_info,
                                       &max_pos, 0, grep_handle);
                 if (r)
                     logf (LOG_WARN, "dict_lookup_grep err, trunc=none:%d", r);
@@ -784,7 +841,7 @@ static int field_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt,
                 for (i = 0; term_sub[i]; i++)
                     verbatim_char (term_sub[i], &j, term_dict);
                 strcpy (term_dict+j, ".*)");
-                dict_lookup_grep (zi->wordDict, term_dict, 0, grep_info,
+                dict_lookup_grep (zi->dict, term_dict, 0, grep_info,
                                   &max_pos, 0, grep_handle);
                 break;
             case 2:          /* left truncation */
@@ -802,7 +859,7 @@ static int field_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt,
                     else
                         verbatim_char (term_sub[i], &j, term_dict);
                 strcpy (term_dict+j, ")");
-                r = dict_lookup_grep (zi->wordDict, term_dict, 0, grep_info,
+                r = dict_lookup_grep (zi->dict, term_dict, 0, grep_info,
                                       &max_pos, 0, grep_handle);
                 if (r)
                     logf (LOG_WARN, "dict_lookup_grep err, trunc=#: %d",
@@ -810,7 +867,7 @@ static int field_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt,
                 break;
             case 102:        /* regular expression */
                sprintf (term_dict + j, "(%s)", term_sub);
-                r = dict_lookup_grep (zi->wordDict, term_dict, 0, grep_info,
+                r = dict_lookup_grep (zi->dict, term_dict, 0, grep_info,
                                       &max_pos, 0, grep_handle);
                 if (r)
                     logf (LOG_WARN, "dict_lookup_grep err, trunc=regular: %d",
@@ -825,7 +882,7 @@ static int field_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt,
                     cp += 2;
                 }
                sprintf (term_dict + j, "(%s)", cp);
-                r = dict_lookup_grep (zi->wordDict, term_dict, r, grep_info,
+                r = dict_lookup_grep (zi->dict, term_dict, r, grep_info,
                                       &max_pos, j, grep_handle);
                 if (r)
                     logf (LOG_WARN, "dict_lookup_grep err, trunc=eregular: %d",
@@ -896,7 +953,7 @@ static RSET rpn_search_APT_relevance (ZServerInfo *zi,
     parms.key_size = sizeof(struct it_key);
     parms.max_rec = 100;
     parms.cmp = key_compare;
-    parms.is = zi->wordIsam;
+    parms.is = zi->isam;
     parms.no_terms = 0;
 
     if (zapt->term->which != Z_Term_general)
@@ -967,7 +1024,6 @@ static RSET rpn_search_APT_cphrase (ZServerInfo *zi,
                                     oid_value attributeSet,
                                     int num_bases, char **basenames)
 {
-    rset_isam_parms parms;
     char termz[IT_MAX_WORD+1];
     struct grep_info grep_info;
     RSET result;
@@ -993,12 +1049,10 @@ static RSET rpn_search_APT_cphrase (ZServerInfo *zi,
         result = rset_create (rset_kind_null, NULL);
     else if (grep_info.isam_p_indx == 1)
     {
-        parms.is = zi->wordIsam;
-        parms.pos = *grep_info.isam_p_buf;
-        result = rset_create (rset_kind_isam, &parms);
+        result = rset_create_isamx (zi, *grep_info.isam_p_buf);
     }
     else
-        result = rset_trunc (zi->wordIsam, grep_info.isam_p_buf,
+        result = rset_trunc (zi->isam, grep_info.isam_p_buf,
                              grep_info.isam_p_indx);
 #ifdef TERM_COUNT
     xfree(grep_info.term_no);
@@ -1154,16 +1208,12 @@ static RSET rpn_search_APT_phrase (ZServerInfo *zi,
         if (grep_info.isam_p_indx == 0)
             rset[rset_no] = rset_create (rset_kind_null, NULL);
         else if (grep_info.isam_p_indx > 1)
-            rset[rset_no] = rset_trunc (zi->wordIsam,
+            rset[rset_no] = rset_trunc (zi->isam,
                                         grep_info.isam_p_buf,
                                         grep_info.isam_p_indx);
         else
         {
-            rset_isam_parms parms;
-            
-            parms.is = zi->wordIsam;
-            parms.pos = *grep_info.isam_p_buf;
-            rset[rset_no] = rset_create (rset_kind_isam, &parms);
+            rset[rset_no] = rset_create_isamx (zi, *grep_info.isam_p_buf);
         }
         assert (rset[rset_no]);
         if (++rset_no >= sizeof(rset)/sizeof(*rset))
@@ -1391,6 +1441,7 @@ void count_set_save (RSET *r, int *count)
     rfd = rset_open (*r, RSETF_READ|RSETF_SORT_SYSNO);
     while (rset_read (*r, rfd, &key))
     {
+        logf (LOG_DEBUG, "sysno=%-7d seqno=%d", key.sysno, key.seqno);
         if (key.sysno != psysno)
         {
             rset_write (w, wfd, &key);
@@ -1437,7 +1488,7 @@ int rpn_search (ZServerInfo *zi,
     oident *attrset;
     oid_value attributeSet;
 
-    dict_grep_cmap (zi->wordDict, map_chrs_input);
+    dict_grep_cmap (zi->dict, map_chrs_input);
     zlog_rpn (rpn);
 
     zi->errCode = 0;
@@ -1531,17 +1582,17 @@ int rpn_scan (ZServerInfo *zi, Z_AttributesPlusTerm *zapt,
 
     logf (LOG_DEBUG, "scan, position = %d, num = %d", pos, num);
 
+    if (attributeset == VAL_NONE)
+        attributeset = VAL_BIB1;
+        
     attr_init (&use, zapt, 1);
-    use_value = attr_find (&use, NULL);
+    use_value = attr_find (&use, &attributeset);
     logf (LOG_DEBUG, "use value %d", use_value);
 
     attr_init (&completeness, zapt, 6);
     completeness_value = attr_find (&completeness, NULL);
     logf (LOG_DEBUG, "completeness value %d", completeness_value);
 
-    if (attributeset == VAL_NONE)
-        attributeset = VAL_BIB1;
-        
     if (use_value == -1)
         use_value = 1016;
     for (base_no = 0; base_no < num_bases && ord_no < 32; base_no++)
@@ -1599,7 +1650,7 @@ int rpn_scan (ZServerInfo *zi, Z_AttributesPlusTerm *zapt,
 
         trans_scan_term (zi, zapt, termz+prefix_len);
                     
-        dict_scan (zi->wordDict, termz, &before_tmp, &after_tmp, scan_info,
+        dict_scan (zi->dict, termz, &before_tmp, &after_tmp, scan_info,
                    scan_handle);
     }
     glist = odr_malloc (zi->odr, (before+after)*sizeof(*glist));
@@ -1613,7 +1664,6 @@ int rpn_scan (ZServerInfo *zi, Z_AttributesPlusTerm *zapt,
         const char *mterm = NULL;
         const char *tst;
         RSET rset;
-        rset_isam_parms parms;
         
         for (j = 0; j < ord_no; j++)
         {
@@ -1628,9 +1678,8 @@ int rpn_scan (ZServerInfo *zi, Z_AttributesPlusTerm *zapt,
         if (j0 == -1)
             break;
         scan_term_untrans (zi->odr, &glist[i+before].term, mterm);
-        parms.is = zi->wordIsam;
-        parms.pos = scan_info_array[j0].list[ptr[j0]].isam_p;
-        rset = rset_create (rset_kind_isam, &parms);
+        rset =
+            rset_create_isamx (zi, scan_info_array[j0].list[ptr[j0]].isam_p);
 
         ptr[j0]++;
         for (j = j0+1; j<ord_no; j++)
@@ -1639,13 +1688,11 @@ int rpn_scan (ZServerInfo *zi, Z_AttributesPlusTerm *zapt,
                 (tst=scan_info_array[j].list[ptr[j]].term) &&
                 !strcmp (tst, mterm))
             {
-                rset_isam_parms parms;
                 rset_bool_parms bool_parms;
                 RSET rset2;
 
-                parms.is = zi->wordIsam;
-                parms.pos = scan_info_array[j].list[ptr[j]].isam_p;
-                rset2 = rset_create (rset_kind_isam, &parms);
+                rset2 = rset_create_isamx
+                         (zi, scan_info_array[j].list[ptr[j]].isam_p);
 
                 bool_parms.key_size = sizeof(struct it_key);
                 bool_parms.cmp = key_compare;
@@ -1675,7 +1722,6 @@ int rpn_scan (ZServerInfo *zi, Z_AttributesPlusTerm *zapt,
         const char *mterm = NULL;
         const char *tst;
         RSET rset;
-        rset_isam_parms parms;
         
         for (j = 0; j <ord_no; j++)
         {
@@ -1692,9 +1738,8 @@ int rpn_scan (ZServerInfo *zi, Z_AttributesPlusTerm *zapt,
 
         scan_term_untrans (zi->odr, &glist[before-1-i].term, mterm);
 
-        parms.is = zi->wordIsam;
-        parms.pos = scan_info_array[j0].list[before-1-ptr[j0]].isam_p;
-        rset = rset_create (rset_kind_isam, &parms);
+        rset = rset_create_isamx
+                  (zi, scan_info_array[j0].list[before-1-ptr[j0]].isam_p);
 
         ptr[j0]++;
 
@@ -1704,13 +1749,11 @@ int rpn_scan (ZServerInfo *zi, Z_AttributesPlusTerm *zapt,
                 (tst=scan_info_array[j].list[before-1-ptr[j]].term) &&
                 !strcmp (tst, mterm))
             {
-                rset_isam_parms parms;
                 rset_bool_parms bool_parms;
                 RSET rset2;
 
-                parms.is = zi->wordIsam;
-                parms.pos = scan_info_array[j].list[before-1-ptr[j]].isam_p;
-                rset2 = rset_create (rset_kind_isam, &parms);
+                rset2 = rset_create_isamx (zi,
+                            scan_info_array[j].list[before-1-ptr[j]].isam_p);
 
                 bool_parms.key_size = sizeof(struct it_key);
                 bool_parms.cmp = key_compare;