Use HAVE_UNISTD_H when including unistd.h.
[idzebra-moved-to-github.git] / index / zrpn.c
index ce55c6e..9927949 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: zrpn.c,v 1.195 2005-06-06 21:31:08 adam Exp $
+/* $Id: zrpn.c,v 1.200 2005-06-14 20:28:54 adam Exp $
    Copyright (C) 1995-2005
    Index Data ApS
 
@@ -24,7 +24,8 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include <assert.h>
 #ifdef WIN32
 #include <io.h>
-#else
+#endif
+#if HAVE_UNISTD_H
 #include <unistd.h>
 #endif
 #include <ctype.h>
@@ -50,20 +51,6 @@ typedef struct
     Z_AttributesPlusTerm *zapt;
 } AttrType;
 
-static struct ord_list *ord_list_create(NMEM nmem)
-{
-    return 0;
-}
-
-static struct ord_list *ord_list_append(NMEM nmem, struct ord_list *list,
-                                       int ord)
-{
-    struct ord_list *n = nmem_malloc(nmem, sizeof(*n));
-    n->ord = ord;
-    n->next = list;
-    return n;
-}
-
 static int log_level_set = 0;
 static int log_level_rpn = 0;
 
@@ -1032,7 +1019,7 @@ static ZEBRA_RES term_trunc(ZebraHandle zh,
                       grep_info->isam_p_indx, term_dst,
                       strlen(term_dst), rank_type, 1 /* preserve pos */,
                       zapt->term->which, rset_nmem,
-                      kc, kc->scope, ol);
+                      kc, kc->scope, ol, reg_type);
     if (!*rset)
        return ZEBRA_FAIL;
     return ZEBRA_OK;
@@ -1446,50 +1433,6 @@ static ZEBRA_RES trans_scan_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
     return ZEBRA_OK;
 }
 
-char *normalize_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
-                     const char *termz, NMEM stream, unsigned reg_id)
-{
-    WRBUF wrbuf = 0;
-    AttrType truncation;
-    int truncation_value;
-    char *ex_list = 0;
-
-    attr_init(&truncation, zapt, 5);
-    truncation_value = attr_find(&truncation, NULL);
-
-    switch (truncation_value)
-    {
-    default:
-        ex_list = "";
-        break;
-    case 101:
-        ex_list = "#";
-        break;
-    case 102:
-    case 103:
-        ex_list = 0;
-        break;
-    case 104:
-        ex_list = "!#";
-        break;
-    case 105:
-        ex_list = "!*";
-        break;
-    }
-    if (ex_list)
-        wrbuf = zebra_replace(zh->reg->zebra_maps, reg_id, ex_list,
-                              termz, strlen(termz));
-    if (!wrbuf)
-        return nmem_strdup(stream, termz);
-    else
-    {
-        char *buf = (char*) nmem_malloc(stream, wrbuf_len(wrbuf)+1);
-        memcpy (buf, wrbuf_buf(wrbuf), wrbuf_len(wrbuf));
-        buf[wrbuf_len(wrbuf)] = '\0';
-        return buf;
-    }
-}
-
 static void grep_info_delete(struct grep_info *grep_info)
 {
 #ifdef TERM_COUNT
@@ -1547,7 +1490,7 @@ static ZEBRA_RES grep_info_prepare(ZebraHandle zh,
 /**
   \brief Create result set(s) for list of terms
   \param zh Zebra Handle
-  \param termz_org term as used in query but converted to UTF-8
+  \param termz term as used in query but converted to UTF-8
   \param attributeSet default attribute set
   \param stream memory for result
   \param reg_type register type ('w', 'p',..)
@@ -1563,7 +1506,7 @@ static ZEBRA_RES grep_info_prepare(ZebraHandle zh,
 */
 static ZEBRA_RES term_list_trunc(ZebraHandle zh,
                                 Z_AttributesPlusTerm *zapt,
-                                const char *termz_org,
+                                const char *termz,
                                 oid_value attributeSet,
                                 NMEM stream,
                                 int reg_type, int complete_flag,
@@ -1575,7 +1518,6 @@ static ZEBRA_RES term_list_trunc(ZebraHandle zh,
 {
     char term_dst[IT_MAX_WORD+1];
     struct grep_info grep_info;
-    char *termz = normalize_term(zh, zapt, termz_org, stream, reg_type);
     const char *termp = termz;
     int alloc_sets = 0;
 
@@ -1979,7 +1921,7 @@ static ZEBRA_RES rpn_search_APT_numeric(ZebraHandle zh,
                       strlen(term_dst), rank_type,
                       0 /* preserve position */,
                       zapt->term->which, rset_nmem, 
-                      kc, kc->scope, 0);
+                      kc, kc->scope, 0, reg_type);
        if (!result_sets[num_result_sets])
            break;
        num_result_sets++;
@@ -2173,7 +2115,7 @@ static RSET xpath_trunc(ZebraHandle zh, NMEM stream,
     rset = rset_trunc(zh, grep_info.isam_p_buf,
                      grep_info.isam_p_indx, term, strlen(term),
                      flags, 1, term_type,rset_nmem,
-                     kc, kc->scope, 0);
+                     kc, kc->scope, 0, reg_type);
     grep_info_delete(&grep_info);
     return rset;
 }
@@ -2712,28 +2654,29 @@ void zebra_term_untrans_iconv(ZebraHandle zh, NMEM stream, int reg_type,
         *dst = nmem_strdup(stream, term_src);
 }
 
-static void count_set (RSET r, int *count)
+static void count_set(ZebraHandle zh, RSET rset, zint *count)
 {
     zint psysno = 0;
-    int kno = 0;
     struct it_key key;
     RSFD rfd;
 
     yaz_log(YLOG_DEBUG, "count_set");
 
+    rset->hits_limit = zh->approx_limit;
+
     *count = 0;
-    rfd = rset_open (r, RSETF_READ);
-    while (rset_read (rfd, &key,0 /* never mind terms */))
+    rfd = rset_open(rset, RSETF_READ);
+    while (rset_read(rfd, &key,0 /* never mind terms */))
     {
         if (key.mem[0] != psysno)
         {
             psysno = key.mem[0];
-            (*count)++;
+           if (rfd->counted_items >= rset->hits_limit)
+               break;
         }
-        kno++;
     }
     rset_close (rfd);
-    yaz_log(YLOG_DEBUG, "%d keys, %d records", kno, *count);
+    *count = rset->hits_count;
 }
 
 ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
@@ -2977,7 +2920,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
            rset = rset_trunc(zh, &scan_info_array[j0].list[ptr[j0]].isam_p, 1,
                              glist[lo].term, strlen(glist[lo].term),
                              NULL, 0, zapt->term->which, rset_nmem, 
-                             kc, kc->scope, 0);
+                             kc, kc->scope, 0, reg_id);
        }
        ptr[j0]++; /* move index for this set .. */
        /* get result set for remaining scan terms */
@@ -2998,7 +2941,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
                            glist[lo].term,
                            strlen(glist[lo].term), NULL, 0,
                            zapt->term->which,rset_nmem,
-                           kc, kc->scope, 0);
+                           kc, kc->scope, 0, reg_id);
                    rset = rsmulti_or_create(rset_nmem, kc,
                                             kc->scope, 0 /* termid */,
                                             2, rsets);
@@ -3008,6 +2951,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
         }
        if (lo >= 0)
        {
+           zint count;
            /* merge with limit_set if given */
            if (limit_set)
            {
@@ -3020,7 +2964,8 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
                                          2, rsets);
            }
            /* count it */
-           count_set(rset, &glist[lo].occurrences);
+           count_set(zh, rset, &count);
+           glist[lo].occurrences = count;
            rset_delete(rset);
        }
     }
@@ -3047,6 +2992,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
        const char *tst;
        RSET rset;
        int lo = before-1-i; /* offset in result list */
+       zint count;
        
        for (j = 0; j <ord_no; j++)
        {
@@ -3068,7 +3014,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
            (zh, &scan_info_array[j0].list[before-1-ptr[j0]].isam_p, 1,
             glist[lo].term, strlen(glist[lo].term),
             NULL, 0, zapt->term->which, rset_nmem,
-            kc, kc->scope, 0);
+            kc, kc->scope, 0, reg_id);
        
        ptr[j0]++;
        
@@ -3087,7 +3033,7 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
                    glist[lo].term,
                    strlen(glist[lo].term), NULL, 0,
                    zapt->term->which, rset_nmem,
-                   kc, kc->scope, 0);
+                   kc, kc->scope, 0, reg_id);
                rset = rsmulti_or_create(rset_nmem, kc,
                                         kc->scope, 0 /* termid */, 2, rsets);
                
@@ -3103,7 +3049,8 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
            rset = rsmulti_and_create(rset_nmem, kc,
                                      kc->scope, 2, rsets);
        }
-       count_set (rset, &glist[lo].occurrences);
+       count_set(zh, rset, &count);
+       glist[lo].occurrences = count;
        rset_delete (rset);
     }
     (*kc->dec)(kc);