From 00bacc2ba5811fbffb27d32541df068858a84d03 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Wed, 10 Sep 2008 14:52:19 +0200 Subject: [PATCH] Deal with multiple sort keys in zebra::index:: retrievals --- index/retrieve.c | 76 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 44 insertions(+), 32 deletions(-) diff --git a/index/retrieve.c b/index/retrieve.c index 5b602ed..fcf6c76 100644 --- a/index/retrieve.c +++ b/index/retrieve.c @@ -209,16 +209,6 @@ int zebra_special_sort_fetch( int ord; ZebraHandle zh = fi->zh; - /* only accept XML and SUTRS requests */ - if (oid_oidcmp(input_format, yaz_oid_recsyn_xml) - && oid_oidcmp(input_format, yaz_oid_recsyn_sutrs)) - { - yaz_log(YLOG_WARN, "unsupported format for element set zebra::%s", - elemsetname); - *output_format = 0; - return YAZ_BIB1_NO_SYNTAXES_AVAILABLE_FOR_THIS_REQUEST; - } - if (!parse_zebra_elem(elemsetname, &retrieval_index, &retrieval_index_len, &retrieval_type, &retrieval_type_len)) @@ -248,44 +238,66 @@ int zebra_special_sort_fetch( return -1; /* is not a sort index */ else { - char dst_buf[IT_MAX_WORD]; - WRBUF str = wrbuf_alloc(); + WRBUF wrbuf_str = wrbuf_alloc(); const char *index_type; const char *db = 0; const char *string_index = 0; - WRBUF wrbuf = result; - - zebra_sort_sysno(zh->reg->sort_index, fi->sysno); - zebra_sort_type(zh->reg->sort_index, ord); - zebra_sort_read(zh->reg->sort_index, str); - - zebraExplain_lookup_ord(zh->reg->zei, ord, &index_type, &db, &string_index); + WRBUF wrbuf_result = result; + int off = 0; - zebra_term_untrans(zh, index_type, dst_buf, wrbuf_cstr(str)); - + zebraExplain_lookup_ord(zh->reg->zei, ord, &index_type, &db, + &string_index); if (!oid_oidcmp(input_format, yaz_oid_recsyn_xml)) { *output_format = yaz_oid_recsyn_xml; - wrbuf_printf(wrbuf, ZEBRA_XML_HEADER_STR + wrbuf_printf(wrbuf_result, ZEBRA_XML_HEADER_STR " sysno=\"" ZINT_FORMAT "\"" " set=\"zebra::index%s/\">\n", fi->sysno, elemsetname); - - wrbuf_printf(wrbuf, " ", index_type); - wrbuf_xmlputs(wrbuf, dst_buf); - wrbuf_printf(wrbuf, "\n"); - wrbuf_printf(wrbuf, "\n"); } else if (!oid_oidcmp(input_format, yaz_oid_recsyn_sutrs)) { *output_format = yaz_oid_recsyn_sutrs; + } + else + { + yaz_log(YLOG_WARN, "unsupported format for element set zebra::%s", + elemsetname); + *output_format = 0; + wrbuf_destroy(wrbuf_str); + return YAZ_BIB1_NO_SYNTAXES_AVAILABLE_FOR_THIS_REQUEST; + } + zebra_sort_type(zh->reg->sort_index, ord); + zebra_sort_sysno(zh->reg->sort_index, fi->sysno); + zebra_sort_read(zh->reg->sort_index, wrbuf_str); + + while (off != wrbuf_len(wrbuf_str)) + { + char dst_buf[IT_MAX_WORD]; + assert(off < wrbuf_len(wrbuf_str)); + zebra_term_untrans(zh, index_type, dst_buf, + wrbuf_buf(wrbuf_str)+off); - wrbuf_printf(wrbuf, "%s %s %s\n", string_index, index_type, - dst_buf); + if (!oid_oidcmp(input_format, yaz_oid_recsyn_xml)) + { + wrbuf_printf(wrbuf_result, " ", index_type); + wrbuf_xmlputs(wrbuf_result, dst_buf); + wrbuf_printf(wrbuf_result, "\n"); + } + else if (!oid_oidcmp(input_format, yaz_oid_recsyn_sutrs)) + { + wrbuf_printf(wrbuf_result, "%s %s %s\n", string_index, index_type, + dst_buf); + } + off += strlen(wrbuf_buf(wrbuf_str)+off) + 1; + } + if (!oid_oidcmp(input_format, yaz_oid_recsyn_xml)) + { + wrbuf_printf(wrbuf_result, "\n"); } - wrbuf_destroy(str); + wrbuf_destroy(wrbuf_str); return 0; } } -- 1.7.10.4