Allow @attr 2=102 for numeric index
[idzebra-moved-to-github.git] / index / rpnsearch.c
index 1109a60..47c1c23 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the Zebra server.
-   Copyright (C) 2004-2013 Index Data
+   Copyright (C) Index Data
 
 Zebra is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
@@ -187,7 +187,7 @@ static void esc_str(char *out_buf, size_t out_size,
     assert(in_buf);
     assert(out_size > 20);
     *out_buf = '\0';
-    for (k = 0; k<in_size; k++)
+    for (k = 0; k < in_size; k++)
     {
        int c = in_buf[k] & 0xff;
        int pc;
@@ -311,40 +311,23 @@ static int term_102_icu(zebra_map_t zm,
 }
 
 static int term_100_icu(zebra_map_t zm,
-                        const char **src, WRBUF term_dict, int space_split,
+                        const char **src, WRBUF term_dict,
                         WRBUF display_term,
-                        int mode)
+                        int mode,
+                        size_t token_number)
 {
     size_t i;
     const char *res_buf = 0;
     size_t res_len = 0;
     const char *display_buf;
     size_t display_len;
-    const char *s0 = *src, *s1;
-
-    while (*s0 == ' ')
-        s0++;
-
-    if (*s0 == '\0')
-        return 0;
-
-    if (space_split)
-    {
-        s1 = s0;
-        while (*s1 && *s1 != ' ')
-            s1++;
-    }
-    else
-        s1 = s0 + strlen(s0);
-
-    *src = s1;
 
-    zebra_map_tokenize_start(zm, s0, s1 - s0);
-
-    if (!zebra_map_tokenize_next(zm, &res_buf, &res_len,
-                                 &display_buf, &display_len))
+    zebra_map_tokenize_start(zm, *src, strlen(*src));
+    for (i = 0; i <= token_number; i++)
     {
-        return 0;
+        if (!zebra_map_tokenize_next(zm, &res_buf, &res_len,
+                                     &display_buf, &display_len))
+            return 0;
     }
     wrbuf_write(display_term, display_buf, display_len);
     if (mode)
@@ -724,7 +707,7 @@ static void gen_regular_rel(WRBUF term_dict, int val, int islt)
             else
                 dst[dst_p++] = d;
         }
-        for (i = 0; i<pos; i++)
+        for (i = 0; i < pos; i++)
         {
             dst[dst_p++] = '[';
             dst[dst_p++] = '0';
@@ -739,7 +722,7 @@ static void gen_regular_rel(WRBUF term_dict, int val, int islt)
     {
         /* match everything less than 10^(pos-1) */
         strcat(dst, "0*");
-        for (i = 1; i<pos; i++)
+        for (i = 1; i < pos; i++)
             strcat(dst, "[0-9]?");
     }
     else
@@ -971,7 +954,7 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
                             WRBUF display_term,
                              const char *xpath_use,
                             struct ord_list **ol,
-                             zebra_map_t zm);
+                             zebra_map_t zm, size_t token_number);
 
 ZEBRA_RES zebra_term_limits_APT(ZebraHandle zh,
                                 Z_AttributesPlusTerm *zapt,
@@ -1018,7 +1001,8 @@ static ZEBRA_RES search_term(ZebraHandle zh,
                              NMEM rset_nmem,
                              RSET *rset,
                              struct rset_key_control *kc,
-                             zebra_map_t zm)
+                             zebra_map_t zm,
+                             size_t token_number)
 {
     ZEBRA_RES res;
     struct ord_list *ol;
@@ -1033,7 +1017,7 @@ static ZEBRA_RES search_term(ZebraHandle zh,
     res = string_term(zh, zapt, term_sub, term_dict,
                       attributeSet, stream, grep_info,
                      index_type, complete_flag,
-                     display_term, xpath_use, &ol, zm);
+                     display_term, xpath_use, &ol, zm, token_number);
     wrbuf_destroy(term_dict);
     if (res == ZEBRA_OK && *term_sub)
     {
@@ -1061,7 +1045,7 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
                             WRBUF display_term,
                              const char *xpath_use,
                             struct ord_list **ol,
-                             zebra_map_t zm)
+                             zebra_map_t zm, size_t token_number)
 {
     int r;
     AttrType truncation;
@@ -1100,7 +1084,7 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
 
     wrbuf_putc(term_dict, '(');
 
-    for (i = 0; i<ord_len; i++)
+    for (i = 0; i < ord_len; i++)
     {
         wrbuf_putc(term_dict, 1);  /* our internal regexp escape char */
         wrbuf_putc(term_dict, ord_buf[i]);
@@ -1125,7 +1109,7 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
             {
             case -1:         /* not specified */
             case 100:        /* do not truncate */
-                if (!term_100_icu(zm, &termp, term_dict, space_split, display_term, 0))
+                if (!term_100_icu(zm, &termp, term_dict, display_term, 0, token_number))
                 {
                     *term_sub = 0;
                     return ZEBRA_OK;
@@ -1139,21 +1123,21 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
                 }
                 break;
             case 1:          /* right truncation */
-                if (!term_100_icu(zm, &termp, term_dict, space_split, display_term, 1))
+                if (!term_100_icu(zm, &termp, term_dict, display_term, 1, token_number))
                 {
                     *term_sub = 0;
                     return ZEBRA_OK;
                 }
                 break;
             case 2:
-                if (!term_100_icu(zm, &termp, term_dict, space_split, display_term, 2))
+                if (!term_100_icu(zm, &termp, term_dict, display_term, 2, token_number))
                 {
                     *term_sub = 0;
                     return ZEBRA_OK;
                 }
                 break;
             case 3:
-                if (!term_100_icu(zm, &termp, term_dict, space_split, display_term, 3))
+                if (!term_100_icu(zm, &termp, term_dict, display_term, 3, token_number))
                 {
                     *term_sub = 0;
                     return ZEBRA_OK;
@@ -1424,7 +1408,8 @@ static ZEBRA_RES search_terms_chrmap(ZebraHandle zh,
                           rank_type,
                           xpath_use, rset_nmem,
                           &(*result_sets)[*num_result_sets],
-                          kc, zm);
+                          kc, zm,
+                          *num_result_sets);
        if (res != ZEBRA_OK)
        {
            int i;
@@ -1584,7 +1569,7 @@ static ZEBRA_RES rpn_search_APT_phrase(ZebraHandle zh,
         if (res != ZEBRA_OK)
         {
             int i;
-            for (i = 0; i<num_result_sets; i++)
+            for (i = 0; i < num_result_sets; i++)
                 rset_delete(result_sets[i]);
             return res;
         }
@@ -1640,7 +1625,7 @@ static ZEBRA_RES rpn_search_APT_or_list(ZebraHandle zh,
     if (res != ZEBRA_OK)
        return res;
 
-    for (i = 0; i<num_result_sets; i++)
+    for (i = 0; i < num_result_sets; i++)
     {
         RSET first_set = 0;
         res = search_position(zh, zapt, attributeSet,
@@ -1649,7 +1634,7 @@ static ZEBRA_RES rpn_search_APT_or_list(ZebraHandle zh,
                               kc);
         if (res != ZEBRA_OK)
         {
-            for (i = 0; i<num_result_sets; i++)
+            for (i = 0; i < num_result_sets; i++)
                 rset_delete(result_sets[i]);
             return res;
         }
@@ -1708,7 +1693,7 @@ static ZEBRA_RES rpn_search_APT_and_list(ZebraHandle zh,
                           kc);
     if (res != ZEBRA_OK)
        return res;
-    for (i = 0; i<num_result_sets; i++)
+    for (i = 0; i < num_result_sets; i++)
     {
         RSET first_set = 0;
         res = search_position(zh, zapt, attributeSet,
@@ -1717,7 +1702,7 @@ static ZEBRA_RES rpn_search_APT_and_list(ZebraHandle zh,
                               kc);
         if (res != ZEBRA_OK)
         {
-            for (i = 0; i<num_result_sets; i++)
+            for (i = 0; i < num_result_sets; i++)
                 rset_delete(result_sets[i]);
             return res;
         }
@@ -1815,6 +1800,7 @@ static int numeric_relation(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
         gen_regular_rel(term_dict, term_value+1, 0);
         break;
     case -1:
+    case 102:
     case 3:
         yaz_log(log_level_rpn, "Relation =");
         if (!term_100(zm, term_sub, term_num, 1, display_term))
@@ -2063,7 +2049,7 @@ static ZEBRA_RES rpn_sort_spec(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
         sort_sequence->specs = (Z_SortKeySpec **)
             nmem_malloc(stream, sort_sequence->num_specs *
                         sizeof(*sort_sequence->specs));
-        for (i = 0; i<sort_sequence->num_specs; i++)
+        for (i = 0; i < sort_sequence->num_specs; i++)
             sort_sequence->specs[i] = 0;
     }
     if (zapt->term->which != Z_Term_general)
@@ -2155,7 +2141,7 @@ static RSET xpath_trunc(ZebraHandle zh, NMEM stream,
         const char *flags = "void";
 
         wrbuf_putc(term_dict, '(');
-        for (i = 0; i<ord_len; i++)
+        for (i = 0; i < ord_len; i++)
         {
             wrbuf_putc(term_dict, 1);
             wrbuf_putc(term_dict, ord_buf[i]);
@@ -2197,7 +2183,7 @@ ZEBRA_RES rpn_search_xpath(ZebraHandle zh,
     }
 
     yaz_log(YLOG_DEBUG, "xpath len=%d", xpath_len);
-    for (i = 0; i<xpath_len; i++)
+    for (i = 0; i < xpath_len; i++)
     {
         yaz_log(log_level_rpn, "XPATH %d %s", i, xpath[i].part);
 
@@ -2570,7 +2556,7 @@ ZEBRA_RES rpn_search_top(ZebraHandle zh, Z_RPNStructure *zs,
     if (res != ZEBRA_OK)
     {
        int i;
-       for (i = 0; i<num_result_sets; i++)
+       for (i = 0; i < num_result_sets; i++)
            rset_delete(result_sets[i]);
        *result_set = 0;
     }
@@ -2613,7 +2599,7 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs,
        if (res != ZEBRA_OK)
        {
            int i;
-           for (i = 0; i<num_result_sets_l; i++)
+           for (i = 0; i < num_result_sets_l; i++)
                rset_delete(result_sets_l[i]);
            return res;
        }
@@ -2626,9 +2612,9 @@ ZEBRA_RES rpn_search_structure(ZebraHandle zh, Z_RPNStructure *zs,
        if (res != ZEBRA_OK)
        {
            int i;
-           for (i = 0; i<num_result_sets_l; i++)
+           for (i = 0; i < num_result_sets_l; i++)
                rset_delete(result_sets_l[i]);
-           for (i = 0; i<num_result_sets_r; i++)
+           for (i = 0; i < num_result_sets_r; i++)
                rset_delete(result_sets_r[i]);
            return res;
        }