X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=util%2Fzebramap.c;h=0a7cfb9bc8ba4722a8fd852879782a633f86cbcc;hb=42cd12e606db733d23606480a1ece262ebba77ed;hp=96c162337de7c82ffad2e4a8b060ac7317fba154;hpb=6b553b7b42f0a2940c9765b9811e5db44ba8265f;p=idzebra-moved-to-github.git diff --git a/util/zebramap.c b/util/zebramap.c index 96c1623..0a7cfb9 100644 --- a/util/zebramap.c +++ b/util/zebramap.c @@ -1,5 +1,5 @@ -/* $Id: zebramap.c,v 1.54 2006-12-05 09:24:47 adam Exp $ - Copyright (C) 1995-2006 +/* $Id: zebramap.c,v 1.58 2007-03-21 13:47:12 adam Exp $ + Copyright (C) 1995-2007 Index Data ApS This file is part of the Zebra server. @@ -32,6 +32,7 @@ #define ZEBRA_MAP_TYPE_SORT 1 #define ZEBRA_MAP_TYPE_INDEX 2 +#define ZEBRA_MAP_TYPE_STATICRANK 3 #define ZEBRA_REPLACE_ANY 300 @@ -76,7 +77,7 @@ void zebra_maps_close(ZebraMaps zms) chrmaptab_destroy(zm->maptab); zm = zm->next; } - wrbuf_free(zms->wrbuf_1, 1); + wrbuf_destroy(zms->wrbuf_1); nmem_destroy(zms->nmem); xfree(zms); } @@ -147,6 +148,23 @@ ZEBRA_RES zebra_maps_read_file(ZebraMaps zms, const char *fname) (*zm)->first_in_field = 0; zms->no_maps++; } + else if (!yaz_matchstr(argv[0], "staticrank")) + { + if (!zm) + zm = &zms->map_list; + else + zm = &(*zm)->next; + *zm = (struct zebra_map *) nmem_malloc(zms->nmem, sizeof(**zm)); + (*zm)->reg_id = argv[1][0]; + (*zm)->maptab_name = NULL; + (*zm)->type = ZEBRA_MAP_TYPE_STATICRANK; + (*zm)->maptab = NULL; + (*zm)->completeness = 1; + (*zm)->positioned = 0; + (*zm)->alwaysmatches = 0; + (*zm)->first_in_field = 0; + zms->no_maps++; + } else if (!zm) { yaz_log(YLOG_WARN, "%s:%d: Missing sort/index before '%s'", @@ -155,7 +173,15 @@ ZEBRA_RES zebra_maps_read_file(ZebraMaps zms, const char *fname) } else if (!yaz_matchstr(argv[0], "charmap") && argc == 2) { - (*zm)->maptab_name = nmem_strdup(zms->nmem, argv[1]); + if ((*zm)->type != ZEBRA_MAP_TYPE_STATICRANK) + (*zm)->maptab_name = nmem_strdup(zms->nmem, argv[1]); + else + { + yaz_log(YLOG_WARN|YLOG_FATAL, "%s:%d: charmap for " + "staticrank is invalid", fname, lineno); + yaz_log(YLOG_LOG, "Type is %d", (*zm)->type); + failures++; + } } else if (!yaz_matchstr(argv[0], "completeness") && argc == 2) { @@ -167,7 +193,14 @@ ZEBRA_RES zebra_maps_read_file(ZebraMaps zms, const char *fname) } else if (!yaz_matchstr(argv[0], "alwaysmatches") && argc == 2) { - (*zm)->alwaysmatches = atoi(argv[1]); + if ((*zm)->type != ZEBRA_MAP_TYPE_STATICRANK) + (*zm)->alwaysmatches = atoi(argv[1]); + else + { + yaz_log(YLOG_WARN|YLOG_FATAL, "%s:%d: alwaysmatches for " + "staticrank is invalid", fname, lineno); + failures++; + } } else if (!yaz_matchstr(argv[0], "firstinfield") && argc == 2) { @@ -336,6 +369,22 @@ int zebra_maps_is_positioned(ZebraMaps zms, unsigned reg_id) return zm->positioned; return 0; } + +int zebra_maps_is_index(ZebraMaps zms, unsigned reg_id) +{ + struct zebra_map *zm = zebra_map_get(zms, reg_id); + if (zm) + return zm->type == ZEBRA_MAP_TYPE_INDEX; + return 0; +} + +int zebra_maps_is_staticrank(ZebraMaps zms, unsigned reg_id) +{ + struct zebra_map *zm = zebra_map_get(zms, reg_id); + if (zm) + return zm->type == ZEBRA_MAP_TYPE_STATICRANK; + return 0; +} int zebra_maps_is_sort(ZebraMaps zms, unsigned reg_id) { @@ -389,6 +438,7 @@ int zebra_maps_attr(ZebraMaps zms, Z_AttributesPlusTerm *zapt, AttrType use; int completeness_value; int structure_value; + const char *structure_str = 0; int relation_value; int sort_relation_value; int weight_value; @@ -402,7 +452,7 @@ int zebra_maps_attr(ZebraMaps zms, Z_AttributesPlusTerm *zapt, attr_init_APT(&use, zapt, 1); completeness_value = attr_find(&completeness, NULL); - structure_value = attr_find(&structure, NULL); + structure_value = attr_find_ex(&structure, NULL, &structure_str); relation_value = attr_find(&relation, NULL); sort_relation_value = attr_find(&sort_relation, NULL); weight_value = attr_find(&weight, NULL); @@ -468,6 +518,12 @@ int zebra_maps_attr(ZebraMaps zms, Z_AttributesPlusTerm *zapt, *reg_id = 'd'; *search_type = "phrase"; break; + case -2: + if (structure_str && *structure_str) + *reg_id = *structure_str; + else + return -1; + break; default: return -1; }