Implemented bug #588: allrecords search. Using @attr 1=allrecords ""
[idzebra-moved-to-github.git] / index / zrpn.c
index 9cf39d4..f7ff740 100644 (file)
@@ -1,5 +1,5 @@
-/* $Id: zrpn.c,v 1.207 2005-11-09 11:51:30 adam Exp $
-   Copyright (C) 1995-2005
+/* $Id: zrpn.c,v 1.213 2006-05-17 17:46:45 adam Exp $
+   Copyright (C) 1995-2006
    Index Data ApS
 
 This file is part of the Zebra server.
@@ -181,8 +181,12 @@ void zebra_term_untrans(ZebraHandle zh, int reg_type,
     {
         const char *cp = zebra_maps_output(zh->reg->zebra_maps,
                                           reg_type, &src);
-        if (!cp && len < IT_MAX_WORD-1)
-            dst[len++] = *src++;
+       if (!cp)
+       {
+           if (len < IT_MAX_WORD-1)
+               dst[len++] = *src;
+           src++;
+       }
         else
             while (*cp && len < IT_MAX_WORD-1)
                 dst[len++] = *cp++;
@@ -241,7 +245,7 @@ static void add_isam_p(const char *name, const char *info,
         zebra_term_untrans  (p->zh, p->reg_type, term_tmp, name+len+1);
         yaz_log(log_level_rpn, "grep: %d %c %s", ord, name[len], term_tmp);
         zebraExplain_lookup_ord (p->zh->reg->zei,
-                                 ord, 0 /* index_type */, &db, &set, &use);
+                                 ord, 0 /* index_type */, &db, &set, &use, 0);
         yaz_log(log_level_rpn, "grep:  set=%d use=%d db=%s", set, use, db);
         
         resultSetAddTerm(p->zh, p->termset, name[len], db,
@@ -965,7 +969,10 @@ static int string_relation(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
         break;
     case 3:
     case 102:
+    case 103:
     case -1:
+        if (!**term_sub)
+            return 1;
         yaz_log(log_level_rpn, "Relation =");
         if (!term_100(zh->reg->zebra_maps, reg_type, term_sub,
                       term_component, space_split, term_dst))
@@ -1005,7 +1012,7 @@ static ZEBRA_RES term_limits_APT(ZebraHandle zh,
 
     attr_init(&term_ref_id_attr, zapt, 10);
     term_ref_id_int = attr_find_ex(&term_ref_id_attr, NULL, term_ref_id_str);
-    if (term_ref_id_int != -1)
+    if (term_ref_id_int >= 0)
     {
        char *res = nmem_malloc(nmem, 20);
        sprintf(res, "%d", term_ref_id_int);
@@ -1235,6 +1242,8 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
                term_dict[prefix_len++] = 1;
                term_dict[prefix_len++] = ord_buf[i];
            }
+           if (ord_len > init_pos)
+               init_pos = ord_len;
        }
        bases_ok++;
         if (prefix_len)
@@ -1314,7 +1323,6 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
         case 103:       /* Regexp-2 */
             regex_range = 1;
             term_dict[j++] = '(';
-           init_pos = 2;
             if (!term_103(zh->reg->zebra_maps, reg_type,
                           &termp, term_dict + j, &regex_range,
                          space_split, term_dst))
@@ -1563,7 +1571,9 @@ static ZEBRA_RES term_list_trunc(ZebraHandle zh,
     struct grep_info grep_info;
     const char *termp = termz;
     int alloc_sets = 0;
+    int empty_term = *termz ? 0 : 1;
 
+    empty_term = 0;
     *num_result_sets = 0;
     *term_dst = 0;
     if (grep_info_prepare(zh, zapt, &grep_info, reg_type) == ZEBRA_FAIL)
@@ -1601,6 +1611,11 @@ static ZEBRA_RES term_list_trunc(ZebraHandle zh,
        if ((*result_sets)[*num_result_sets] == 0)
            break;
        (*num_result_sets)++;
+
+        if (empty_term)
+            break;
+        if (!*termp)
+            break;
     }
     grep_info_delete(&grep_info);
     return ZEBRA_OK;
@@ -2406,6 +2421,15 @@ static ZEBRA_RES rpn_search_APT(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
                                     num_bases, basenames, rset_nmem,
                                     rset, kc);
     }
+    else if (!strcmp(search_type, "always"))
+    {
+        *termz = '\0';
+        res = rpn_search_APT_phrase(zh, zapt, termz, attributeSet, stream,
+                                    reg_id, complete_flag, rank_type,
+                                    xpath_use,
+                                    num_bases, basenames, rset_nmem,
+                                    rset, kc);
+    }
     else
     {
        zebra_setError(zh, YAZ_BIB1_UNSUPP_STRUCTURE_ATTRIBUTE, 0);
@@ -3122,3 +3146,11 @@ ZEBRA_RES rpn_scan(ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
     return ZEBRA_OK;
 }
 
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+