X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=ztest%2Fztest.c;h=d92d21524ce1f043f91c306c3ecd7c3a4a61c810;hp=896f56e55ecfa7b057ab0d92f0295890beb535ad;hb=5541b773e8ee0e5c086946016c060f6f629bd410;hpb=db4394606d431a5070f67299895459d7ed179a4c diff --git a/ztest/ztest.c b/ztest/ztest.c index 896f56e..d92d215 100644 --- a/ztest/ztest.c +++ b/ztest/ztest.c @@ -89,13 +89,14 @@ static void remove_sets(struct session_handle *sh) /** \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) @@ -114,13 +115,19 @@ static Odr_int get_term_hit(Z_RPNStructure *s) 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; @@ -128,7 +135,7 @@ static Odr_int get_term_hit(Z_RPNStructure *s) /** \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 @@ -139,12 +146,23 @@ static Odr_int get_hit_count(Z_Query *q) { 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; } @@ -818,6 +836,7 @@ int ztest_fetch(void *handle, bend_fetch_rr *r) 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) { @@ -918,7 +937,7 @@ int ztest_fetch(void *handle, bend_fetch_rr *r) } 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;