/*
- * Copyright (C) 1994-1997, Index Data I/S
+ * Copyright (C) 1994-1998, Index Data I/S
* All rights reserved.
* Sebastian Hammer, Adam Dickmeiss
*
* $Log: zebramap.c,v $
- * Revision 1.3 1997-11-17 15:35:26 adam
+ * Revision 1.7 1998-02-10 12:03:07 adam
+ * Implemented Sort.
+ *
+ * Revision 1.6 1998/01/29 13:36:01 adam
+ * Structure word-list, free-form-text and document-text all
+ * trigger ranked search.
+ *
+ * Revision 1.5 1997/11/19 10:22:14 adam
+ * Bug fix (introduced by previous commit).
+ *
+ * Revision 1.4 1997/11/18 10:05:08 adam
+ * Changed character map facility so that admin can specify character
+ * mapping files for each register type, w, p, etc.
+ *
+ * Revision 1.3 1997/11/17 15:35:26 adam
* Bug fix. Relation=relevance wasn't observed.
*
* Revision 1.2 1997/10/31 12:39:30 adam
struct zebra_map {
int reg_type;
+ int completeness;
+ int sort_flag;
chrmaptab maptab;
+ const char *maptab_name;
struct zebra_map *next;
};
char *tabpath;
NMEM nmem;
struct zebra_map *map_list;
+ char temp_map_str[2];
+ const char *temp_map_ptr[2];
+ struct zebra_map **lookup_array;
};
void zebra_maps_close (ZebraMaps zms)
struct zebra_map *zm = zms->map_list;
while (zm)
{
- struct zebra_map *zm_next = zm->next;
-
- chrmaptab_destroy (zm->maptab);
- xfree (zm);
- zm = zm_next;
+ if (zm->maptab)
+ chrmaptab_destroy (zm->maptab);
+ zm = zm->next;
}
nmem_destroy (zms->nmem);
xfree (zms);
}
-ZebraMaps zebra_maps_open (const char *tabpath)
+static void zebra_map_read (ZebraMaps zms, const char *name)
+{
+ FILE *f;
+ char line[512];
+ char *argv[10];
+ int argc;
+ struct zebra_map **zm = 0, *zp;
+
+ if (!(f = yaz_path_fopen(zms->tabpath, name, "r")))
+ {
+ logf(LOG_WARN|LOG_ERRNO, "%s", name);
+ return ;
+ }
+ while ((argc = readconf_line(f, line, 512, argv, 10)))
+ {
+ if (!strcmp (argv[0], "index") && argc == 2)
+ {
+ if (!zm)
+ zm = &zms->map_list;
+ else
+ zm = &(*zm)->next;
+ *zm = nmem_malloc (zms->nmem, sizeof(**zm));
+ (*zm)->reg_type = argv[1][0];
+ (*zm)->maptab_name = NULL;
+ (*zm)->maptab = NULL;
+ (*zm)->sort_flag = 0;
+ (*zm)->completeness = 0;
+ }
+ else if (!strcmp (argv[0], "sort") && argc == 2)
+ {
+ if (!zm)
+ zm = &zms->map_list;
+ else
+ zm = &(*zm)->next;
+ *zm = nmem_malloc (zms->nmem, sizeof(**zm));
+ (*zm)->reg_type = argv[1][0];
+ (*zm)->maptab_name = NULL;
+ (*zm)->sort_flag = 1;
+ (*zm)->maptab = NULL;
+ (*zm)->completeness = 0;
+ }
+ else if (zm && !strcmp (argv[0], "charmap") && argc == 2)
+ {
+ (*zm)->maptab_name = nmem_strdup (zms->nmem, argv[1]);
+ }
+ else if (zm && !strcmp (argv[0], "completeness") && argc == 2)
+ {
+ (*zm)->completeness = atoi (argv[1]);
+ }
+ }
+ if (zm)
+ (*zm)->next = NULL;
+ fclose (f);
+
+ for (zp = zms->map_list; zp; zp = zp->next)
+ zms->lookup_array[zp->reg_type & 255] = zp;
+}
+
+static void zms_map_handle (void *p, const char *name, const char *value)
+{
+ ZebraMaps zms = p;
+
+ zebra_map_read (zms, value);
+}
+
+ZebraMaps zebra_maps_open (const char *tabpath, Res res)
{
ZebraMaps zms = xmalloc (sizeof(*zms));
+ int i;
zms->nmem = nmem_create ();
zms->tabpath = nmem_strdup (zms->nmem, tabpath);
zms->map_list = NULL;
+
+ zms->temp_map_str[0] = '\0';
+ zms->temp_map_str[1] = '\0';
+
+ zms->temp_map_ptr[0] = zms->temp_map_str;
+ zms->temp_map_ptr[1] = NULL;
+
+ zms->lookup_array =
+ nmem_malloc (zms->nmem, sizeof(*zms->lookup_array)*256);
+ for (i = 0; i<256; i++)
+ zms->lookup_array[i] = 0;
+ if (!res_trav (res, "index", zms, zms_map_handle))
+ zebra_map_read (zms, "default.idx");
return zms;
}
-chrmaptab zebra_map_get (ZebraMaps zms, int reg_type)
+struct zebra_map *zebra_map_get (ZebraMaps zms, int reg_type)
{
- char name[512];
- struct zebra_map *zm;
+ return zms->lookup_array[reg_type];
+}
- for (zm = zms->map_list; zm; zm = zm->next)
+chrmaptab zebra_charmap_get (ZebraMaps zms, int reg_type)
+{
+ struct zebra_map *zm = zebra_map_get (zms, reg_type);
+ if (!zm)
{
- if (reg_type == zm->reg_type)
- return zm->maptab;
+ logf (LOG_WARN, "Unknown register type: %c", reg_type);
+ return NULL;
}
- *name = '\0';
- switch (reg_type)
+ if (!zm->maptab)
{
- case 'w':
- case 'p':
- strcat (name, "string");
- break;
- case 'n':
- strcat (name, "numeric");
- break;
- case 'u':
- strcat (name, "urx");
- break;
- default:
- strcat (name, "null");
+ if (!strcmp (zm->maptab_name, "@"))
+ return NULL;
+ if (!(zm->maptab = chrmaptab_create (zms->tabpath,
+ zm->maptab_name, 0)))
+ logf(LOG_WARN, "Failed to read character table %s",
+ zm->maptab_name);
+ else
+ logf(LOG_DEBUG, "Read character table %s", zm->maptab_name);
}
- strcat (name, ".chr");
-
- zm = xmalloc (sizeof(*zm));
- zm->reg_type = reg_type;
- zm->next = zms->map_list;
- zms->map_list = zm;
- if (!(zm->maptab = chrmaptab_create (zms->tabpath, name, 0)))
- logf(LOG_WARN, "Failed to read character table %s", name);
- else
- logf(LOG_DEBUG, "Read character table %s", name);
return zm->maptab;
}
const char **zebra_maps_input (ZebraMaps zms, int reg_type,
const char **from, int len)
{
- static char str[2] = {0,0};
- static const char *buf[2] = {0,0};
chrmaptab maptab;
- maptab = zebra_map_get (zms, reg_type);
+ maptab = zebra_charmap_get (zms, reg_type);
if (maptab)
return chr_map_input(maptab, from, len);
-
- if (isalnum(**from))
- {
- str[0] = isupper(**from) ? tolower(**from) : **from;
- buf[0] = str;
- }
- else
- buf[0] = (char*) CHR_SPACE;
+
+ zms->temp_map_str[0] = **from;
+
(*from)++;
- return buf;
+ return zms->temp_map_ptr;
}
const char *zebra_maps_output(ZebraMaps zms, int reg_type, const char **from)
unsigned char i = (unsigned char) **from;
static char buf[2] = {0,0};
- maptab = zebra_map_get (zms, reg_type);
+ maptab = zebra_charmap_get (zms, reg_type);
if (maptab)
return chr_map_output (maptab, from, 1);
(*from)++;
int type;
int major;
int minor;
- Z_AttributesPlusTerm *zapt;
+ Z_AttributeElement **attributeList;
+ int num_attributes;
} AttrType;
static int attr_find (AttrType *src, oid_value *attributeSetP)
{
- while (src->major < src->zapt->num_attributes)
+ while (src->major < src->num_attributes)
{
Z_AttributeElement *element;
- element = src->zapt->attributeList[src->major];
+ element = src->attributeList[src->major];
if (src->type == *element->attributeType)
{
switch (element->which)
return -1;
}
-static void attr_init (AttrType *src, Z_AttributesPlusTerm *zapt,
- int type)
+static void attr_init_APT (AttrType *src, Z_AttributesPlusTerm *zapt, int type)
+{
+
+ src->attributeList = zapt->attributeList;
+ src->num_attributes = zapt->num_attributes;
+ src->type = type;
+ src->major = 0;
+ src->minor = 0;
+}
+
+static void attr_init_AttrList (AttrType *src, Z_AttributeList *list, int type)
{
- src->zapt = zapt;
+ 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, int reg_type)
+{
+ struct zebra_map *zm = zebra_map_get (zms, reg_type);
+ if (zm)
+ return zm->completeness;
+ return 0;
+}
+
+int zebra_maps_is_sort (ZebraMaps zms, int reg_type)
{
- if (reg_type == 'p')
- return 1;
+ struct zebra_map *zm = zebra_map_get (zms, reg_type);
+ if (zm)
+ return zm->sort_flag;
return 0;
}
+int zebra_maps_sort (ZebraMaps zms, Z_SortAttributes *sortAttributes)
+{
+ AttrType use;
+ attr_init_AttrList (&use, sortAttributes->list, 1);
+
+ return attr_find (&use, NULL);
+}
+
int zebra_maps_attr (ZebraMaps zms, Z_AttributesPlusTerm *zapt,
int *reg_type, char **search_type, int *complete_flag)
{
int structure_value;
int relation_value;
- attr_init (&structure, zapt, 4);
- attr_init (&completeness, zapt, 6);
- attr_init (&relation, zapt, 2);
+ attr_init_APT (&structure, zapt, 4);
+ attr_init_APT (&completeness, zapt, 6);
+ attr_init_APT (&relation, zapt, 2);
completeness_value = attr_find (&completeness, NULL);
structure_value = attr_find (&structure, NULL);
switch (structure_value)
{
+ case 6: /* word list */
+ case 105: /* free-form-text */
+ case 106: /* document-text */
+ *search_type = "ranked";
+ *reg_type = 'w';
+ break;
case -1:
case 1: /* phrase */
case 2: /* word */
case 3: /* key */
- case 6: /* word list */
- case 105: /* free-form-text */
- case 106: /* document-text */
case 108: /* string */
if (*complete_flag)
*reg_type = 'p';