X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fextract.c;h=cc54d67cc48106029ef404f63c5581f3b04ad7f5;hb=34b6f9669f88fef08ad911000f2b66fb2c3429b9;hp=6ac93deed617740776c19d06c4d26f298a56c8d8;hpb=a479e3c7f966848a6fc71ac2c2c7f5db7068351b;p=idzebra-moved-to-github.git diff --git a/index/extract.c b/index/extract.c index 6ac93de..cc54d67 100644 --- a/index/extract.c +++ b/index/extract.c @@ -1,4 +1,4 @@ -/* $Id: extract.c,v 1.268 2007-11-06 10:29:59 adam Exp $ +/* $Id: extract.c,v 1.272 2007-12-10 17:06:08 adam Exp $ Copyright (C) 1995-2007 Index Data ApS @@ -520,13 +520,29 @@ struct recordLogInfo { struct recordGroup *rGroup; }; -static void all_matches_add(struct recExtractCtrl *ctrl) +/** \brief add the always-matches index entry and map to real record ID + \param ctrl record control + \param record_id custom record ID + \param sysno system record ID + + This function serves two purposes.. It adds the always matches + entry and makes a pointer from the custom record ID (if defined) + back to the system record ID (sysno) + See zebra_recid_to_sysno . + */ +static void all_matches_add(struct recExtractCtrl *ctrl, zint record_id, + zint sysno) { RecWord word; extract_init(ctrl, &word); + word.record_id = record_id; + /* we use the seqno as placeholder for a way to get back to + record database from _ALLRECORDS.. This is used if a custom + RECORD was defined */ + word.seqno = sysno; word.index_name = "_ALLRECORDS"; word.index_type = "w"; - word.seqno = 1; + extract_add_index_string(&word, zinfo_index_category_alwaysmatches, "", 0); } @@ -874,8 +890,6 @@ ZEBRA_RES zebra_extract_record_stream(ZebraHandle zh, else end_offset = stream->tellf(stream); - all_matches_add(&extractCtrl); - if (extractCtrl.match_criteria[0]) match_criteria = extractCtrl.match_criteria; } @@ -919,6 +933,7 @@ ZEBRA_RES zebra_extract_record_stream(ZebraHandle zh, } } } + if (zebra_rec_keys_empty(zh->reg->keys)) { /* the extraction process returned no information - the record @@ -951,6 +966,15 @@ ZEBRA_RES zebra_extract_record_stream(ZebraHandle zh, *sysno = rec->sysno; + + if (stream) + { + all_matches_add(&extractCtrl, + zebra_rec_keys_get_custom_record_id(zh->reg->keys), + *sysno); + } + + recordAttr = rec_init_attr(zh->reg->zei, rec); if (extractCtrl.staticrank < 0) { @@ -992,6 +1016,13 @@ ZEBRA_RES zebra_extract_record_stream(ZebraHandle zh, rec = rec_get(zh->reg->records, *sysno); assert(rec); + + if (stream) + { + all_matches_add(&extractCtrl, + zebra_rec_keys_get_custom_record_id(zh->reg->keys), + *sysno); + } recordAttr = rec_init_attr(zh->reg->zei, rec); @@ -1698,13 +1729,15 @@ static void extract_add_icu(RecWord *p, zebra_map_t zm) const char *res_buf = 0; size_t res_len = 0; ZebraHandle zh = p->extractCtrl->handle; - int r = zebra_map_tokenize(zm, p->term_buf, p->term_len, - &res_buf, &res_len); + int cat = zinfo_index_category_index; - int ch = zebraExplain_lookup_attr_str(zh->reg->zei, cat, p->index_type, p->index_name); + int ch = zebraExplain_lookup_attr_str(zh->reg->zei, cat, + p->index_type, p->index_name); if (ch < 0) - ch = zebraExplain_add_attr_str(zh->reg->zei, cat, p->index_type, p->index_name); - while (r) + ch = zebraExplain_add_attr_str(zh->reg->zei, cat, + p->index_type, p->index_name); + zebra_map_tokenize_start(zm, p->term_buf, p->term_len); + while (zebra_map_tokenize_next(zm, &res_buf, &res_len, 0, 0)) { int i = 0; key.mem[i++] = ch; @@ -1716,11 +1749,9 @@ static void extract_add_icu(RecWord *p, zebra_map_t zm) key.mem[i++] = p->seqno; key.len = i; - yaz_log(YLOG_LOG, "keys_write %.*s", (int) res_len, res_buf); zebra_rec_keys_write(zh->reg->keys, res_buf, res_len, &key); p->seqno++; - r = zebra_map_tokenize(zm, 0, 0, &res_buf, &res_len); } }