X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=index%2Fzebrasrv.c;h=999e91545b8ff048d146dda3a8b8daeceaba90bc;hp=8e9a3f06062e79948c6e7a99fdd553b730cac769;hb=5d536c8cf5400b1e4da91061cf736a9ab53e5bd1;hpb=477d69a25bcac01143c26d8842f9d741d638964b diff --git a/index/zebrasrv.c b/index/zebrasrv.c index 8e9a3f0..999e915 100644 --- a/index/zebrasrv.c +++ b/index/zebrasrv.c @@ -1,5 +1,5 @@ /* This file is part of the Zebra server. - Copyright (C) 1994-2010 Index Data + Copyright (C) 1994-2011 Index Data Zebra is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -17,6 +17,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#if HAVE_CONFIG_H +#include +#endif #include #include #include @@ -34,8 +37,10 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include #include +#include #include - +#include +#include #include #include @@ -253,15 +258,12 @@ static void search_terms(ZebraHandle zh, bend_search_rr *r) se->subqueryExpression->u.term->termComment = 0; se->subqueryInterpretation = 0; se->subqueryRecommendation = 0; - if (count > 2147483646) - count = 2147483647; - se->subqueryCount = odr_intdup(r->stream, CAST_ZINT_TO_INT(count)); + se->subqueryCount = odr_intdup(r->stream, count); se->subqueryWeight = 0; se->resultsByDB = 0; } } - static int break_handler(void *client_data) { bend_association assoc =(bend_association) client_data; @@ -270,11 +272,86 @@ static int break_handler(void *client_data) return 0; } +static Z_RPNQuery *query_add_sortkeys(ODR o, Z_RPNQuery *query, + const char *sortKeys) +{ +#if YAZ_VERSIONL >= 0x40200 + /* sortkey layour: path,schema,ascending,caseSensitive,missingValue */ + /* see cql_sortby_to_sortkeys of YAZ. */ + char **sortspec; + int num_sortspec = 0; + int i; + + if (sortKeys) + nmem_strsplit_blank(odr_getmem(o), sortKeys, &sortspec, &num_sortspec); + if (num_sortspec > 0) + { + Z_RPNQuery *nquery; + WRBUF w = wrbuf_alloc(); + + /* left operand 'd' will be replaced by original query */ + wrbuf_puts(w, "@or d"); + for (i = 0; i < num_sortspec; i++) + { + char **arg; + int num_arg; + int ascending = 1; + nmem_strsplitx(odr_getmem(o), ",", sortspec[i], &arg, &num_arg, 0); + + if (num_arg > 5 || num_arg < 1) + { + yaz_log(YLOG_WARN, "Invalid sort spec '%s' num_arg=%d", + sortspec[i], num_arg); + break; + } + if (num_arg > 2 && arg[2][0]) + ascending = atoi(arg[2]); + + if (i < num_sortspec-1) + wrbuf_puts(w, " @or"); + wrbuf_puts(w, " @attr 1="); + yaz_encode_pqf_term(w, arg[0], strlen(arg[0])); + wrbuf_printf(w, "@attr 7=%d %d", ascending ? 1 : 2, i); + } + nquery = p_query_rpn(o, wrbuf_cstr(w)); + if (!nquery) + { + yaz_log(YLOG_WARN, "query_add_sortkeys: bad RPN: '%s'", + wrbuf_cstr(w)); + } + else + { + Z_RPNStructure *s = nquery->RPNStructure; + + if (s->which != Z_RPNStructure_complex) + { + yaz_log(YLOG_WARN, "query_add_sortkeys: not complex operand"); + } + else + { + /* left operand 'd' is replaced by origial query */ + s->u.complex->s1 = query->RPNStructure; + /* and original query points to our new or+sort things */ + query->RPNStructure = s; + } + } + wrbuf_destroy(w); + } +#else + if (sortKeys) + { + yaz_log(YLOG_WARN, "sortkeys ignored because YAZ version < 4.2.0"); + } +#endif + return query; +} + int bend_search(void *handle, bend_search_rr *r) { ZebraHandle zh = (ZebraHandle) handle; zint zhits = 0; ZEBRA_RES res; + Z_RPNQuery *q2; res = zebra_select_databases(zh, r->num_bases, (const char **) r->basenames); @@ -288,7 +365,8 @@ int bend_search(void *handle, bend_search_rr *r) switch (r->query->which) { case Z_Query_type_1: case Z_Query_type_101: - res = zebra_search_RPN_x(zh, r->stream, r->query->u.type_1, + q2 = query_add_sortkeys(r->stream, r->query->u.type_1, r->srw_sortKeys); + res = zebra_search_RPN_x(zh, r->stream, q2, r->setname, &zhits, &r->estimated_hit_count, &r->partial_resultset); @@ -296,9 +374,7 @@ int bend_search(void *handle, bend_search_rr *r) zebra_result(zh, &r->errcode, &r->errstring); else { - if (zhits > 2147483646) - zhits = 2147483647; - r->hits = CAST_ZINT_TO_INT(zhits); + r->hits = zhits; search_terms(zh, r); } break; @@ -382,8 +458,7 @@ static int bend_scan(void *handle, bend_scan_rr *r) { r->entries[i].term = entries[i].term; r->entries[i].display_term = entries[i].display_term; - r->entries[i].occurrences = - CAST_ZINT_TO_INT(entries[i].occurrences); + r->entries[i].occurrences = entries[i].occurrences; } } else