-/* $Id: zebramap.c,v 1.47 2006-05-10 08:13:46 adam Exp $
- Copyright (C) 1995-2005
+/* $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.
#include <ctype.h>
#include <charmap.h>
+#include <attrfind.h>
#include <yaz/yaz-util.h>
-#include <idzebra/zebramap.h>
+#include <zebramap.h>
#define ZEBRA_MAP_TYPE_SORT 1
#define ZEBRA_MAP_TYPE_INDEX 2
+#define ZEBRA_MAP_TYPE_STATICRANK 3
#define ZEBRA_REPLACE_ANY 300
unsigned reg_id;
int completeness;
int positioned;
+ int alwaysmatches;
+ int first_in_field;
int type;
union {
struct {
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)))
}
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;
(*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;
(*zm)->maptab = NULL;
(*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 && !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]);
+ 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 (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)
+ {
+ 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;
for (zp = zms->map_list; zp; zp = zp->next)
zms->lookup_array[zp->reg_id] = zp;
+ if (failures)
+ return ZEBRA_FAIL;
return ZEBRA_OK;
}
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);
/* ------------------------------------ */
-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;
}
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)
{
weight_value = 34;
sprintf(rank_type, "rank,w=%d,u=%d", weight_value, use_value);
}
- if (relation_value == 103)
- {
- *search_type = "always";
- return 0;
- }
if (*complete_flag)
*reg_id = 'p';
else