X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=util%2Fzebramap.c;h=0a7cfb9bc8ba4722a8fd852879782a633f86cbcc;hb=43e4297c07b9c8b29bfc1ea647fc27456198f6ce;hp=d2ac8f9793e86c5e0fff418efdf2d9e854fba798;hpb=388742fccf1ecb74c539c70fd1ac7f15f329932a;p=idzebra-moved-to-github.git diff --git a/util/zebramap.c b/util/zebramap.c index d2ac8f9..0a7cfb9 100644 --- a/util/zebramap.c +++ b/util/zebramap.c @@ -1,5 +1,5 @@ -/* $Id: zebramap.c,v 1.48 2006-05-17 17:46:45 adam Exp $ - Copyright (C) 1995-2005 +/* $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. @@ -25,12 +25,14 @@ #include #include +#include #include -#include +#include #define ZEBRA_MAP_TYPE_SORT 1 #define ZEBRA_MAP_TYPE_INDEX 2 +#define ZEBRA_MAP_TYPE_STATICRANK 3 #define ZEBRA_REPLACE_ANY 300 @@ -38,6 +40,8 @@ struct zebra_map { unsigned reg_id; int completeness; int positioned; + int alwaysmatches; + int first_in_field; int type; union { struct { @@ -73,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); } @@ -85,6 +89,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))) @@ -94,7 +99,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; @@ -107,9 +126,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; @@ -123,25 +144,79 @@ 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 (!yaz_matchstr(argv[0], "staticrank")) { - (*zm)->maptab_name = nmem_strdup(zms->nmem, argv[1]); + 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_matchstr(argv[0], "completeness") && 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) + { + 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) { (*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) + { + 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) + { + (*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; @@ -150,6 +225,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; } @@ -161,7 +238,7 @@ ZebraMaps zebra_maps_open(Res res, const char *base_path, zms->nmem = nmem_create(); zms->no_maps = 0; - zms->tabpath = nmem_strdup(zms->nmem, profile_path); + zms->tabpath = profile_path ? nmem_strdup(zms->nmem, profile_path) : 0; zms->tabroot = 0; if (base_path) zms->tabroot = nmem_strdup(zms->nmem, base_path); @@ -277,92 +354,35 @@ const char *zebra_maps_output(ZebraMaps zms, unsigned reg_id, /* ------------------------------------ */ -typedef struct { - int type; - int major; - int minor; - Z_AttributeElement **attributeList; - int num_attributes; -} AttrType; - -static int attr_find(AttrType *src, oid_value *attributeSetP) -{ - while (src->major < src->num_attributes) - { - Z_AttributeElement *element; - - element = src->attributeList[src->major]; - if (src->type == *element->attributeType) - { - switch (element->which) - { - case Z_AttributeValue_numeric: - ++(src->major); - if (element->attributeSet && attributeSetP) - { - oident *attrset; - - attrset = oid_getentbyoid(element->attributeSet); - *attributeSetP = attrset->value; - } - return *element->value.numeric; - break; - case Z_AttributeValue_complex: - if (src->minor >= element->value.complex->num_list || - element->value.complex->list[src->minor]->which != - Z_StringOrNumeric_numeric) - break; - ++(src->minor); - if (element->attributeSet && attributeSetP) - { - oident *attrset; - - attrset = oid_getentbyoid(element->attributeSet); - *attributeSetP = attrset->value; - } - return *element->value.complex->list[src->minor-1]->u.numeric; - default: - assert(0); - } - } - ++(src->major); - } - return -1; +int zebra_maps_is_complete(ZebraMaps zms, unsigned reg_id) +{ + struct zebra_map *zm = zebra_map_get(zms, reg_id); + if (zm) + return zm->completeness; + return 0; } -static void attr_init_APT(AttrType *src, Z_AttributesPlusTerm *zapt, int type) +int zebra_maps_is_positioned(ZebraMaps zms, unsigned reg_id) { - src->attributeList = zapt->attributes->attributes; - src->num_attributes = zapt->attributes->num_attributes; - src->type = type; - src->major = 0; - src->minor = 0; + struct zebra_map *zm = zebra_map_get(zms, reg_id); + if (zm) + return zm->positioned; + return 0; } -static void attr_init_AttrList(AttrType *src, Z_AttributeList *list, int type) +int zebra_maps_is_index(ZebraMaps zms, unsigned reg_id) { - src->attributeList = list->attributes; - src->num_attributes = list->num_attributes; - src->type = type; - src->major = 0; - src->minor = 0; -} - -/* ------------------------------------ */ - -int zebra_maps_is_complete(ZebraMaps zms, unsigned reg_id) -{ struct zebra_map *zm = zebra_map_get(zms, reg_id); if (zm) - return zm->completeness; + return zm->type == ZEBRA_MAP_TYPE_INDEX; return 0; } -int zebra_maps_is_positioned(ZebraMaps zms, unsigned reg_id) +int zebra_maps_is_staticrank(ZebraMaps zms, unsigned reg_id) { struct zebra_map *zm = zebra_map_get(zms, reg_id); if (zm) - return zm->positioned; + return zm->type == ZEBRA_MAP_TYPE_STATICRANK; return 0; } @@ -374,6 +394,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) { @@ -402,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; @@ -415,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); @@ -436,12 +473,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 @@ -487,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; }