-/* $Id: zebramap.c,v 1.53 2006-09-08 14:41:00 adam Exp $
- Copyright (C) 1995-2006
+/* $Id: zebramap.c,v 1.59 2007-10-29 16:57:54 adam Exp $
+ Copyright (C) 1995-2007
Index Data ApS
This file is part of the Zebra server.
#define ZEBRA_MAP_TYPE_SORT 1
#define ZEBRA_MAP_TYPE_INDEX 2
+#define ZEBRA_MAP_TYPE_STATICRANK 3
#define ZEBRA_REPLACE_ANY 300
chrmaptab_destroy(zm->maptab);
zm = zm->next;
}
- wrbuf_free(zms->wrbuf_1, 1);
+ wrbuf_destroy(zms->wrbuf_1);
nmem_destroy(zms->nmem);
xfree(zms);
}
(*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'",
}
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)
{
}
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)
{
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);
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)
{
}
int zebra_maps_attr(ZebraMaps zms, Z_AttributesPlusTerm *zapt,
- unsigned *reg_id, char **search_type, char *rank_type,
+ const char **index_type, char **search_type, char *rank_type,
int *complete_flag, int *sort_flag)
{
AttrType completeness;
AttrType use;
int completeness_value;
int structure_value;
+ const char *structure_str = 0;
int relation_value;
int sort_relation_value;
int weight_value;
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);
*complete_flag = 1;
else
*complete_flag = 0;
- *reg_id = 0;
+ *index_type = 0;
*sort_flag =(sort_relation_value > 0) ? 1 : 0;
*search_type = "phrase";
sprintf(rank_type, "rank,w=%d,u=%d", weight_value, use_value);
}
if (*complete_flag)
- *reg_id = 'p';
+ *index_type = "p";
else
- *reg_id = 'w';
+ *index_type = "w";
switch (structure_value)
{
case 6: /* word list */
break;
case 107: /* local-number */
*search_type = "local";
- *reg_id = 0;
+ *index_type = 0;
break;
case 109: /* numeric string */
- *reg_id = 'n';
+ *index_type = "n";
*search_type = "numeric";
break;
case 104: /* urx */
- *reg_id = 'u';
+ *index_type = "u";
*search_type = "phrase";
break;
case 3: /* key */
- *reg_id = '0';
+ *index_type = "0";
*search_type = "phrase";
break;
case 4: /* year */
- *reg_id = 'y';
+ *index_type = "y";
*search_type = "phrase";
break;
case 5: /* date */
- *reg_id = 'd';
+ *index_type = "d";
*search_type = "phrase";
break;
+ case -2:
+ if (structure_str && *structure_str)
+ *index_type = structure_str;
+ else
+ return -1;
+ break;
default:
return -1;
}