X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fretrieve.c;h=c41a9261517af6c99572406dc4d9f19d625923f0;hb=7598c76f1a4989a91003bd4fbd90f30a7c7255ef;hp=39bbca15b437e9faabf41875c6cb2e3b583137bc;hpb=4b25ee9a2fbd9a641095362fc424c1f7b7c0ca2c;p=idzebra-moved-to-github.git diff --git a/index/retrieve.c b/index/retrieve.c index 39bbca1..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; @@ -1182,7 +1229,7 @@ int zebra_record_fetch(ZebraHandle zh, const char *setname, const Odr_oid *input_format, Z_RecordComposition *comp, const Odr_oid **output_format, char **rec_bufp, int *rec_lenp, char **basenamep, - char **addinfo) + WRBUF addinfo_w) { Record rec; char *fname, *file_type, *basename; @@ -1202,7 +1249,6 @@ int zebra_record_fetch(ZebraHandle zh, const char *setname, sysno = sysnos[0]; *basenamep = 0; - *addinfo = 0; elemsetname = yaz_get_esn(comp); fetch_info.zh = zh; @@ -1215,7 +1261,6 @@ int zebra_record_fetch(ZebraHandle zh, const char *setname, if (elemsetname && 0 == strncmp(elemsetname, "zebra::", 7)) { WRBUF result = wrbuf_alloc(); - WRBUF addinfo_w = wrbuf_alloc(); int r = zebra_special_fetch(&fetch_info, elemsetname + 7, input_format, output_format, result, addinfo_w); @@ -1224,13 +1269,7 @@ int zebra_record_fetch(ZebraHandle zh, const char *setname, *rec_bufp = odr_strdup(odr, wrbuf_cstr(result)); *rec_lenp = wrbuf_len(result); } - else - { - if (wrbuf_len(addinfo_w)) - *addinfo = odr_strdup(odr, wrbuf_cstr(addinfo_w)); - } wrbuf_destroy(result); - wrbuf_destroy(addinfo_w); return r; } @@ -1284,12 +1323,8 @@ int zebra_record_fetch(ZebraHandle zh, const char *setname, if (!(rt = recType_byName(zh->reg->recTypes, zh->res, file_type, &clientData))) { - char addinfo_str[100]; - - sprintf(addinfo_str, "Could not handle record type %.40s", - file_type); - - *addinfo = odr_strdup(odr, addinfo_str); + wrbuf_printf(addinfo_w, "Could not handle record type %.40s", + file_type); return_code = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS; } else @@ -1300,7 +1335,8 @@ int zebra_record_fetch(ZebraHandle zh, const char *setname, *output_format = retrieveCtrl.output_format; *rec_bufp = (char *) retrieveCtrl.rec_buf; *rec_lenp = retrieveCtrl.rec_len; - *addinfo = retrieveCtrl.addinfo; + if (retrieveCtrl.addinfo) + wrbuf_puts(addinfo_w, retrieveCtrl.addinfo); } stream.destroy(&stream);