sort uses custom record ID if given / test_safari
[idzebra-moved-to-github.git] / index / extract.c
index eaea175..32b92ec 100644 (file)
@@ -1,8 +1,5 @@
-/* $Id: extract.c,v 1.278 2008-01-26 15:32:51 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
@@ -1870,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);
     }
 }