Added charmap facility to delete leading articles
[idzebra-moved-to-github.git] / index / zrpn.c
index fc43193..dea6c98 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: zrpn.c,v 1.147 2004-08-31 10:43:35 heikki Exp $
+/* $Id: zrpn.c,v 1.152 2004-09-14 14:38:07 quinn Exp $
    Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004
    Index Data Aps
 
@@ -34,12 +34,19 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include <zebra_xpath.h>
 
 #include <charmap.h>
-#include <rstemp.h>
-#include <rsnull.h>
-#include <rsbool.h>
-#include <rsmultior.h>
-#include <rsbetween.h>
-#include <rsprox.h>
+#include <rset.h>
+
+
+static const struct key_control it_ctrl = { 
+    sizeof(struct it_key),
+    2, /* we have sysnos and seqnos in this key, nothing more */
+    key_compare_it, 
+    key_logdump_txt,   /* FIXME  - clean up these functions */
+    key_get_seq,
+};
+
+
+const struct key_control *key_it_ctrl = &it_ctrl;
 
 struct rpn_char_map_info {
     ZebraMaps zm;
@@ -57,7 +64,7 @@ typedef struct {
 static const char **rpn_char_map_handler (void *vp, const char **from, int len)
 {
     struct rpn_char_map_info *p = (struct rpn_char_map_info *) vp;
-    const char **out = zebra_maps_input (p->zm, p->reg_type, from, len);
+    const char **out = zebra_maps_input (p->zm, p->reg_type, from, len, 0);
 #if 0
     if (out && *out)
     {
@@ -254,7 +261,7 @@ static int grep_handle (char *name, const char *info, void *p)
 }
 
 static int term_pre (ZebraMaps zebra_maps, int reg_type, const char **src,
-                     const char *ct1, const char *ct2)
+                     const char *ct1, const char *ct2, int first)
 {
     const char *s1, *s0 = *src;
     const char **map;
@@ -267,7 +274,7 @@ static int term_pre (ZebraMaps zebra_maps, int reg_type, const char **src,
         if (ct2 && strchr (ct2, *s0))
             break;
         s1 = s0;
-        map = zebra_maps_input (zebra_maps, reg_type, &s1, strlen(s1));
+        map = zebra_maps_input (zebra_maps, reg_type, &s1, strlen(s1), first);
         if (**map != *CHR_SPACE)
             break;
         s0 = s1;
@@ -291,13 +298,13 @@ static int term_100 (ZebraMaps zebra_maps, int reg_type,
     const char *space_start = 0;
     const char *space_end = 0;
 
-    if (!term_pre (zebra_maps, reg_type, src, NULL, NULL))
+    if (!term_pre (zebra_maps, reg_type, src, NULL, NULL, !space_split))
         return 0;
     s0 = *src;
     while (*s0)
     {
         s1 = s0;
-        map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0));
+        map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0), 0);
         if (space_split)
         {
             if (**map == *CHR_SPACE)
@@ -349,7 +356,7 @@ static int term_101 (ZebraMaps zebra_maps, int reg_type,
     int i = 0;
     int j = 0;
 
-    if (!term_pre (zebra_maps, reg_type, src, "#", "#"))
+    if (!term_pre (zebra_maps, reg_type, src, "#", "#", !space_split))
         return 0;
     s0 = *src;
     while (*s0)
@@ -363,7 +370,7 @@ static int term_101 (ZebraMaps zebra_maps, int reg_type,
         else
         {
             s1 = s0;
-            map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0));
+            map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0), 0);
             if (space_split && **map == *CHR_SPACE)
                 break;
             while (s1 < s0)
@@ -391,7 +398,7 @@ static int term_103 (ZebraMaps zebra_maps, int reg_type, const char **src,
     const char *s0, *s1;
     const char **map;
 
-    if (!term_pre (zebra_maps, reg_type, src, "^\\()[].*+?|", "("))
+    if (!term_pre (zebra_maps, reg_type, src, "^\\()[].*+?|", "(", !space_split))
         return 0;
     s0 = *src;
     if (errors && *s0 == '+' && s0[1] && s0[2] == '+' && s0[3] &&
@@ -412,7 +419,7 @@ static int term_103 (ZebraMaps zebra_maps, int reg_type, const char **src,
         else
         {
             s1 = s0;
-            map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0));
+            map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0), 0);
             if (**map == *CHR_SPACE)
                 break;
             while (s1 < s0)
@@ -449,7 +456,7 @@ static int term_104 (ZebraMaps zebra_maps, int reg_type,
     int i = 0;
     int j = 0;
 
-    if (!term_pre (zebra_maps, reg_type, src, "?*#", "?*#"))
+    if (!term_pre (zebra_maps, reg_type, src, "?*#", "?*#", !space_split))
         return 0;
     s0 = *src;
     while (*s0)
@@ -492,7 +499,7 @@ static int term_104 (ZebraMaps zebra_maps, int reg_type,
         }
         {
             s1 = s0;
-            map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0));
+            map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0), 0);
             if (space_split && **map == *CHR_SPACE)
                 break;
             while (s1 < s0)
@@ -520,7 +527,7 @@ static int term_105 (ZebraMaps zebra_maps, int reg_type,
     int i = 0;
     int j = 0;
 
-    if (!term_pre (zebra_maps, reg_type, src, "*!", "*!"))
+    if (!term_pre (zebra_maps, reg_type, src, "*!", "*!", !space_split))
         return 0;
     s0 = *src;
     while (*s0)
@@ -538,7 +545,7 @@ static int term_105 (ZebraMaps zebra_maps, int reg_type,
         }
         {
             s1 = s0;
-            map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0));
+            map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0), 0);
             if (space_split && **map == *CHR_SPACE)
                 break;
             while (s1 < s0)
@@ -877,7 +884,8 @@ static RSET term_trunc (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
                         int reg_type, int complete_flag,
                         int num_bases, char **basenames,
                         char *term_dst,
-                        const char *rank_type, int xpath_use)
+                        const char *rank_type, int xpath_use,
+                        NMEM rset_nmem)
 {
     int r;
     grep_info->isam_p_indx = 0;
@@ -890,7 +898,8 @@ static RSET term_trunc (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
     return rset_trunc (zh, grep_info->isam_p_buf,
                        grep_info->isam_p_indx, term_dst,
                        strlen(term_dst), rank_type, 1 /* preserve pos */,
-                       zapt->term->which);
+                       zapt->term->which, rset_nmem,
+                       key_it_ctrl,key_it_ctrl->scope);
 }
 
 
@@ -1045,7 +1054,7 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
                                   attributeSet,
                                   reg_type, space_split, term_dst))
                 return 0;
-            logf (LOG_LOG, "dict_lookup_grep: %s", term_dict+prefix_len);
+            logf (LOG_DEBUG, "dict_lookup_grep: %s", term_dict+prefix_len);
             r = dict_lookup_grep (zh->reg->dict, term_dict, 0,
                                   grep_info, &max_pos, 0, grep_handle);
             if (r)
@@ -1236,7 +1245,7 @@ static int trans_scan_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
             
         while ((len = (cp_end - cp)) > 0)
         {
-            map = zebra_maps_input (zh->reg->zebra_maps, reg_type, &cp, len);
+            map = zebra_maps_input (zh->reg->zebra_maps, reg_type, &cp, len, 0);
             if (**map == *CHR_SPACE)
                 space_map = *map;
             else
@@ -1362,7 +1371,8 @@ static RSET rpn_search_APT_phrase (ZebraHandle zh,
                                    NMEM stream,
                                    int reg_type, int complete_flag,
                                    const char *rank_type, int xpath_use,
-                                   int num_bases, char **basenames)
+                                   int num_bases, char **basenames, 
+                                   NMEM rset_nmem)
 {
     char term_dst[IT_MAX_WORD+1];
     RSET rset[60], result;
@@ -1382,7 +1392,7 @@ static RSET rpn_search_APT_phrase (ZebraHandle zh,
                                     reg_type, complete_flag,
                                     num_bases, basenames,
                                     term_dst, rank_type,
-                                    xpath_use);
+                                    xpath_use,rset_nmem);
         if (!rset[rset_no])
             break;
         if (++rset_no >= (int) (sizeof(rset)/sizeof(*rset)))
@@ -1390,12 +1400,11 @@ static RSET rpn_search_APT_phrase (ZebraHandle zh,
     }
     grep_info_delete (&grep_info);
     if (rset_no == 0)
-        return rsnull_create (NULL);  /* FIXME - Use a proper nmem */
+        return rsnull_create (rset_nmem,key_it_ctrl); 
     else if (rset_no == 1)
         return (rset[0]);
     else
-        result = rsprox_create( NULL, /* FIXME - use a proper nmem */
-                       sizeof(struct it_key), key_compare_it, key_get_seq,
+        result = rsprox_create( rset_nmem, key_it_ctrl, key_it_ctrl->scope,
                        rset_no, rset,
                        1 /* ordered */, 0 /* exclusion */,
                        3 /* relation */, 1 /* distance */);
@@ -1410,7 +1419,8 @@ static RSET rpn_search_APT_or_list (ZebraHandle zh,
                                     int reg_type, int complete_flag,
                                     const char *rank_type,
                                     int xpath_use,
-                                    int num_bases, char **basenames)
+                                    int num_bases, char **basenames,
+                                    NMEM rset_nmem)
 {
     char term_dst[IT_MAX_WORD+1];
     RSET rset[60];
@@ -1429,7 +1439,7 @@ static RSET rpn_search_APT_or_list (ZebraHandle zh,
                                     reg_type, complete_flag,
                                     num_bases, basenames,
                                     term_dst, rank_type,
-                                    xpath_use);
+                                    xpath_use,rset_nmem);
         if (!rset[rset_no])
             break;
         if (++rset_no >= (int) (sizeof(rset)/sizeof(*rset)))
@@ -1437,27 +1447,9 @@ static RSET rpn_search_APT_or_list (ZebraHandle zh,
     }
     grep_info_delete (&grep_info);
     if (rset_no == 0)
-        return rsnull_create (NULL);  /* FIXME - Use a proper nmem */
-    return rsmultior_create(NULL,  /* FIXME */
-                            sizeof(struct it_key),
-                            key_compare_it, 
+        return rsnull_create (rset_nmem,key_it_ctrl);  
+    return rsmultior_create(rset_nmem, key_it_ctrl,key_it_ctrl->scope,
                             rset_no, rset);
-
-#if 0    
-    /* The old code, kept for reference. May be deleted soon */
-    result = rset[0];
-    for (i = 1; i<rset_no; i++)
-    {  
-        rset_bool_parms bool_parms;
-        bool_parms.rset_l = result;
-        bool_parms.rset_r = rset[i];
-        bool_parms.key_size = sizeof(struct it_key);
-        bool_parms.cmp = key_compare_it;
-        bool_parms.log_item = key_logdump_txt;
-        result = rset_create (rset_kind_or, &bool_parms);
-    }
-    return result;
-#endif
 }
 
 static RSET rpn_search_APT_and_list (ZebraHandle zh,
@@ -1468,7 +1460,8 @@ static RSET rpn_search_APT_and_list (ZebraHandle zh,
                                      int reg_type, int complete_flag,
                                      const char *rank_type, 
                                      int xpath_use,
-                                     int num_bases, char **basenames)
+                                     int num_bases, char **basenames,
+                                     NMEM rset_nmem)
 {
     char term_dst[IT_MAX_WORD+1];
     RSET rset[60], result;
@@ -1487,7 +1480,7 @@ static RSET rpn_search_APT_and_list (ZebraHandle zh,
                                     reg_type, complete_flag,
                                     num_bases, basenames,
                                     term_dst, rank_type,
-                                    xpath_use);
+                                    xpath_use, rset_nmem);
         if (!rset[rset_no])
             break;
         assert (rset[rset_no]);
@@ -1496,24 +1489,12 @@ static RSET rpn_search_APT_and_list (ZebraHandle zh,
     }
     grep_info_delete (&grep_info);
     if (rset_no == 0)
-        return rsnull_create (NULL);  /* FIXME - Use a proper nmem */
+        return rsnull_create (rset_nmem,key_it_ctrl); 
     result = rset[0];
     /* FIXME - Use a proper rsmultiand */
     for (i = 1; i<rset_no; i++)
-    {
-        /*
-        rset_bool_parms bool_parms;
-        bool_parms.rset_l = result;
-        bool_parms.rset_r = rset[i];
-        bool_parms.key_size = sizeof(struct it_key);
-        bool_parms.cmp = key_compare_it;
-        bool_parms.log_item = key_logdump_txt;
-        result = rset_create (rset_kind_and, &bool_parms);
-        */
-        result= rsbool_create_and(NULL, /* FIXME - use a proper nmem */
-                sizeof(struct it_key), key_compare_it,
-                result, rset[i], key_logdump_txt );
-    }
+        result= rsbool_create_and(rset_nmem,key_it_ctrl,key_it_ctrl->scope,
+                result, rset[i] );
     return result;
 }
 
@@ -1708,7 +1689,8 @@ static RSET rpn_search_APT_numeric (ZebraHandle zh,
                                     NMEM stream,
                                     int reg_type, int complete_flag,
                                     const char *rank_type, int xpath_use,
-                                    int num_bases, char **basenames)
+                                    int num_bases, char **basenames,
+                                    NMEM rset_nmem)
 {
     char term_dst[IT_MAX_WORD+1];
     const char *termp = termz;
@@ -1733,30 +1715,21 @@ static RSET rpn_search_APT_numeric (ZebraHandle zh,
                                     grep_info.isam_p_indx, term_dst,
                                     strlen(term_dst), rank_type,
                                     0 /* preserve position */,
-                                    zapt->term->which);
+                                    zapt->term->which, rset_nmem, 
+                                    key_it_ctrl,key_it_ctrl->scope);
         assert (rset[rset_no]);
         if (++rset_no >= (int) (sizeof(rset)/sizeof(*rset)))
             break;
     }
     grep_info_delete (&grep_info);
     if (rset_no == 0)
-        return rsnull_create (NULL);  /* FIXME - Use a proper nmem */
+        return rsnull_create (rset_nmem,key_it_ctrl);
     result = rset[0];
     for (i = 1; i<rset_no; i++)
     {
-        /*
-        rset_bool_parms bool_parms;
-        bool_parms.rset_l = result;
-        bool_parms.rset_r = rset[i];
-        bool_parms.key_size = sizeof(struct it_key);
-        bool_parms.cmp = key_compare_it;
-        bool_parms.log_item = key_logdump_txt;
-        result = rset_create (rset_kind_and, &bool_parms);
-        */
         /* FIXME - Use a proper multi-and */
-        result= rsbool_create_and(NULL, /* FIXME - use a proper nmem */
-                sizeof(struct it_key), key_compare_it,
-                result, rset[i], key_logdump_txt );
+        result= rsbool_create_and(rset_nmem,key_it_ctrl,key_it_ctrl->scope,
+                result, rset[i] );
     }
     return result;
 }
@@ -1765,7 +1738,7 @@ static RSET rpn_search_APT_local (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
                                   const char *termz,
                                   oid_value attributeSet,
                                   NMEM stream,
-                                  const char *rank_type)
+                                  const char *rank_type, NMEM rset_nmem)
 {
     RSET result;
     RSFD rsfd;
@@ -1779,8 +1752,7 @@ static RSET rpn_search_APT_local (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
     parms.temp_path = res_get (zh->res, "setTmpDir");
     result = rset_create (rset_kind_temp, &parms);
     */
-    result = rstemp_create( NULL, /* FIXME - use a proper nmem */
-                     sizeof (struct it_key), key_compare_it,
+    result = rstemp_create( rset_nmem,key_it_ctrl,key_it_ctrl->scope,
                      res_get (zh->res, "setTmpDir") );
     rsfd = rset_open (result, RSETF_WRITE);
 
@@ -1892,7 +1864,8 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
     sks->which = Z_SortKeySpec_null;
     sks->u.null = odr_nullval ();
     sort_sequence->specs[i] = sks;
-    return rsnull_create (NULL);  /* FIXME - Use a proper nmem */
+    return rsnull_create (NULL,key_it_ctrl);
+        /* FIXME - nmem?? */
 }
 
 
@@ -1917,7 +1890,7 @@ static int parse_xpath(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
 
 static RSET xpath_trunc(ZebraHandle zh, NMEM stream,
                         int reg_type, const char *term, int use,
-                        oid_value curAttributeSet)
+                        oid_value curAttributeSet, NMEM rset_nmem)
 {
     RSET rset;
     struct grep_info grep_info;
@@ -1930,10 +1903,10 @@ static RSET xpath_trunc(ZebraHandle zh, NMEM stream,
     const char *flags = "void";
 
     if (grep_info_prepare (zh, 0 /* zapt */, &grep_info, '0', stream))
-        return rsnull_create (NULL);  /* FIXME - Use a proper nmem */
+        return rsnull_create (rset_nmem,key_it_ctrl);
 
     if (ord < 0)
-        return rsnull_create (NULL);  /* FIXME - Use a proper nmem */
+        return rsnull_create (rset_nmem,key_it_ctrl);
     if (prefix_len)
         term_dict[prefix_len++] = '|';
     else
@@ -1958,7 +1931,8 @@ static RSET xpath_trunc(ZebraHandle zh, NMEM stream,
              grep_info.isam_p_indx);
     rset = rset_trunc (zh, grep_info.isam_p_buf,
                        grep_info.isam_p_indx, term, strlen(term),
-                       flags, 1, term_type);
+                       flags, 1, term_type,rset_nmem,
+                       key_it_ctrl, key_it_ctrl->scope);
     grep_info_delete (&grep_info);
     return rset;
 }
@@ -1967,7 +1941,8 @@ static RSET rpn_search_xpath (ZebraHandle zh,
                               oid_value attributeSet,
                               int num_bases, char **basenames,
                               NMEM stream, const char *rank_type, RSET rset,
-                              int xpath_len, struct xpath_location_step *xpath)
+                              int xpath_len, struct xpath_location_step *xpath,
+                              NMEM rset_nmem)
 {
     oid_value curAttributeSet = attributeSet;
     int base_no;
@@ -2076,7 +2051,8 @@ static RSET rpn_search_xpath (ZebraHandle zh,
                 }
                 wrbuf_puts(wbuf, "");
                 rset_attr = xpath_trunc (
-                    zh, stream, '0', wrbuf_buf(wbuf), 3, curAttributeSet);
+                    zh, stream, '0', wrbuf_buf(wbuf), 3, 
+                    curAttributeSet,rset_nmem);
                 wrbuf_free(wbuf, 1);
             } 
             else 
@@ -2087,11 +2063,11 @@ static RSET rpn_search_xpath (ZebraHandle zh,
             yaz_log (LOG_LOG, "xpath_rev (%d) = %s", level, xpath_rev);
             if (strlen(xpath_rev))
             {
-                rset_start_tag = xpath_trunc(zh, stream, 
-                                         '0', xpath_rev, 1, curAttributeSet);
+                rset_start_tag = xpath_trunc(zh, stream, '0', 
+                        xpath_rev, 1, curAttributeSet, rset_nmem);
             
-                rset_end_tag = xpath_trunc(zh, stream,
-                                       '0', xpath_rev, 2, curAttributeSet);
+                rset_end_tag = xpath_trunc(zh, stream, '0', 
+                        xpath_rev, 2, curAttributeSet, rset_nmem);
 
                 /*
                 parms.key_size = sizeof(struct it_key);
@@ -2103,10 +2079,8 @@ static RSET rpn_search_xpath (ZebraHandle zh,
                 parms.printer = key_print_it;
                 rset = rset_create (rset_kind_between, &parms);
                 */
-                rset=rsbetween_create( NULL, /* FIXME */
-                        sizeof(struct it_key), key_compare_it,
-                        rset_start_tag, rset, rset_end_tag, rset_attr,
-                        key_print_it );
+                rset=rsbetween_create( rset_nmem,key_it_ctrl,key_it_ctrl->scope,
+                        rset_start_tag, rset, rset_end_tag, rset_attr);
             }
             first_path = 0;
         }
@@ -2120,7 +2094,8 @@ static RSET rpn_search_xpath (ZebraHandle zh,
 static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
                             oid_value attributeSet, NMEM stream,
                             Z_SortKeySpecList *sort_sequence,
-                            int num_bases, char **basenames)
+                            int num_bases, char **basenames, 
+                            NMEM rset_nmem)
 {
     unsigned reg_id;
     char *search_type = NULL;
@@ -2160,33 +2135,33 @@ static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
         rset = rpn_search_APT_phrase (zh, zapt, termz, attributeSet, stream,
                                       reg_id, complete_flag, rank_type,
                                       xpath_use,
-                                      num_bases, basenames);
+                                      num_bases, basenames, rset_nmem);
     }
     else if (!strcmp (search_type, "and-list"))
     {
         rset = rpn_search_APT_and_list (zh, zapt, termz, attributeSet, stream,
                                         reg_id, complete_flag, rank_type,
                                         xpath_use,
-                                        num_bases, basenames);
+                                        num_bases, basenames, rset_nmem);
     }
     else if (!strcmp (search_type, "or-list"))
     {
         rset = rpn_search_APT_or_list (zh, zapt, termz, attributeSet, stream,
                                        reg_id, complete_flag, rank_type,
                                        xpath_use,
-                                       num_bases, basenames);
+                                       num_bases, basenames, rset_nmem);
     }
     else if (!strcmp (search_type, "local"))
     {
         rset = rpn_search_APT_local (zh, zapt, termz, attributeSet, stream,
-                                     rank_type);
+                                     rank_type, rset_nmem);
     }
     else if (!strcmp (search_type, "numeric"))
     {
         rset = rpn_search_APT_numeric (zh, zapt, termz, attributeSet, stream,
                                        reg_id, complete_flag, rank_type,
                                        xpath_use,
-                                       num_bases, basenames);
+                                       num_bases, basenames, rset_nmem);
     }
     else if (!strcmp (search_type, "always"))
     {
@@ -2195,7 +2170,8 @@ static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
     else
         zh->errCode = 118;
     return rpn_search_xpath (zh, attributeSet, num_bases, basenames,
-                             stream, rank_type, rset, xpath_len, xpath);
+                             stream, rank_type, rset, 
+                             xpath_len, xpath, rset_nmem);
 }
 
 static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs,
@@ -2230,19 +2206,16 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs,
         switch (zop->which)
         {
         case Z_Operator_and:
-            r = rsbool_create_and( rset_nmem,
-                    sizeof(struct it_key),  key_compare_it,
-                    rset_l, rset_r, key_logdump_txt );
+            r = rsbool_create_and(rset_nmem,key_it_ctrl, key_it_ctrl->scope,
+                    rset_l,rset_r );
             break;
         case Z_Operator_or:
-            r = rsbool_create_or( rset_nmem,
-                    sizeof(struct it_key),  key_compare_it,
-                    rset_l, rset_r, key_logdump_txt );
+            r = rsbool_create_or(rset_nmem,key_it_ctrl, key_it_ctrl->scope,
+                    rset_l,rset_r );
             break;
         case Z_Operator_and_not:
-            r = rsbool_create_not( rset_nmem,
-                    sizeof(struct it_key),  key_compare_it,
-                    rset_l, rset_r, key_logdump_txt );
+            r = rsbool_create_not(rset_nmem,key_it_ctrl, key_it_ctrl->scope,
+                    rset_l,rset_r );
             break;
         case Z_Operator_prox:
             if (zop->u.prox->which != Z_ProximityOperator_known)
@@ -2265,29 +2238,13 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs,
                 
                 twosets[0] = rset_l;
                 twosets[1] = rset_r;
-                r=rsprox_create(rset_nmem,
-                         sizeof(struct it_key), key_compare_it,
-                         key_get_seq, 
+                r=rsprox_create(rset_nmem,key_it_ctrl,key_it_ctrl->scope,
                          2, twosets, 
                          *zop->u.prox->ordered,
                          (!zop->u.prox->exclusion ? 
                               0 : *zop->u.prox->exclusion),
                          *zop->u.prox->relationType,
                          *zop->u.prox->distance );
-                /*
-                parms.rset = twosets;
-                parms.rset_no = 2;
-                parms.ordered = *zop->u.prox->ordered;
-                parms.exclusion = (!zop->u.prox->exclusion ? 0 :
-                                   *zop->u.prox->exclusion);
-                parms.relation = *zop->u.prox->relationType;
-                parms.distance = *zop->u.prox->distance;
-                parms.key_size = sizeof(struct it_key);
-                parms.cmp = key_compare_it;
-                parms.getseq = key_get_seq;
-                parms.log_item = key_logdump_txt;
-                r = rset_create(rset_kind_prox, &parms);
-                */
             }
             break;
         default:
@@ -2302,7 +2259,7 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs,
             logf (LOG_DEBUG, "rpn_search_APT");
             r = rpn_search_APT (zh, zs->u.simple->u.attributesPlusTerm,
                                 attributeSet, stream, sort_sequence,
-                                num_bases, basenames);
+                                num_bases, basenames,rset_nmem);
         }
         else if (zs->u.simple->which == Z_Operand_resultSetId)
         {
@@ -2310,7 +2267,7 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs,
             r = resultSetRef (zh, zs->u.simple->u.resultSetId);
             if (!r)
             {
-                r = rsnull_create (rset_nmem);
+                r = rsnull_create (rset_nmem,key_it_ctrl);
                 zh->errCode = 30;
                 zh->errString =
                     nmem_strdup (stream, zs->u.simple->u.resultSetId);
@@ -2512,6 +2469,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
     char rank_type[128];
     int complete_flag;
     int sort_flag;
+    NMEM rset_nmem=NULL; 
 
     *list = 0;
 
@@ -2655,6 +2613,8 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
     glist = (ZebraScanEntry *)
         odr_malloc (stream, (before+after)*sizeof(*glist));
 
+    rset_nmem=nmem_create();
+
     /* consider terms after main term */
     for (i = 0; i < ord_no; i++)
         ptr[i] = before;
@@ -2683,8 +2643,8 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
                            &glist[i+before].term, mterm);
         rset = rset_trunc (zh, &scan_info_array[j0].list[ptr[j0]].isam_p, 1,
                            glist[i+before].term, strlen(glist[i+before].term),
-                           NULL, 0, zapt->term->which);
-
+                           NULL, 0, zapt->term->which, rset_nmem, 
+                           key_it_ctrl,key_it_ctrl->scope);
         ptr[j0]++;
         for (j = j0+1; j<ord_no; j++)
         {
@@ -2698,38 +2658,18 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
                    rset_trunc (zh, &scan_info_array[j].list[ptr[j]].isam_p, 1,
                                glist[i+before].term,
                                strlen(glist[i+before].term), NULL, 0,
-                               zapt->term->which);
-/*
-                bool_parms.key_size = sizeof(struct it_key);
-                bool_parms.cmp = key_compare_it;
-                bool_parms.log_item = key_logdump_txt;
-                bool_parms.rset_l = rset;
-                bool_parms.rset_r = rset2;
-                rset = rset_create (rset_kind_or, &bool_parms);
-*/
-                rset = rsbool_create_or(NULL, /* FIXME -use a proper nmem */
-                            sizeof(struct it_key), key_compare_it,
-                            rset, rset2, key_logdump_txt);
+                               zapt->term->which,rset_nmem,
+                               key_it_ctrl, key_it_ctrl->scope);
+                rset = rsbool_create_or(rset_nmem,key_it_ctrl,
+                               key_it_ctrl->scope, rset, rset2);
+                /* FIXME - Use a proper multi-or */
 
                 ptr[j]++;
             }
         }
         if (limit_set)
-        {
-            /*
-            rset_bool_parms bool_parms;
-            bool_parms.key_size = sizeof(struct it_key);
-            bool_parms.cmp = key_compare_it;
-            bool_parms.log_item = key_logdump_txt;
-            bool_parms.rset_l = rset;
-            bool_parms.rset_r = rset_dup(limit_set);
-            rset = rset_create (rset_kind_and, &bool_parms);
-            */
-            rset = rsbool_create_and(NULL, /* FIXME -use a proper nmem */
-                            sizeof(struct it_key), key_compare_it,
-                            rset, rset_dup(limit_set), 
-                            key_logdump_txt);
-        }
+            rset = rsbool_create_and(rset_nmem,key_it_ctrl,key_it_ctrl->scope,
+                            rset, rset_dup(limit_set));
         count_set (rset, &glist[i+before].occurrences);
         rset_delete (rset);
     }
@@ -2769,7 +2709,8 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
         rset = rset_trunc
                (zh, &scan_info_array[j0].list[before-1-ptr[j0]].isam_p, 1,
                 glist[before-1-i].term, strlen(glist[before-1-i].term),
-                NULL, 0, zapt->term->which);
+                NULL, 0, zapt->term->which,rset_nmem,
+                key_it_ctrl,key_it_ctrl->scope);
 
         ptr[j0]++;
 
@@ -2785,40 +2726,17 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
                          &scan_info_array[j].list[before-1-ptr[j]].isam_p, 1,
                                     glist[before-1-i].term,
                                     strlen(glist[before-1-i].term), NULL, 0,
-                                    zapt->term->which);
-/*
-                bool_parms.key_size = sizeof(struct it_key);
-                bool_parms.cmp = key_compare_it;
-                bool_parms.log_item = key_logdump_txt;
-                bool_parms.rset_l = rset;
-                bool_parms.rset_r = rset2;
-                rset = rset_create (rset_kind_or, &bool_parms);
-*/
-                rset = rsbool_create_and(NULL, /* FIXME -use a proper nmem */
-                            sizeof(struct it_key), key_compare_it,
-                            rset, rset2,
-                            key_logdump_txt);
+                                    zapt->term->which, rset_nmem,
+                                    key_it_ctrl, key_it_ctrl->scope);
+                rset = rsbool_create_and(rset_nmem,key_it_ctrl,
+                            key_it_ctrl->scope, rset, rset2);
+                /* FIXME - multi-and ?? */
                 ptr[j]++;
             }
         }
         if (limit_set)
-        {
-            /*
-            rset_bool_parms bool_parms;
-
-            bool_parms.key_size = sizeof(struct it_key);
-            bool_parms.cmp = key_compare_it;
-            bool_parms.log_item = key_logdump_txt;
-            bool_parms.rset_l = rset;
-            bool_parms.rset_r = rset_dup(limit_set);
-
-            rset = rset_create (rset_kind_and, &bool_parms);
-            */
-            rset = rsbool_create_and(NULL, /* FIXME -use a proper nmem */
-                            sizeof(struct it_key), key_compare_it,
-                            rset, rset_dup(limit_set),
-                            key_logdump_txt);
-        }
+            rset = rsbool_create_and(rset_nmem,key_it_ctrl,key_it_ctrl->scope,
+                            rset, rset_dup(limit_set));
         count_set (rset, &glist[before-1-i].occurrences);
         rset_delete (rset);
     }
@@ -2829,6 +2747,8 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
         *position -= i;
         *num_entries -= i;
     }
+
+    nmem_destroy(rset_nmem);
     *list = glist + i;               /* list is set to first 'real' entry */
     
     logf (LOG_DEBUG, "position = %d, num_entries = %d",