X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;ds=sidebyside;f=index%2Fextract.c;h=32b92eced8576225a525edeadd93ba958c98a1ba;hb=2cf8341fde67a92369c46d9b12e6d056e5bc5a0e;hp=9ba1f0b3917c56f705166095bad9c9647bfe483b;hpb=cec0b36de7a46e326939482e51c65090d77d4faf;p=idzebra-moved-to-github.git diff --git a/index/extract.c b/index/extract.c index 9ba1f0b..32b92ec 100644 --- a/index/extract.c +++ b/index/extract.c @@ -1,8 +1,5 @@ -/* $Id: extract.c,v 1.277 2008-01-24 16:15:35 adam Exp $ - Copyright (C) 1995-2007 - Index Data ApS - -This file is part of the Zebra server. +/* This file is part of the Zebra server. + Copyright (C) 1995-2008 Index Data Zebra is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -1615,7 +1612,15 @@ static void extract_add_string(RecWord *p, zebra_map_t zm, if (!p->index_name) return; + if (log_level_details) + { + WRBUF w = wrbuf_alloc(); + + wrbuf_write_escaped(w, string, length); + yaz_log(log_level_details, "extract_add_string: %s", wrbuf_cstr(w)); + wrbuf_destroy(w); + } if (zebra_maps_is_index(zm)) { extract_add_index_string(p, zinfo_index_category_index, @@ -1862,18 +1867,57 @@ 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; + }; + 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]; + + struct sort_add_ent **e = &sort_ent_list; + while (*e && (*e)->ord != ord) + e = &(*e)->next; + 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; + } - 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->wrbuf); + else + zebra_sort_delete(si); + wrbuf_destroy(e->wrbuf); + } } + nmem_destroy(nmem); } }