/* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2012 Index Data
+ * Copyright (C) 1995-2013 Index Data
* See the file LICENSE for details.
*/
/** \file
/** \brief use term value as hit count
\param s RPN structure
+ \param hash value for compuation
\return >= 0: search term number or -1: not found
Traverse RPN tree 'in order' and use term value as hit count.
Only terms that looks a numeric is used.. Returns -1 if
no sub tree has a hit count term
*/
-static Odr_int get_term_hit(Z_RPNStructure *s)
+static Odr_int get_term_hit(Z_RPNStructure *s, unsigned *hash)
{
Odr_int h = -1;
switch(s->which)
h = odr_atoi(wrbuf_cstr(hits_str));
wrbuf_destroy(hits_str);
}
+ else
+ {
+ int i;
+ for (i = 0; i < oct->len; i++)
+ *hash = *hash * 65509 + oct->buf[i];
+ }
}
}
break;
case Z_RPNStructure_complex:
- h = get_term_hit(s->u.complex->s1);
+ h = get_term_hit(s->u.complex->s1, hash);
if (h == -1)
- h = get_term_hit(s->u.complex->s2);
+ h = get_term_hit(s->u.complex->s2, hash);
break;
}
return h;
/** \brief gets hit count for numeric terms in RPN queries
\param q RPN Query
- \return number of hits (random or number for term)
+ \return number of hits
This is just for testing.. A real database of course uses
the content of a database to establish a value.. In our case, we
{
if (q->which == Z_Query_type_1 || q->which == Z_Query_type_101)
{
+ unsigned hash = 0;
Odr_int h = -1;
- h = get_term_hit(q->u.type_1->RPNStructure);
+ h = get_term_hit(q->u.type_1->RPNStructure, &hash);
if (h == -1)
- h = rand() % 24;
+ h = hash % 24;
return h;
}
+ else if (q->which == Z_Query_type_104 &&
+ q->u.type_104->which == Z_External_CQL)
+ {
+ unsigned hash = 0;
+ const char *cql = q->u.type_104->u.cql;
+ int i;
+ for (i = 0; cql[i]; i++)
+ hash = hash * 65509 + cql[i];
+ return hash % 24;
+ }
else
return 24;
}
return 0;
}
+static void echo_extra_args(ODR stream,
+ Z_SRW_extra_arg *extra_args, char **extra_response)
+{
+ if (extra_args)
+ {
+ Z_SRW_extra_arg *a;
+ WRBUF response_xml = wrbuf_alloc();
+ wrbuf_puts(response_xml, "<extra>");
+ for (a = extra_args; a; a = a->next)
+ {
+ wrbuf_puts(response_xml, "<extra name=\"");
+ wrbuf_xmlputs(response_xml, a->name);
+ wrbuf_puts(response_xml, "\"");
+ if (a->value)
+ {
+ wrbuf_puts(response_xml, " value=\"");
+ wrbuf_xmlputs(response_xml, a->value);
+ wrbuf_puts(response_xml, "\"");
+ }
+ wrbuf_puts(response_xml, "/>");
+ }
+ wrbuf_puts(response_xml, "</extra>");
+ *extra_response = odr_strdup(stream, wrbuf_cstr(response_xml));
+ wrbuf_destroy(response_xml);
+ }
+
+}
+
int ztest_search(void *handle, bend_search_rr *rr)
{
struct session_handle *sh = (struct session_handle*) handle;
}
}
- if (rr->extra_args)
- {
- Z_SRW_extra_arg *a;
- WRBUF response_xml = wrbuf_alloc();
- wrbuf_puts(response_xml, "<extra>");
- for (a = rr->extra_args; a; a = a->next)
- {
- wrbuf_puts(response_xml, "<extra name=\"");
- wrbuf_xmlputs(response_xml, a->name);
- wrbuf_puts(response_xml, "\"");
- if (a->value)
- {
- wrbuf_puts(response_xml, " value=\"");
- wrbuf_xmlputs(response_xml, a->value);
- wrbuf_puts(response_xml, "\"");
- }
- wrbuf_puts(response_xml, "/>");
- }
- wrbuf_puts(response_xml, "</extra>");
- rr->extra_response_data =
- odr_strdup(rr->stream, wrbuf_cstr(response_xml));
- wrbuf_destroy(response_xml);
- }
+ echo_extra_args(rr->stream, rr->extra_args, &rr->extra_response_data);
rr->hits = get_hit_count(rr->query);
if (1)
char *cp;
const Odr_oid *oid = r->request_format;
struct result_set *set = get_set(sh, r->setname);
+ const char *esn = yaz_get_esn(r->comp);
if (!set)
{
}
else if (!oid_oidcmp(oid, yaz_oid_recsyn_xml))
{
- if ((cp = dummy_xml_record(r->number, r->stream)))
+ if ((cp = dummy_xml_record(r->number, r->stream, esn)))
{
r->len = strlen(cp);
r->record = cp;
if (q->num_entries >= num_entries_req)
break;
}
+ echo_extra_args(q->stream, q->extra_args, &q->extra_response_data);
if (feof(f))
q->status = BEND_SCAN_PARTIAL;
return 0;