X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fextract.c;h=848f3672208e3b34527c7d1a2976fe223cc79aa2;hb=7598c76f1a4989a91003bd4fbd90f30a7c7255ef;hp=89f072a41d556b2d31331acae269ee4869c0bf40;hpb=97a7adeb9e5059463f039495cc01cfa448463a27;p=idzebra-moved-to-github.git diff --git a/index/extract.c b/index/extract.c index 89f072a..848f367 100644 --- a/index/extract.c +++ b/index/extract.c @@ -1584,9 +1584,10 @@ static void extract_add_sort_string(RecWord *p, const char *str, int length) ch = zebraExplain_lookup_attr_str(zei, cat, p->index_type, p->index_name); if (ch < 0) ch = zebraExplain_add_attr_str(zei, cat, p->index_type, p->index_name); - key.len = 2; + key.len = 3; key.mem[0] = ch; key.mem[1] = p->record_id; + key.mem[2] = p->section_id; zebra_rec_keys_write(zh->reg->sortKeys, str, length, &key); } @@ -1867,18 +1868,61 @@ void extract_flush_sort_keys(ZebraHandle zh, zint sysno, const char *str; struct it_key key_in; - zebra_sort_sysno(si, sysno); + NMEM nmem = nmem_create(); + struct sort_add_ent { + int ord; + int cmd; + struct sort_add_ent *next; + WRBUF wrbuf; + zint sysno; + zint section_id; + }; + struct sort_add_ent *sort_ent_list = 0; while (zebra_rec_keys_read(reckeys, &str, &slen, &key_in)) { int ord = CAST_ZINT_TO_INT(key_in.mem[0]); + zint filter_sysno = key_in.mem[1]; + zint section_id = key_in.mem[2]; + + struct sort_add_ent **e = &sort_ent_list; + for (; *e; e = &(*e)->next) + if ((*e)->ord == ord && section_id == (*e)->section_id) + break; + if (!*e) + { + *e = nmem_malloc(nmem, sizeof(**e)); + (*e)->next = 0; + (*e)->wrbuf = wrbuf_alloc(); + (*e)->ord = ord; + (*e)->cmd = cmd; + (*e)->sysno = filter_sysno ? filter_sysno : sysno; + (*e)->section_id = section_id; + } - zebra_sort_type(si, ord); - if (cmd == 1) - zebra_sort_add(si, str, slen); - else - zebra_sort_delete(si); + wrbuf_write((*e)->wrbuf, str, slen); + wrbuf_putc((*e)->wrbuf, '\0'); } + if (sort_ent_list) + { + zint last_sysno = 0; + struct sort_add_ent *e = sort_ent_list; + for (; e; e = e->next) + { + if (last_sysno != e->sysno) + { + zebra_sort_sysno(si, e->sysno); + last_sysno = e->sysno; + } + zebra_sort_type(si, e->ord); + if (e->cmd == 1) + zebra_sort_add(si, e->section_id, e->wrbuf); + else + zebra_sort_delete(si, e->section_id); + wrbuf_destroy(e->wrbuf); + } + } + nmem_destroy(nmem); } }