Happy new year
[idzebra-moved-to-github.git] / index / rpnsearch.c
index a8cc61d..73ee8d1 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the Zebra server.
-   Copyright (C) 1995-2008 Index Data
+   Copyright (C) 1994-2009 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
@@ -1035,28 +1035,45 @@ static ZEBRA_RES string_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt,
 
     if (zebra_maps_is_icu(zm))
     {
-        /* ICU case */
-        switch (truncation_value)
+        int relation_value;
+        AttrType relation;
+        
+        attr_init_APT(&relation, zapt, 2);
+        relation_value = attr_find(&relation, NULL);
+        if (relation_value == 103) /* always matches */
+            termp += strlen(termp); /* move to end of term */
+        else if (relation_value == 3 || relation_value == 102 || relation_value == -1)
         {
-        case -1:         /* not specified */
-        case 100:        /* do not truncate */
-            if (!term_100_icu(zm, &termp, term_dict, space_split, display_term, 0))
+            /* ICU case */
+            switch (truncation_value)
             {
-                *term_sub = 0;
-                return ZEBRA_OK;
-            }
-            break;
-        case 1:          /* right truncation */
-            if (!term_100_icu(zm, &termp, term_dict, space_split, display_term, 1))
-            {
-                *term_sub = 0;
-                return ZEBRA_OK;
+            case -1:         /* not specified */
+            case 100:        /* do not truncate */
+                if (!term_100_icu(zm, &termp, term_dict, space_split, display_term, 0))
+                {
+                    *term_sub = 0;
+                    return ZEBRA_OK;
+                }
+                break;
+            case 1:          /* right truncation */
+                if (!term_100_icu(zm, &termp, term_dict, space_split, display_term, 1))
+                {
+                    *term_sub = 0;
+                    return ZEBRA_OK;
+                }
+                break;
+            default:
+                zebra_setError_zint(zh,
+                                    YAZ_BIB1_UNSUPP_TRUNCATION_ATTRIBUTE,
+                                    truncation_value);
+                return ZEBRA_FAIL;
             }
-            break;
-        default:
+        }
+        else
+        {
             zebra_setError_zint(zh,
-                                YAZ_BIB1_UNSUPP_TRUNCATION_ATTRIBUTE,
-                                truncation_value);
+                                YAZ_BIB1_UNSUPP_RELATION_ATTRIBUTE,
+                                relation_value);
             return ZEBRA_FAIL;
         }
     }