sort uses custom record ID if given / test_safari
[idzebra-moved-to-github.git] / index / extract.c
index dc951f3..32b92ec 100644 (file)
@@ -1,8 +1,5 @@
-/* $Id: extract.c,v 1.276 2007-12-20 11:21:29 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
@@ -187,7 +184,7 @@ static void snippet_add_complete_field(RecWord *p, int ord,
     }
     if (!i)
        return;
-    if (last && start != last)
+    if (last && start != last && zebra_maps_is_index(zm))
         zebra_snippets_appendn(h->snippets, p->seqno, 0, ord,
                                start, last - start);
 }
@@ -222,7 +219,7 @@ static void snippet_add_incomplete_field(RecWord *p, int ord, zebra_map_t zm)
        }
        if (!map)
            break;
-        if (start != last)
+        if (start != last && zebra_maps_is_index(zm))
         {
             zebra_snippets_appendn(h->snippets, p->seqno, 1, ord,
                                    start, last - start);
@@ -256,7 +253,7 @@ static void snippet_add_incomplete_field(RecWord *p, int ord, zebra_map_t zm)
                 p->seqno++;
             }
         }
-        if (start != last)
+        if (start != last && zebra_maps_is_index(zm))
             zebra_snippets_appendn(h->snippets, p->seqno, 0, ord,
                                    start, last - start);
         start = last;
@@ -279,8 +276,9 @@ static void snippet_add_icu(RecWord *p, int ord, zebra_map_t zm)
     while (zebra_map_tokenize_next(zm, &res_buf, &res_len,
                                    &display_buf, &display_len))
     {
-        zebra_snippets_appendn(h->snippets, p->seqno, 0, ord,
-                               display_buf, display_len);
+        if (zebra_maps_is_index(zm))
+            zebra_snippets_appendn(h->snippets, p->seqno, 0, ord,
+                                   display_buf, display_len);
         p->seqno++;
     }
 }
@@ -291,7 +289,7 @@ static void snippet_token_add(RecWord *p)
     ZebraHandle zh = h->zh;
     zebra_map_t zm = zebra_map_get(zh->reg->zebra_maps, p->index_type);
 
-    if (zm && zebra_maps_is_index(zm))
+    if (zm)
     {
         ZebraExplainInfo zei = zh->reg->zei;
         int ch = zebraExplain_lookup_attr_str(
@@ -1614,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,
@@ -1861,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);
     }
 }