Added support for alwaysmatches on regular indexes. Is enabled
authorAdam Dickmeiss <adam@indexdata.dk>
Thu, 22 Jun 2006 09:48:08 +0000 (09:48 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Thu, 22 Jun 2006 09:48:08 +0000 (09:48 +0000)
on a register type basis. i.e. w,p, in default.idx. Bug #616.

include/idzebra/zebramap.h
index/extract.c
tab/default.idx
util/zebramap.c

index a7ef2f7..2c54471 100644 (file)
@@ -1,5 +1,5 @@
-/* $Id: zebramap.h,v 1.6 2006-05-10 08:13:20 adam Exp $
-   Copyright (C) 1995-2005
+/* $Id: zebramap.h,v 1.7 2006-06-22 09:48:08 adam Exp $
+   Copyright (C) 1995-2006
    Index Data ApS
 
 This file is part of the Zebra server.
@@ -66,6 +66,9 @@ YAZ_EXPORT
 int zebra_maps_is_sort (ZebraMaps zms, unsigned reg_id);
 
 YAZ_EXPORT
+int zebra_maps_is_alwaysmatches (ZebraMaps zms, unsigned reg_id);
+
+YAZ_EXPORT
 int zebra_maps_is_positioned (ZebraMaps zms, unsigned reg_id);
 
 YAZ_EXPORT
index 7f8c211..1a5eada 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: extract.c,v 1.221 2006-06-13 19:40:18 adam Exp $
+/* $Id: extract.c,v 1.222 2006-06-22 09:48:08 adam Exp $
    Copyright (C) 1995-2006
    Index Data ApS
 
@@ -1708,7 +1708,17 @@ static void extract_add_string (RecWord *p, const char *string, int length)
     if (zebra_maps_is_sort (p->zebra_maps, p->index_type))
        extract_add_sort_string (p, string, length);
     else
-       extract_add_index_string (p, string, length);
+    {
+       extract_add_index_string(p, string, length);
+        if (zebra_maps_is_alwaysmatches(p->zebra_maps, p->index_type))
+        {
+            RecWord word;
+            memcpy(&word, p, sizeof(word));
+
+            word.seqno = 1;
+            extract_add_index_string (&word, "", 0);
+        }
+    }
 }
 
 static void extract_add_incomplete_field (RecWord *p)
index 1a90e70..2d2355d 100644 (file)
@@ -1,5 +1,5 @@
 # Zebra indexes as referred to from the *.abs-files.
-#  $Id: default.idx,v 1.12 2004-09-16 14:01:05 adam Exp $
+#  $Id: default.idx,v 1.13 2006-06-22 09:48:09 adam Exp $
 #
 
 # Traditional word index
@@ -8,6 +8,7 @@
 index w
 completeness 0
 position 1
+alwaysmatches 1
 charmap string.chr
 
 # Phrase index
index 6418560..fa1d499 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: zebramap.c,v 1.49 2006-05-19 13:49:38 adam Exp $
+/* $Id: zebramap.c,v 1.50 2006-06-22 09:48:09 adam Exp $
    Copyright (C) 1995-2006
    Index Data ApS
 
@@ -39,6 +39,7 @@ struct zebra_map {
     unsigned reg_id;
     int completeness;
     int positioned;
+    int alwaysmatches;
     int type;
     union {
         struct {
@@ -86,6 +87,7 @@ ZEBRA_RES zebra_maps_read_file(ZebraMaps zms, const char *fname)
     char *argv[10];
     int argc;
     int lineno = 0;
+    int failures = 0;
     struct zebra_map **zm = 0, *zp;
 
     if (!(f = yaz_fopen(zms->tabpath, fname, "r", zms->tabroot)))
@@ -95,7 +97,21 @@ ZEBRA_RES zebra_maps_read_file(ZebraMaps zms, const char *fname)
     }
     while ((argc = readconf_line(f, &lineno, line, 512, argv, 10)))
     {
-       if (!yaz_matchstr(argv[0], "index") && argc == 2)
+        if (argc == 1)
+        {
+            yaz_log(YLOG_WARN, "%s:%d: Missing arguments for '%s'",
+                    fname, lineno, argv[0]);
+            failures++;
+            break;
+        }
+        if (argc > 2)
+        {
+            yaz_log(YLOG_WARN, "%s:%d: Too many arguments for '%s'",
+                    fname, lineno, argv[0]);
+            failures++;
+            break;
+        }
+       if (!yaz_matchstr(argv[0], "index"))
        {
            if (!zm)
                zm = &zms->map_list;
@@ -108,9 +124,10 @@ ZEBRA_RES zebra_maps_read_file(ZebraMaps zms, const char *fname)
            (*zm)->type = ZEBRA_MAP_TYPE_INDEX;
            (*zm)->completeness = 0;
            (*zm)->positioned = 1;
+           (*zm)->alwaysmatches = 0;
            zms->no_maps++;
        }
-       else if (!yaz_matchstr(argv[0], "sort") && argc == 2)
+       else if (!yaz_matchstr(argv[0], "sort"))
        {
            if (!zm)
                zm = &zms->map_list;
@@ -124,25 +141,42 @@ ZEBRA_RES zebra_maps_read_file(ZebraMaps zms, const char *fname)
            (*zm)->maptab = NULL;
            (*zm)->completeness = 0;
            (*zm)->positioned = 0;
+           (*zm)->alwaysmatches = 0;
            zms->no_maps++;
        }
-       else if (zm && !yaz_matchstr(argv[0], "charmap") && argc == 2)
+        else if (!zm)
+        {
+            yaz_log(YLOG_WARN, "%s:%d: Missing sort/index before '%s'",  
+                    fname, lineno, argv[0]);
+            failures++;
+        }
+       else if (!yaz_matchstr(argv[0], "charmap") && argc == 2)
        {
            (*zm)->maptab_name = nmem_strdup(zms->nmem, argv[1]);
        }
-       else if (zm && !yaz_matchstr(argv[0], "completeness") && argc == 2)
+       else if (!yaz_matchstr(argv[0], "completeness") && argc == 2)
        {
            (*zm)->completeness = atoi(argv[1]);
        }
-       else if (zm && !yaz_matchstr(argv[0], "position") && argc == 2)
+       else if (!yaz_matchstr(argv[0], "position") && argc == 2)
        {
            (*zm)->positioned = atoi(argv[1]);
        }
-        else if (zm && !yaz_matchstr(argv[0], "entrysize") && argc == 2)
+       else if (!yaz_matchstr(argv[0], "alwaysmatches") && argc == 2)
+       {
+           (*zm)->alwaysmatches = atoi(argv[1]);
+       }
+        else if (!yaz_matchstr(argv[0], "entrysize") && argc == 2)
         {
             if ((*zm)->type == ZEBRA_MAP_TYPE_SORT)
                (*zm)->u.sort.entry_size = atoi(argv[1]);
         }
+        else
+        {
+            yaz_log(YLOG_WARN, "%s:%d: Unrecognized directive '%s'",  
+                    fname, lineno, argv[0]);
+            failures++;
+        }
     }
     if (zm)
        (*zm)->next = NULL;
@@ -151,6 +185,8 @@ ZEBRA_RES zebra_maps_read_file(ZebraMaps zms, const char *fname)
     for (zp = zms->map_list; zp; zp = zp->next)
        zms->lookup_array[zp->reg_id] = zp;
 
+    if (failures)
+        return ZEBRA_FAIL;
     return ZEBRA_OK;
 }
 
@@ -276,7 +312,6 @@ const char *zebra_maps_output(ZebraMaps zms, unsigned reg_id,
 }
 
 
-
 /* ------------------------------------ */
 
 int zebra_maps_is_complete(ZebraMaps zms, unsigned reg_id)
@@ -303,6 +338,14 @@ int zebra_maps_is_sort(ZebraMaps zms, unsigned reg_id)
     return 0;
 }
 
+int zebra_maps_is_alwaysmatches(ZebraMaps zms, unsigned reg_id)
+{
+    struct zebra_map *zm = zebra_map_get(zms, reg_id);
+    if (zm)
+       return zm->alwaysmatches;
+    return 0;
+}
+
 int zebra_maps_sort(ZebraMaps zms, Z_SortAttributes *sortAttributes,
                    int *numerical)
 {