X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fretrieve.c;h=c41a9261517af6c99572406dc4d9f19d625923f0;hb=7598c76f1a4989a91003bd4fbd90f30a7c7255ef;hp=4ff858610229c1edd5d5f531485a26dbd9ac0e42;hpb=cd02e9c5558d2f0db2ab83fcad810a6522fd2319;p=idzebra-moved-to-github.git diff --git a/index/retrieve.c b/index/retrieve.c index 4ff8586..c41a926 100644 --- a/index/retrieve.c +++ b/index/retrieve.c @@ -269,7 +269,7 @@ static int sort_fetch( } 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); + zebra_sort_read(zh->reg->sort_index, 0, wrbuf_str); while (off != wrbuf_len(wrbuf_str)) { @@ -484,6 +484,41 @@ static void retrieve_puts_int(WRBUF wrbuf, const char *name, } +static void snippet_check_fields(ZebraHandle zh, WRBUF wrbuf, + zebra_snippets *doc, + const zebra_snippet_word *doc_w, + const char *w_index_type) +{ + /* beginning of snippet. See which fields the snippet also + occur */ + const zebra_snippet_word *w; + int no = 0; + for (w = zebra_snippets_constlist(doc); w; w = w->next) + { + /* same sequence but other field? */ + if (w->seqno == doc_w->seqno && w->ord != doc_w->ord) + { + const char *index_type; + const char *db = 0; + const char *string_index = 0; + + zebraExplain_lookup_ord(zh->reg->zei, w->ord, + &index_type, &db, &string_index); + /* only report for same index type */ + if (!strcmp(w_index_type, index_type)) + { + if (no == 0) + wrbuf_printf(wrbuf, " fields=\"%s", string_index); + else + wrbuf_printf(wrbuf, " %s", string_index); + no++; + } + } + } + if (no) + wrbuf_printf(wrbuf, "\""); +} + static void snippet_xml_record(ZebraHandle zh, WRBUF wrbuf, zebra_snippets *doc) { const zebra_snippet_word *doc_w; @@ -503,8 +538,11 @@ static void snippet_xml_record(ZebraHandle zh, WRBUF wrbuf, zebra_snippets *doc) if (mark_state == 0) { + wrbuf_printf(wrbuf, " ", index_type); + wrbuf_printf(wrbuf, " type=\"%s\"", index_type); + snippet_check_fields(zh, wrbuf, doc, doc_w, index_type); + wrbuf_printf(wrbuf, ">"); } if (doc_w->match) wrbuf_puts(wrbuf, ""); @@ -664,13 +702,20 @@ static int term_qsort_handle(const void *a, const void *b) static void term_collect_freq(ZebraHandle zh, struct term_collect *col, int no_terms_collect, - int ord, RSET rset) + int ord, RSET rset, double scale_factor) { int i; for (i = 0; i < no_terms_collect; i++) { if (col[i].term) - col[i].set_occur = freq_term(zh, ord, col[i].term, rset); + { + if (scale_factor < 0.0) + { + col[i].set_occur = freq_term(zh, ord, col[i].term, rset); + } + else + col[i].set_occur = scale_factor * col[i].oc; + } } qsort(col, no_terms_collect, sizeof(*col), term_qsort_handle); } @@ -736,7 +781,7 @@ static int perform_facet_sort(ZebraHandle zh, int no_ord, int *ord_array, zebra_sort_type(zh->reg->sort_index, ord_array[ord_i]); wrbuf_rewind(w); - if (zebra_sort_read(zh->reg->sort_index, w)) + if (zebra_sort_read(zh->reg->sort_index, 0, w)) { zebra_strmap_t sm = map_array[ord_i]; int off = 0; @@ -876,7 +921,8 @@ static int perform_facet(ZebraHandle zh, no_collect_terms = 1; col = term_collect_create(map_array[i], no_collect_terms, nmem); term_collect_freq(zh, col, no_collect_terms, ord_array[i], - resultSetRef(zh, fi->setname)); + resultSetRef(zh, fi->setname), + cat == zinfo_index_category_sort ? 1.0 : -1.0); if (use_xml) wrbuf_printf(wr, " \n", @@ -943,8 +989,6 @@ static int facet_fetch( /* whether sort or index based */ zinfo_index_category_t cat = zinfo_index_category_sort; - res_get_int(zh->res, "facetNumRecs", &num_recs); - /* see if XML is required for response */ if (oid_oidcmp(input_format, yaz_oid_recsyn_xml) == 0) use_xml = 1; @@ -976,6 +1020,7 @@ static int facet_fetch( if (ord == -1) break; ord_array[i] = ord; + num_recs = 10000; } if (spec) { @@ -995,6 +1040,8 @@ static int facet_fetch( if (spec) return YAZ_BIB1_SPECIFIED_ELEMENT_SET_NAME_NOT_VALID_FOR_SPECIFIED_; + res_get_int(zh->res, "facetNumRecs", &num_recs); + pos_array = (zint *) nmem_malloc(fi->nmem, num_recs * sizeof(*pos_array)); for (i = 0; i < num_recs; i++) pos_array[i] = i+1;