-/* $Id: zsets.c,v 1.81 2005-04-25 11:54:08 adam Exp $
+/* $Id: zsets.c,v 1.82 2005-05-11 12:39:37 adam Exp $
Copyright (C) 1995-2005
Index Data ApS
#endif
#include "index.h"
+#include <yaz/diagbib1.h>
#include <rset.h>
#define SORT_IDX_ENTRYSIZE 64
};
static int log_level_set=0;
-static int log_level_sorting=0;
+static int log_level_sort=0;
static int log_level_searchhits=0;
static int log_level_searchterms=0;
static int log_level_resultsets=0;
{
if (log_level_set)
return;
- log_level_sorting = yaz_log_module_level("sorting");
+ log_level_sort = yaz_log_module_level("sorting");
log_level_searchhits = yaz_log_module_level("searchhits");
log_level_searchterms = yaz_log_module_level("searchterms");
log_level_resultsets = yaz_log_module_level("resultsets");
oident *attrset;
Z_SortKeySpecList *sort_sequence;
int sort_status, i;
- ZEBRA_RES res;
+ ZEBRA_RES res = ZEBRA_OK;
- zh->errCode = 0;
- zh->errString = NULL;
zh->hits = 0;
sort_sequence = (Z_SortKeySpecList *)
sset->rset = 0;
return res;
}
-
- if (zh->errCode)
- yaz_log(YLOG_DEBUG, "search error: %d", zh->errCode);
-
for (i = 0; sort_sequence->specs[i]; i++)
;
sort_sequence->num_specs = i;
if (!i)
- resultSetRank (zh, sset, rset, rset_nmem);
+ {
+ res = resultSetRank (zh, sset, rset, rset_nmem);
+ }
else
{
- yaz_log(YLOG_DEBUG, "resultSetSortSingle in rpn_search");
- resultSetSortSingle (zh, nmem, sset, rset,
- sort_sequence, &sort_status);
- if (zh->errCode)
- {
- yaz_log(YLOG_DEBUG, "resultSetSortSingle status = %d", zh->errCode);
- }
+ res = resultSetSortSingle (zh, nmem, sset, rset,
+ sort_sequence, &sort_status);
}
sset->rset = rset;
- return ZEBRA_OK;
+ return res;
}
int i;
ZEBRA_RES res;
- zh->errCode = 0;
- zh->errString = NULL;
zh->hits = 0;
zebraSet = resultSetAdd (zh, setname, 1);
if (statuses)
for (i = 0; i<num; i++)
statuses[i] = Z_DeleteStatus_resultSetDidNotExist;
- zh->errCode = 0;
- zh->errString = NULL;
while (*ss)
{
int i = -1;
position = positions[i];
if (position > 0 && position <= sort_info->num_entries)
{
- yaz_log(log_level_sorting, "got pos=" ZINT_FORMAT
+ yaz_log(log_level_sort, "got pos=" ZINT_FORMAT
" (sorted)", position);
sr[i].sysno = sort_info->entries[position-1]->sysno;
sr[i].score = sort_info->entries[position-1]->score;
if (position == positions[num_i])
{
sr[num_i].sysno = psysno;
- yaz_log(log_level_sorting, "got pos=" ZINT_FORMAT " (unsorted)", position);
+ yaz_log(log_level_sort, "got pos=" ZINT_FORMAT " (unsorted)", position);
sr[num_i].score = -1;
num_i++;
}
new_entry->score = score;
}
-void resultSetSort (ZebraHandle zh, NMEM nmem,
- int num_input_setnames, const char **input_setnames,
- const char *output_setname,
- Z_SortKeySpecList *sort_sequence, int *sort_status)
+ZEBRA_RES resultSetSort(ZebraHandle zh, NMEM nmem,
+ int num_input_setnames, const char **input_setnames,
+ const char *output_setname,
+ Z_SortKeySpecList *sort_sequence, int *sort_status)
{
ZebraSet sset;
RSET rset;
if (num_input_setnames == 0)
{
- zh->errCode = 208;
- return ;
+ zebra_setError(zh, YAZ_BIB1_NO_RESULT_SET_NAME_SUPPLIED_ON_SORT, 0);
+ return ZEBRA_FAIL;
}
if (num_input_setnames > 1)
{
- zh->errCode = 230;
- return;
+ zebra_setError(zh, YAZ_BIB1_SORT_TOO_MANY_INPUT_RESULTS, 0);
+ return ZEBRA_FAIL;
}
if (!log_level_set)
loglevels();
- yaz_log(log_level_sorting, "result set sort input=%s output=%s",
+ yaz_log(log_level_sort, "result set sort input=%s output=%s",
*input_setnames, output_setname);
sset = resultSetGet (zh, input_setnames[0]);
if (!sset)
{
- zh->errCode = 30;
- zh->errString = nmem_strdup (nmem, input_setnames[0]);
- return;
+ zebra_setError(zh, YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST,
+ input_setnames[0]);
+ return ZEBRA_FAIL;
}
if (!(rset = sset->rset))
{
- zh->errCode = 30;
- zh->errString = nmem_strdup (nmem, input_setnames[0]);
- return;
+ zebra_setError(zh, YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST,
+ input_setnames[0]);
+ return ZEBRA_FAIL;
}
if (strcmp (output_setname, input_setnames[0]))
{
sset = resultSetAdd (zh, output_setname, 1);
sset->rset = rset;
}
- resultSetSortSingle (zh, nmem, sset, rset, sort_sequence, sort_status);
+ return resultSetSortSingle (zh, nmem, sset, rset, sort_sequence,
+ sort_status);
}
-void resultSetSortSingle (ZebraHandle zh, NMEM nmem,
- ZebraSet sset, RSET rset,
- Z_SortKeySpecList *sort_sequence, int *sort_status)
+ZEBRA_RES resultSetSortSingle(ZebraHandle zh, NMEM nmem,
+ ZebraSet sset, RSET rset,
+ Z_SortKeySpecList *sort_sequence,
+ int *sort_status)
{
int i;
int n = 0;
sort_criteria[i].relation = 'D';
else
{
- zh->errCode = 214;
- return;
+ zebra_setError(zh, YAZ_BIB1_ILLEGAL_SORT_RELATION, 0);
+ return ZEBRA_FAIL;
}
if (sks->sortElement->which == Z_SortElement_databaseSpecific)
{
- zh->errCode = 210;
- return;
+ zebra_setError(zh, YAZ_BIB1_DATABASE_SPECIFIC_SORT_UNSUPP, 0);
+ return ZEBRA_FAIL;
}
else if (sks->sortElement->which != Z_SortElement_generic)
{
- zh->errCode = 237;
- return;
+ zebra_setError(zh, YAZ_BIB1_SORT_ILLEGAL_SORT, 0);
+ return ZEBRA_FAIL;
}
sk = sks->sortElement->u.generic;
switch (sk->which)
{
case Z_SortKey_sortField:
- yaz_log(log_level_sorting, "Sort: key %d is of type sortField", i+1);
- zh->errCode = 207;
- return;
+ yaz_log(log_level_sort, "key %d is of type sortField",
+ i+1);
+ zebra_setError(zh, YAZ_BIB1_CANNOT_SORT_ACCORDING_TO_SEQUENCE, 0);
+ return ZEBRA_FAIL;
case Z_SortKey_elementSpec:
- yaz_log(log_level_sorting, "Sort: key %d is of type elementSpec", i+1);
- zh->errCode = 207;
- return;
+ yaz_log(log_level_sort, "key %d is of type elementSpec",
+ i+1);
+ zebra_setError(zh, YAZ_BIB1_CANNOT_SORT_ACCORDING_TO_SEQUENCE, 0);
+ return ZEBRA_FAIL;
case Z_SortKey_sortAttributes:
- yaz_log(log_level_sorting, "Sort: key %d is of type sortAttributes", i+1);
+ yaz_log(log_level_sort, "key %d is of type sortAttributes", i+1);
sort_criteria[i].attrUse =
zebra_maps_sort (zh->reg->zebra_maps,
sk->u.sortAttributes,
&sort_criteria[i].numerical);
- yaz_log(log_level_sorting, "use value = %d", sort_criteria[i].attrUse);
+ yaz_log(log_level_sort, "use value = %d", sort_criteria[i].attrUse);
if (sort_criteria[i].attrUse == -1)
{
- zh->errCode = 116;
- return;
+ zebra_setError(
+ zh, YAZ_BIB1_USE_ATTRIBUTE_REQUIRED_BUT_NOT_SUPPLIED, 0);
+ return ZEBRA_FAIL;
}
if (sortIdx_type (zh->reg->sortIdx, sort_criteria[i].attrUse))
{
- zh->errCode = 207;
- return;
+ zebra_setError(
+ zh, YAZ_BIB1_CANNOT_SORT_ACCORDING_TO_SEQUENCE, 0);
+ return ZEBRA_FAIL;
}
break;
}
}
rfd = rset_open (rset, RSETF_READ);
+ /* FIXME - pass a TERMID *, and use it for something below !! */
while (rset_read (rfd, &key, &termid))
- /* FIXME - pass a TERMID *, and use it for something below !! */
{
zint this_sys = key.mem[0];
kno++;
}
}
rset_close (rfd);
- yaz_log(log_level_sorting, ZINT_FORMAT " keys, " ZINT_FORMAT " sysnos, sort",
+ yaz_log(log_level_sort, ZINT_FORMAT " keys, " ZINT_FORMAT " sysnos, sort",
kno, sset->hits);
for (i = 0; i < numTerms; i++)
- yaz_log(log_level_sorting, "term=\"%s\" type=%s count=" ZINT_FORMAT,
+ yaz_log(log_level_sort, "term=\"%s\" type=%s count=" ZINT_FORMAT,
terms[i]->name, terms[i]->flags, rset_count(terms[i]->rset));
*sort_status = Z_SortResponse_success;
+ return ZEBRA_OK;
}
RSET resultSetRef (ZebraHandle zh, const char *resultSetId)
return NULL;
}
-void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset, NMEM nmem)
+ZEBRA_RES resultSetRank (ZebraHandle zh, ZebraSet zebraSet,
+ RSET rset, NMEM nmem)
{
zint kno = 0;
struct it_key key;
sort_info->num_entries = 0;
zebraSet->hits = 0;
rset_getterms(rset, 0, 0, &n);
+ yaz_log(YLOG_LOG, "Got %d terms", n);
terms = (TERMID *) nmem_malloc(nmem, sizeof(*terms)*n);
rset_getterms(rset, terms, n, &numTerms);
if (!rank_class)
{
yaz_log(YLOG_WARN, "No such rank handler: %s", rank_handler_name);
- return;
+ zebra_setError(zh, YAZ_BIB1_UNSUPP_SEARCH, "Cannot find rank handler");
+ return ZEBRA_FAIL;
}
rc = rank_class->control;
(*rc->end) (zh->reg, handle);
}
rset_close (rfd);
-
- yaz_log(log_level_searchterms, ZINT_FORMAT " keys, " ZINT_FORMAT " sysnos, rank",
- kno, zebraSet->hits);
+
+ yaz_log(log_level_searchterms, ZINT_FORMAT " keys, "
+ ZINT_FORMAT " sysnos, rank", kno, zebraSet->hits);
for (i = 0; i < numTerms; i++)
{
- yaz_log(log_level_searchterms, "term=\"%s\" type=%s count=" ZINT_FORMAT,
- terms[i]->name, terms[i]->flags, rset_count(terms[i]->rset));
+ yaz_log(log_level_searchterms, "term=\"%s\" type=%s count="
+ ZINT_FORMAT,
+ terms[i]->name, terms[i]->flags, rset_count(terms[i]->rset));
}
+ return ZEBRA_OK;
}
ZebraRankClass zebraRankLookup (ZebraHandle zh, const char *name)