From 6660da7da58c0cba7336a97394577a432058b9e4 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Thu, 22 Jun 2006 09:48:08 +0000 Subject: [PATCH] Added support for alwaysmatches on regular indexes. Is enabled on a register type basis. i.e. w,p, in default.idx. Bug #616. --- include/idzebra/zebramap.h | 7 ++++-- index/extract.c | 14 +++++++++-- tab/default.idx | 3 ++- util/zebramap.c | 59 ++++++++++++++++++++++++++++++++++++++------ 4 files changed, 70 insertions(+), 13 deletions(-) diff --git a/include/idzebra/zebramap.h b/include/idzebra/zebramap.h index a7ef2f7..2c54471 100644 --- a/include/idzebra/zebramap.h +++ b/include/idzebra/zebramap.h @@ -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 diff --git a/index/extract.c b/index/extract.c index 7f8c211..1a5eada 100644 --- a/index/extract.c +++ b/index/extract.c @@ -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) diff --git a/tab/default.idx b/tab/default.idx index 1a90e70..2d2355d 100644 --- a/tab/default.idx +++ b/tab/default.idx @@ -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 diff --git a/util/zebramap.c b/util/zebramap.c index 6418560..fa1d499 100644 --- a/util/zebramap.c +++ b/util/zebramap.c @@ -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) { -- 1.7.10.4