* Sebastian Hammer, Adam Dickmeiss
*
* $Log: zebramap.c,v $
- * Revision 1.20 2000-03-02 14:35:19 adam
+ * Revision 1.25 2002-04-05 12:54:29 adam
+ * Using yaz_fclose
+ *
+ * Revision 1.24 2002/04/04 20:50:37 adam
+ * Multi register works with record paths and data1 profile path
+ *
+ * Revision 1.23 2001/11/15 08:41:24 adam
+ * Fix for weight (bug introduced by previous commit).
+ *
+ * Revision 1.22 2001/11/14 22:06:27 adam
+ * Rank-weight may be controlled via query.
+ *
+ * Revision 1.21 2001/01/22 10:42:56 adam
+ * Added numerical sort.
+ *
+ * Revision 1.20 2000/03/02 14:35:19 adam
* Added structure year and date.
*
* Revision 1.19 1999/11/30 13:48:04 adam
struct zebra_maps {
char *tabpath;
+ char *tabroot;
NMEM nmem;
struct zebra_map *map_list;
char temp_map_str[2];
int lineno = 0;
struct zebra_map **zm = 0, *zp;
- if (!(f = yaz_path_fopen(zms->tabpath, name, "r")))
+ if (!(f = yaz_fopen(zms->tabpath, name, "r", zms->tabroot)))
{
logf(LOG_WARN|LOG_ERRNO, "%s", name);
return ;
}
if (zm)
(*zm)->next = NULL;
- fclose (f);
+ yaz_fclose (f);
for (zp = zms->map_list; zp; zp = zp->next)
zms->lookup_array[zp->reg_id] = zp;
zebra_map_read (zms, value);
}
-ZebraMaps zebra_maps_open (Res res)
+ZebraMaps zebra_maps_open (Res res, const char *base)
{
ZebraMaps zms = (ZebraMaps) xmalloc (sizeof(*zms));
int i;
zms->nmem = nmem_create ();
zms->tabpath = nmem_strdup (zms->nmem,
res_get_def (res, "profilePath", "."));
+ zms->tabroot = 0;
+ if (base)
+ zms->tabroot = nmem_strdup (zms->nmem, base);
zms->map_list = NULL;
zms->temp_map_str[0] = '\0';
zms->wrbuf_1 = wrbuf_alloc();
zms->wrbuf_2 = wrbuf_alloc();
+
return zms;
}
if (!zm->maptab_name || !yaz_matchstr (zm->maptab_name, "@"))
return NULL;
if (!(zm->maptab = chrmaptab_create (zms->tabpath,
- zm->maptab_name, 0)))
+ zm->maptab_name, 0,
+ zms->tabroot)))
logf(LOG_WARN, "Failed to read character table %s",
zm->maptab_name);
else
return 0;
}
-int zebra_maps_sort (ZebraMaps zms, Z_SortAttributes *sortAttributes)
+int zebra_maps_sort (ZebraMaps zms, Z_SortAttributes *sortAttributes,
+ int *numerical)
{
AttrType use;
+ AttrType structure;
+ int structure_value;
attr_init_AttrList (&use, sortAttributes->list, 1);
+ attr_init_AttrList (&structure, sortAttributes->list, 4);
+ *numerical = 0;
+ structure_value = attr_find (&structure, 0);
+ if (structure_value == 109)
+ *numerical = 1;
return attr_find (&use, NULL);
}
int zebra_maps_attr (ZebraMaps zms, Z_AttributesPlusTerm *zapt,
- unsigned *reg_id, char **search_type, char **rank_type,
+ unsigned *reg_id, char **search_type, char *rank_type,
int *complete_flag, int *sort_flag)
{
AttrType completeness;
AttrType structure;
AttrType relation;
AttrType sort_relation;
+ AttrType weight;
int completeness_value;
int structure_value;
int relation_value;
int sort_relation_value;
+ int weight_value;
attr_init_APT (&structure, zapt, 4);
attr_init_APT (&completeness, zapt, 6);
attr_init_APT (&relation, zapt, 2);
attr_init_APT (&sort_relation, zapt, 7);
+ attr_init_APT (&weight, zapt, 9);
completeness_value = attr_find (&completeness, NULL);
structure_value = attr_find (&structure, NULL);
relation_value = attr_find (&relation, NULL);
sort_relation_value = attr_find (&sort_relation, NULL);
+ weight_value = attr_find (&weight, NULL);
if (completeness_value == 2 || completeness_value == 3)
*complete_flag = 1;
*sort_flag = (sort_relation_value > 0) ? 1 : 0;
*search_type = "phrase";
- *rank_type = "void";
+ strcpy (rank_type, "void");
if (relation_value == 102)
- *rank_type = "rank";
-
+ {
+ if (weight_value == -1)
+ weight_value = 34;
+ sprintf (rank_type, "rank,%d", weight_value);
+ }
if (*complete_flag)
*reg_id = 'p';
else