X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=util%2Fzebramap.c;h=dfec14ccb05e4e4a7e7e8a1228d5410fe6509330;hp=fa1d499d8f98f83217defa2eaae14e3711ba1697;hb=25aa9d21203318cca1927f906ab4f7370e43a5fe;hpb=6660da7da58c0cba7336a97394577a432058b9e4 diff --git a/util/zebramap.c b/util/zebramap.c index fa1d499..dfec14c 100644 --- a/util/zebramap.c +++ b/util/zebramap.c @@ -1,5 +1,5 @@ -/* $Id: zebramap.c,v 1.50 2006-06-22 09:48:09 adam Exp $ - Copyright (C) 1995-2006 +/* $Id: zebramap.c,v 1.56 2007-01-22 18:15:04 adam Exp $ + Copyright (C) 1995-2007 Index Data ApS This file is part of the Zebra server. @@ -28,10 +28,11 @@ #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 @@ -40,6 +41,7 @@ struct zebra_map { int completeness; int positioned; int alwaysmatches; + int first_in_field; int type; union { struct { @@ -125,6 +127,7 @@ ZEBRA_RES zebra_maps_read_file(ZebraMaps zms, const char *fname) (*zm)->completeness = 0; (*zm)->positioned = 1; (*zm)->alwaysmatches = 0; + (*zm)->first_in_field = 0; zms->no_maps++; } else if (!yaz_matchstr(argv[0], "sort")) @@ -142,6 +145,24 @@ ZEBRA_RES zebra_maps_read_file(ZebraMaps zms, const char *fname) (*zm)->completeness = 0; (*zm)->positioned = 0; (*zm)->alwaysmatches = 0; + (*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) @@ -152,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) { @@ -164,7 +193,18 @@ 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) + { + (*zm)->first_in_field = atoi(argv[1]); } else if (!yaz_matchstr(argv[0], "entrysize") && argc == 2) { @@ -198,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); @@ -329,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) { @@ -346,6 +402,14 @@ int zebra_maps_is_alwaysmatches(ZebraMaps zms, unsigned reg_id) 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) { @@ -408,12 +472,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