X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=util%2Fzebramap.c;h=b075257e24094de70f3f1c9a8af9e6d4cb3747c9;hp=6418560a587e90457ab04ccd41bc38eacfaa4a47;hb=c33ea56e3771c3b80ba66ef8fda3a09cad171ebb;hpb=6ba9698e88c0283e40fa5980a1a6b551fff2d597 diff --git a/util/zebramap.c b/util/zebramap.c index 6418560..b075257 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.53 2006-09-08 14:41:00 adam Exp $ Copyright (C) 1995-2006 Index Data ApS @@ -28,7 +28,7 @@ #include #include -#include +#include #define ZEBRA_MAP_TYPE_SORT 1 #define ZEBRA_MAP_TYPE_INDEX 2 @@ -39,6 +39,8 @@ struct zebra_map { unsigned reg_id; int completeness; int positioned; + int alwaysmatches; + int first_in_field; int type; union { struct { @@ -86,6 +88,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 +98,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 +125,11 @@ 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; + (*zm)->first_in_field = 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 +143,47 @@ ZEBRA_RES zebra_maps_read_file(ZebraMaps zms, const char *fname) (*zm)->maptab = NULL; (*zm)->completeness = 0; (*zm)->positioned = 0; + (*zm)->alwaysmatches = 0; + (*zm)->first_in_field = 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], "firstinfield") && argc == 2) + { + (*zm)->first_in_field = 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 +192,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 +319,6 @@ const char *zebra_maps_output(ZebraMaps zms, unsigned reg_id, } - /* ------------------------------------ */ int zebra_maps_is_complete(ZebraMaps zms, unsigned reg_id) @@ -303,6 +345,22 @@ 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_is_first_in_field(ZebraMaps zms, unsigned reg_id) +{ + struct zebra_map *zm = zebra_map_get(zms, reg_id); + if (zm) + return zm->first_in_field; + return 0; +} + int zebra_maps_sort(ZebraMaps zms, Z_SortAttributes *sortAttributes, int *numerical) { @@ -365,12 +423,6 @@ int zebra_maps_attr(ZebraMaps zms, Z_AttributesPlusTerm *zapt, weight_value = 34; sprintf(rank_type, "rank,w=%d,u=%d", weight_value, use_value); } - if (relation_value == 103) - { - *search_type = "always"; - *reg_id = 'w'; - return 0; - } if (*complete_flag) *reg_id = 'p'; else