Changed result sets to be persistent in the sense that they can
authorAdam Dickmeiss <adam@indexdata.dk>
Tue, 22 Sep 1998 10:03:38 +0000 (10:03 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Tue, 22 Sep 1998 10:03:38 +0000 (10:03 +0000)
be re-searched if needed.
Fixed memory leak in rsm_or.

CHANGELOG
doc/zebra.sgml
index/extract.c
index/zebraapi.c
index/zrpn.c
index/zserver.h
index/zsets.c
rset/rsm_or.c
tab/default.idx

index 8805c64..3e12954 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Fixed bug in Sort that caused it NOT to use character mapping as
+it should.
+
 Zebra now uses GNU configure to generate Makefile(s).
 
 Added un-optimised support for left and left/right truncation attributes.
index 4a78a1d..6ca296d 100644 (file)
@@ -1,14 +1,14 @@
 <!doctype linuxdoc system>
 
 <!--
-  $Id: zebra.sgml,v 1.41 1998-06-11 15:42:21 adam Exp $
+  $Id: zebra.sgml,v 1.42 1998-09-22 10:03:39 adam Exp $
 -->
 
 <article>
 <title>Zebra Server - Administrators's Guide and Reference
 <author><htmlurl url="http://www.indexdata.dk/" name="Index Data">,
 <tt><htmlurl url="mailto:info@indexdata.dk" name="info@indexdata.dk"></>
-<date>$Revision: 1.41 $
+<date>$Revision: 1.42 $
 <abstract>
 The Zebra information server combines a versatile fielded/free-text
 search engine with a Z39.50-1995 frontend to provide a powerful and flexible
@@ -192,15 +192,34 @@ An ANSI C compiler is required to compile the Zebra
 server system &mdash; <tt/gcc/ works fine if your own system doesn't
 provide an adequate compiler.
 
-Unpack the distribution archive. In some cases, you may want to edit
-the top-level <tt/Makefile/, eg. to select a different C compiler, or
-to specify machine-specific libraries in the <bf/ELIBS/ variable.
+Unpack the distribution archive. The <tt>configure</tt> shell script
+attempts to guess correct values for various system-dependent variables
+used during compilation. It uses those values to create a 'Makefile' in
+each directory of Zebra.
 
-When you are done editing the <tt>Makefile</tt> type:
+To run the configure script type:
 <tscreen><verb>
-$ make
+  ./configure
 </verb></tscreen>
 
+The configure script attempts to use C compiler specified by
+the <tt>CC</tt> environment variable. If not set, <tt>cc</tt>
+will be used. The <tt>CFLAGS</tt> environment variable holds
+options to be passed to the C compiler. If you're using a Bourne-shell
+compatible shell you may pass something like this:
+<tscreen><verb>
+  CC=/opt/ccs/bin/cc CFLAGS=-O ./configure
+</verb></tscreen>
+
+When configured build the software by typing:
+<tscreen><verb>
+  make
+</verb></tscreen> 
+
+As an option you may type <tt>make depend</tt> to create
+source file dependencies for the package. This is only needed,
+however, if you alter the source.
+
 If successful, two executables have been created in the sub-directory
 <tt/index/.
 <descrip>
index f0f3d12..dfde4a2 100644 (file)
@@ -1,10 +1,15 @@
 /*
- * Copyright (C) 1994-1998, Index Data I/S 
+ * Copyright (C) 1994-1998, Index Data 
  * All rights reserved.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: extract.c,v $
- * Revision 1.84  1998-06-11 15:42:22  adam
+ * Revision 1.85  1998-09-22 10:03:41  adam
+ * Changed result sets to be persistent in the sense that they can
+ * be re-searched if needed.
+ * Fixed memory leak in rsm_or.
+ *
+ * Revision 1.84  1998/06/11 15:42:22  adam
  * Changed the way use attributes are specified in the recordId
  * specification.
  *
@@ -682,9 +687,10 @@ static void addSortString (RecWord *p, const char *string, int length)
     sk->next = sortKeys;
     sortKeys = sk;
 
-    sk->string = xmalloc (p->length);
-    sk->length = p->length;
-    memcpy (sk->string, p->string, p->length);
+    sk->string = xmalloc (length);
+    sk->length = length;
+    memcpy (sk->string, string, length);
+
     sk->attrSet = p->attrSet;
     sk->attrUse = p->attrUse;
 }
index 54e01a5..6f56a05 100644 (file)
@@ -4,7 +4,12 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: zebraapi.c,v $
- * Revision 1.9  1998-09-02 13:53:17  adam
+ * Revision 1.10  1998-09-22 10:03:42  adam
+ * Changed result sets to be persistent in the sense that they can
+ * be re-searched if needed.
+ * Fixed memory leak in rsm_or.
+ *
+ * Revision 1.9  1998/09/02 13:53:17  adam
  * Extra parameter decode added to search routines to implement
  * persistent queries.
  *
@@ -230,7 +235,9 @@ void zebra_search_rpn (ZebraHandle zh, ODR stream, ODR decode,
     zh->errCode = 0;
     zh->errString = NULL;
     zh->hits = 0;
-    rpn_search (zh, stream, decode, query, num_bases, basenames, setname);
+
+    resultSetAddRPN (zh, stream, decode, query, num_bases, basenames, setname);
+
     zebra_register_unlock (zh);
 }
 
@@ -305,7 +312,7 @@ void zebra_sort (ZebraHandle zh, ODR stream,
     zh->errCode = 0;
     zh->errString = NULL;
     zebra_register_lock (zh);
-    resultSetSort (zh, stream, num_input_setnames, input_setnames,
+    resultSetSort (zh, stream->mem, num_input_setnames, input_setnames,
                   output_setname, sort_sequence, sort_status);
     zebra_register_unlock (zh);
 }
index a97e265..280b167 100644 (file)
@@ -4,7 +4,12 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: zrpn.c,v $
- * Revision 1.84  1998-09-18 12:41:00  adam
+ * Revision 1.85  1998-09-22 10:03:43  adam
+ * Changed result sets to be persistent in the sense that they can
+ * be re-searched if needed.
+ * Fixed memory leak in rsm_or.
+ *
+ * Revision 1.84  1998/09/18 12:41:00  adam
  * Fixed bug with numerical relations.
  *
  * Revision 1.83  1998/09/02 13:53:19  adam
@@ -1755,7 +1760,7 @@ static RSET rpn_search_APT_local (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
 }
 
 static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
-                          oid_value attributeSet, ODR stream,
+                          oid_value attributeSet, NMEM stream,
                           Z_SortKeySpecList *sort_sequence,
                           const char *rank_type)
 {
@@ -1780,8 +1785,8 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
     if (!sort_sequence->specs)
     {
        sort_sequence->num_specs = 10;
-       sort_sequence->specs = odr_malloc (stream, sort_sequence->num_specs *
-                                          sizeof(*sort_sequence->specs));
+       sort_sequence->specs = nmem_malloc (stream, sort_sequence->num_specs *
+                                           sizeof(*sort_sequence->specs));
        for (i = 0; i<sort_sequence->num_specs; i++)
            sort_sequence->specs[i] = 0;
     }
@@ -1798,29 +1803,29 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
     if (!oid_ent_to_oid (&oe, oid))
        return 0;
 
-    sks = odr_malloc (stream, sizeof(*sks));
-    sks->sortElement = odr_malloc (stream, sizeof(*sks->sortElement));
+    sks = nmem_malloc (stream, sizeof(*sks));
+    sks->sortElement = nmem_malloc (stream, sizeof(*sks->sortElement));
     sks->sortElement->which = Z_SortElement_generic;
-    sk = sks->sortElement->u.generic = odr_malloc (stream, sizeof(*sk));
+    sk = sks->sortElement->u.generic = nmem_malloc (stream, sizeof(*sk));
     sk->which = Z_SortKey_sortAttributes;
-    sk->u.sortAttributes = odr_malloc (stream, sizeof(*sk->u.sortAttributes));
+    sk->u.sortAttributes = nmem_malloc (stream, sizeof(*sk->u.sortAttributes));
 
     sk->u.sortAttributes->id = oid;
     sk->u.sortAttributes->list =
-       odr_malloc (stream, sizeof(*sk->u.sortAttributes->list));
+       nmem_malloc (stream, sizeof(*sk->u.sortAttributes->list));
     sk->u.sortAttributes->list->num_attributes = 1;
     sk->u.sortAttributes->list->attributes =
-       odr_malloc (stream, sizeof(*sk->u.sortAttributes->list->attributes));
+       nmem_malloc (stream, sizeof(*sk->u.sortAttributes->list->attributes));
     ae = *sk->u.sortAttributes->list->attributes =
-       odr_malloc (stream, sizeof(**sk->u.sortAttributes->list->attributes));
+       nmem_malloc (stream, sizeof(**sk->u.sortAttributes->list->attributes));
     ae->attributeSet = 0;
-    ae->attributeType =        odr_malloc (stream, sizeof(*ae->attributeType));
+    ae->attributeType =        nmem_malloc (stream, sizeof(*ae->attributeType));
     *ae->attributeType = 1;
     ae->which = Z_AttributeValue_numeric;
-    ae->value.numeric = odr_malloc (stream, sizeof(*ae->value.numeric));
+    ae->value.numeric = nmem_malloc (stream, sizeof(*ae->value.numeric));
     *ae->value.numeric = use_value;
 
-    sks->sortRelation = odr_malloc (stream, sizeof(*sks->sortRelation));
+    sks->sortRelation = nmem_malloc (stream, sizeof(*sks->sortRelation));
     if (sort_relation_value == 1)
        *sks->sortRelation = Z_SortRelation_ascending;
     else if (sort_relation_value == 2)
@@ -1828,7 +1833,7 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
     else 
        *sks->sortRelation = Z_SortRelation_ascending;
 
-    sks->caseSensitivity = odr_malloc (stream, sizeof(*sks->caseSensitivity));
+    sks->caseSensitivity = nmem_malloc (stream, sizeof(*sks->caseSensitivity));
     *sks->caseSensitivity = 0;
 
     sks->missingValueAction = 0;
@@ -1841,7 +1846,7 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
 
 
 static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
-                            oid_value attributeSet, ODR stream,
+                            oid_value attributeSet, NMEM stream,
                            Z_SortKeySpecList *sort_sequence,
                             int num_bases, char **basenames)
 {
@@ -1905,7 +1910,7 @@ static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
 }
 
 static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs,
-                                  oid_value attributeSet, ODR stream,
+                                  oid_value attributeSet, NMEM stream,
                                  Z_SortKeySpecList *sort_sequence,
                                   int num_bases, char **basenames)
 {
@@ -1962,7 +1967,7 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs,
 #ifdef ASN_COMPILED
             if (*zop->u.prox->u.known != Z_ProxUnit_word)
             {
-                char *val = odr_malloc (stream, 16);
+                char *val = nmem_malloc (stream, 16);
                 zh->errCode = 132;
                 zh->errString = val;
                 sprintf (val, "%d", *zop->u.prox->u.known);
@@ -1971,7 +1976,7 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs,
 #else
             if (*zop->u.prox->proximityUnitCode != Z_ProxUnit_word)
             {
-                char *val = odr_malloc (stream, 16);
+                char *val = nmem_malloc (stream, 16);
                 zh->errCode = 132;
                 zh->errString = val;
                 sprintf (val, "%d", *zop->u.prox->proximityUnitCode);
@@ -2020,9 +2025,11 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs,
     return r;
 }
 
-void rpn_search (ZebraHandle zh, ODR stream, ODR decode,
+
+RSET rpn_search (ZebraHandle zh, NMEM nmem,
                 Z_RPNQuery *rpn, int num_bases, char **basenames, 
-                const char *setname)
+                const char *setname,
+                ZebraSet sset)
 {
     RSET rset;
     oident *attrset;
@@ -2036,31 +2043,39 @@ void rpn_search (ZebraHandle zh, ODR stream, ODR decode,
     zh->errString = NULL;
     zh->hits = 0;
 
-    sort_sequence = odr_malloc (stream, sizeof(*sort_sequence));
+    sort_sequence = nmem_malloc (nmem, sizeof(*sort_sequence));
     sort_sequence->num_specs = 10;
-    sort_sequence->specs = odr_malloc (stream, sort_sequence->num_specs *
+    sort_sequence->specs = nmem_malloc (nmem, sort_sequence->num_specs *
                                       sizeof(*sort_sequence->specs));
     for (i = 0; i<sort_sequence->num_specs; i++)
        sort_sequence->specs[i] = 0;
     
     attrset = oid_getentbyoid (rpn->attributeSetId);
     attributeSet = attrset->value;
-    rset = rpn_search_structure (zh, rpn->RPNStructure, attributeSet, stream,
-                                sort_sequence,
-                                 num_bases, basenames);
+    rset = rpn_search_structure (zh, rpn->RPNStructure, attributeSet,
+                                nmem, sort_sequence, num_bases, basenames);
     if (!rset)
-       return;
+       return 0;
 
-    resultSetAdd (zh, setname, 1, rset, &zh->hits);
     if (zh->errCode)
         logf (LOG_DEBUG, "search error: %d", zh->errCode);
-
+    
     for (i = 0; sort_sequence->specs[i]; i++)
        ;
     sort_sequence->num_specs = i;
-    if (i)
-       resultSetSort (zh, stream, 1, &setname, setname, sort_sequence,
-                      &sort_status);
+    if (!i)
+       resultSetRank (zh, sset, rset);
+    else
+    {
+       logf (LOG_DEBUG, "resultSetSortSingle in rpn_search");
+       resultSetSortSingle (zh, nmem, sset, rset,
+                            sort_sequence, &sort_status);
+       if (zh->errCode)
+       {
+           logf (LOG_DEBUG, "resultSetSortSingle status = %d", zh->errCode);
+       }
+    }
+    return rset;
 }
 
 struct scan_info_entry {
@@ -2095,14 +2110,14 @@ static int scan_handle (char *name, const char *info, int pos, void *client)
     return 0;
 }
 
-static void scan_term_untrans (ZebraHandle zh, ODR stream, int reg_type,
+static void scan_term_untrans (ZebraHandle zh, NMEM stream, int reg_type,
                               char **dst, const char *src)
 {
     char term_dst[1024];
     
     term_untrans (zh, reg_type, term_dst, src);
     
-    *dst = odr_malloc (stream, strlen(term_dst)+1);
+    *dst = nmem_malloc (stream, strlen(term_dst)+1);
     strcpy (*dst, term_dst);
 }
 
@@ -2270,7 +2285,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
         }
         if (j0 == -1)
             break;
-        scan_term_untrans (zh, stream, reg_id,
+        scan_term_untrans (zh, stream->mem, reg_id,
                           &glist[i+before].term, mterm);
         rset = rset_trunc (zh, &scan_info_array[j0].list[ptr[j0]].isam_p, 1,
                           glist[i+before].term, strlen(glist[i+before].term),
@@ -2334,7 +2349,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
         if (j0 == -1)
             break;
 
-        scan_term_untrans (zh, stream, reg_id,
+        scan_term_untrans (zh, stream->mem, reg_id,
                           &glist[before-1-i].term, mterm);
 
         rset = rset_trunc
index eab2450..7bebbad 100644 (file)
@@ -4,7 +4,12 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: zserver.h,v $
- * Revision 1.37  1998-09-02 13:53:22  adam
+ * Revision 1.38  1998-09-22 10:03:44  adam
+ * Changed result sets to be persistent in the sense that they can
+ * be re-searched if needed.
+ * Fixed memory leak in rsm_or.
+ *
+ * Revision 1.37  1998/09/02 13:53:22  adam
  * Extra parameter decode added to search routines to implement
  * persistent queries.
  *
@@ -208,9 +213,9 @@ struct rank_control {
     void (*add)(void *set_handle, int seqno, int term_index);
 };
 
-void rpn_search (ZebraHandle zh, ODR stream, ODR decode,
+RSET rpn_search (ZebraHandle zh, NMEM mem,
                 Z_RPNQuery *rpn, int num_bases, char **basenames, 
-                const char *setname);
+                const char *setname, ZebraSet sset);
 
 
 void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
@@ -222,9 +227,10 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt,
 RSET rset_trunc (ZebraHandle zh, ISAM_P *isam_p, int no,
                 const char *term, int length_term, const char *flags);
 
-ZebraSet resultSetAdd (ZebraHandle zh, const char *name,
-                          int ov, RSET rset, int *hits);
+ZebraSet resultSetAdd (ZebraHandle zh, const char *name, int ov);
 ZebraSet resultSetGet (ZebraHandle zh, const char *name);
+ZebraSet resultSetAddRPN (ZebraHandle zh, ODR stream, ODR decode,                                         Z_RPNQuery *rpn, int num_bases, char **basenames,
+                          const char *setname);
 RSET resultSetRef (ZebraHandle zh, Z_ResultSetId *resultSetId);
 void resultSetDestroy (ZebraHandle zh);
 
@@ -232,10 +238,14 @@ ZebraPosSet zebraPosSetCreate (ZebraHandle zh, const char *name,
                               int num, int *positions);
 void zebraPosSetDestroy (ZebraHandle zh, ZebraPosSet records, int num);
 
-void resultSetSort (ZebraHandle zh, ODR stream,
+void resultSetSort (ZebraHandle zh, NMEM nmem,
                    int num_input_setnames, const char **input_setnames,
                    const char *output_setname,
                    Z_SortKeySpecList *sort_sequence, int *sort_status);
+void resultSetSortSingle (ZebraHandle zh, NMEM nmem,
+                         ZebraSet sset, RSET rset,
+                         Z_SortKeySpecList *sort_sequence, int *sort_status);
+void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset);
 
 void zebra_sort (ZebraHandle zh, ODR stream,
                 int num_input_setnames, const char **input_setnames,
index 4b4c25f..09d6d4e 100644 (file)
@@ -1,10 +1,15 @@
 /*
- * Copyright (C) 1994-1998, Index Data I/S 
+ * Copyright (C) 1994-1998, Index Data
  * All rights reserved.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: zsets.c,v $
- * Revision 1.17  1998-06-23 15:33:36  adam
+ * Revision 1.18  1998-09-22 10:03:45  adam
+ * Changed result sets to be persistent in the sense that they can
+ * be re-searched if needed.
+ * Fixed memory leak in rsm_or.
+ *
+ * Revision 1.17  1998/06/23 15:33:36  adam
  * Added feature to specify sort criteria in query (type 7 specifies
  * sort flags).
  *
 struct zebra_set {
     char *name;
     RSET rset;
-    int size;
+    NMEM nmem;
+    int hits;
+    int num_bases;
+    char **basenames;
+    Z_RPNQuery *rpn;
     struct zset_sort_info *sort_info;
     struct zebra_set *next;
 };
@@ -100,43 +109,76 @@ struct zset_sort_info {
     struct zset_sort_entry **entries;
 };
 
-void resultSetRank (ZebraHandle zh, struct zset_sort_info *si,
-                   RSET rset, int *hits);
+ZebraSet resultSetAddRPN (ZebraHandle zh, ODR stream, ODR decode,
+                         Z_RPNQuery *rpn, int num_bases, char **basenames, 
+                         const char *setname)
+{
+    ZebraSet zebraSet;
+
+    zlog_rpn (rpn);
+
+    zh->errCode = 0;
+    zh->errString = NULL;
+    zh->hits = 0;
+
+    zebraSet = resultSetAdd (zh, setname, 1);
+    if (!zebraSet)
+       return 0;
+    zebraSet->rpn = 0;
+    zebraSet->num_bases = num_bases;
+    zebraSet->basenames = basenames;
+    zebraSet->nmem = odr_extract_mem (decode);
+
+    zebraSet->rset = rpn_search (zh, stream->mem, rpn,
+                                 zebraSet->num_bases,
+                                zebraSet->basenames, zebraSet->name,
+                                zebraSet);
+    zh->hits = zebraSet->hits;
+    if (zebraSet->rset)
+        zebraSet->rpn = rpn;
+    return zebraSet;
+}
 
-ZebraSet resultSetAdd (ZebraHandle zh, const char *name, int ov,
-                         RSET rset, int *hits)
+ZebraSet resultSetAdd (ZebraHandle zh, const char *name, int ov)
 {
     ZebraSet s;
     int i;
 
     for (s = zh->sets; s; s = s->next)
         if (!strcmp (s->name, name))
-        {
-           logf (LOG_DEBUG, "updating result set %s", name);
-            if (!ov)
-                return NULL;
-            rset_delete (s->rset);
-            s->rset = rset;
-           resultSetRank (zh, s->sort_info, rset, hits);
-            return s;
-        }
-    logf (LOG_DEBUG, "adding result set %s", name);
-    s = xmalloc (sizeof(*s));
-    s->next = zh->sets;
-    zh->sets = s;
-    s->name = xmalloc (strlen(name)+1);
-    strcpy (s->name, name);
-    s->rset = rset;
-    
-    s->sort_info = xmalloc (sizeof(*s->sort_info));
-    s->sort_info->max_entries = 1000;
-    s->sort_info->entries = xmalloc (sizeof(*s->sort_info->entries) *
-                                    s->sort_info->max_entries);
-    s->sort_info->all_entries = xmalloc (sizeof(*s->sort_info->all_entries) *
-                                        s->sort_info->max_entries);
-    for (i = 0; i < s->sort_info->max_entries; i++)
-       s->sort_info->entries[i] = s->sort_info->all_entries + i;
-    resultSetRank (zh, s->sort_info, rset, hits);
+           break;
+    if (s)
+    {
+       logf (LOG_DEBUG, "updating result set %s", name);
+       if (!ov)
+           return NULL;
+       if (s->rset)
+           rset_delete (s->rset);
+       if (s->nmem)
+           nmem_destroy (s->nmem);
+    }
+    else
+    {
+       logf (LOG_DEBUG, "adding result set %s", name);
+       s = xmalloc (sizeof(*s));
+       s->next = zh->sets;
+       zh->sets = s;
+       s->name = xmalloc (strlen(name)+1);
+       strcpy (s->name, name);
+
+       s->sort_info = xmalloc (sizeof(*s->sort_info));
+       s->sort_info->max_entries = 1000;
+       s->sort_info->entries =
+           xmalloc (sizeof(*s->sort_info->entries) *
+                    s->sort_info->max_entries);
+       s->sort_info->all_entries =
+           xmalloc (sizeof(*s->sort_info->all_entries) *
+                    s->sort_info->max_entries);
+       for (i = 0; i < s->sort_info->max_entries; i++)
+           s->sort_info->entries[i] = s->sort_info->all_entries + i;
+    }
+    s->rset = 0;
+    s->nmem = 0;       
     return s;
 }
 
@@ -146,7 +188,18 @@ ZebraSet resultSetGet (ZebraHandle zh, const char *name)
 
     for (s = zh->sets; s; s = s->next)
         if (!strcmp (s->name, name))
+        {
+            if (!s->rset && s->rpn)
+            {
+                NMEM nmem = nmem_create ();
+                s->rset =
+                    rpn_search (zh, nmem, s->rpn, s->num_bases,
+                               s->basenames, s->name, s);
+                nmem_destroy (nmem);
+
+            }
             return s;
+        }
     return NULL;
 }
 
@@ -163,6 +216,8 @@ void resultSetDestroy (ZebraHandle zh)
        xfree (s->sort_info->entries);
        xfree (s->sort_info);
 
+        if (s->nmem)
+            nmem_destroy (s->nmem);
         rset_delete (s->rset);
         xfree (s->name);
         xfree (s);
@@ -366,19 +421,13 @@ void resultSetInsertRank (ZebraHandle zh, struct zset_sort_info *sort_info,
     new_entry->score = score;
 }
 
-void resultSetSort (ZebraHandle zh, ODR stream,
+void resultSetSort (ZebraHandle zh, NMEM nmem,
                    int num_input_setnames, const char **input_setnames,
                    const char *output_setname,
                    Z_SortKeySpecList *sort_sequence, int *sort_status)
 {
     ZebraSet sset;
     RSET rset;
-    int i, psysno = 0;
-    struct it_key key;
-    struct sortKey sort_criteria[3];
-    int num_criteria;
-    int term_index;
-    RSFD rfd;
 
     if (num_input_setnames == 0)
     {
@@ -396,15 +445,39 @@ void resultSetSort (ZebraHandle zh, ODR stream,
     if (!sset)
     {
        zh->errCode = 30;
-       zh->errString = nmem_strdup (stream->mem, input_setnames[0]);
+       zh->errString = nmem_strdup (nmem, input_setnames[0]);
        return;
     }
     if (!(rset = sset->rset))
     {
        zh->errCode = 30;
-       zh->errString = nmem_strdup (stream->mem, input_setnames[0]);
+       zh->errString = nmem_strdup (nmem, input_setnames[0]);
         return;
     }
+    if (strcmp (output_setname, input_setnames[0]))
+    {
+       rset = rset_dup (rset);
+       sset = resultSetAdd (zh, output_setname, 1);
+        sset->rset = rset;
+    }
+    resultSetSortSingle (zh, nmem, sset, rset, sort_sequence, sort_status);
+}
+
+void resultSetSortSingle (ZebraHandle zh, NMEM nmem,
+                         ZebraSet sset, RSET rset,
+                         Z_SortKeySpecList *sort_sequence, int *sort_status)
+{
+    int i, psysno = 0;
+    struct it_key key;
+    struct sortKey sort_criteria[3];
+    int num_criteria;
+    int term_index;
+    RSFD rfd;
+
+    logf (LOG_DEBUG, "resultSetSortSingle start");
+    sset->sort_info->num_entries = 0;
+
+    sset->hits = 0;
     num_criteria = sort_sequence->num_specs;
     if (num_criteria > 3)
        num_criteria = 3;
@@ -461,19 +534,12 @@ void resultSetSort (ZebraHandle zh, ODR stream,
            break;
        }
     }
-    if (strcmp (output_setname, input_setnames[0]))
-    {
-       int hits;
-       rset = rset_dup (rset);
-       sset = resultSetAdd (zh, output_setname, 1, rset, &hits);
-    }
-    sset->sort_info->num_entries = 0;
-
     rfd = rset_open (rset, RSETF_READ);
     while (rset_read (rset, rfd, &key, &term_index))
     {
         if (key.sysno != psysno)
         {
+           (sset->hits)++;
             psysno = key.sysno;
            resultSetInsertSort (zh, sset,
                                 sort_criteria, num_criteria, psysno);
@@ -483,8 +549,7 @@ void resultSetSort (ZebraHandle zh, ODR stream,
 
     zh->errCode = 0;
     *sort_status = Z_SortStatus_success;
-    
-    return;
+    logf (LOG_DEBUG, "resultSetSortSingle end");
 }
 
 RSET resultSetRef (ZebraHandle zh, Z_ResultSetId *resultSetId)
@@ -496,8 +561,7 @@ RSET resultSetRef (ZebraHandle zh, Z_ResultSetId *resultSetId)
     return NULL;
 }
 
-void resultSetRank (ZebraHandle zh, struct zset_sort_info *sort_info,
-                   RSET rset, int *hits)
+void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset)
 {
     int kno = 0;
     struct it_key key;
@@ -505,9 +569,11 @@ void resultSetRank (ZebraHandle zh, struct zset_sort_info *sort_info,
     int term_index, i;
     ZebraRankClass rank_class;
     struct rank_control *rc;
+    struct zset_sort_info *sort_info;
 
+    sort_info = zebraSet->sort_info;
     sort_info->num_entries = 0;
-    *hits = 0;
+    zebraSet->hits = 0;
     rfd = rset_open (rset, RSETF_READ);
 
     logf (LOG_DEBUG, "resultSetRank");
@@ -526,7 +592,7 @@ void resultSetRank (ZebraHandle zh, struct zset_sort_info *sort_info,
        int score;
        void *handle =
            (*rc->begin) (zh, rank_class->class_handle, rset);
-       (*hits)++;
+       (zebraSet->hits)++;
        do
        {
            kno++;
@@ -535,7 +601,7 @@ void resultSetRank (ZebraHandle zh, struct zset_sort_info *sort_info,
                score = (*rc->calc) (handle, psysno);
 
                resultSetInsertRank (zh, sort_info, psysno, score, 'A');
-               (*hits)++;
+               (zebraSet->hits)++;
                psysno = key.sysno;
            }
            (*rc->add) (handle, key.seqno, term_index);
@@ -546,7 +612,7 @@ void resultSetRank (ZebraHandle zh, struct zset_sort_info *sort_info,
        (*rc->end) (zh, handle);
     }
     rset_close (rset, rfd);
-    logf (LOG_DEBUG, "%d keys, %d distinct sysnos", kno, *hits);
+    logf (LOG_DEBUG, "%d keys, %d distinct sysnos", kno, zebraSet->hits);
 }
 
 ZebraRankClass zebraRankLookup (ZebraHandle zh, const char *name)
index 72f09fa..2683029 100644 (file)
@@ -1,10 +1,15 @@
 /*
- * Copyright (C) 1994-1998, Index Data I/S 
+ * Copyright (C) 1994-1998, Index Data
  * All rights reserved.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: rsm_or.c,v $
- * Revision 1.6  1998-03-05 08:36:28  adam
+ * Revision 1.7  1998-09-22 10:03:46  adam
+ * Changed result sets to be persistent in the sense that they can
+ * be re-searched if needed.
+ * Fixed memory leak in rsm_or.
+ *
+ * Revision 1.6  1998/03/05 08:36:28  adam
  * New result set model.
  *
  * Revision 1.5  1997/12/18 10:54:25  adam
@@ -200,7 +205,7 @@ static void *r_create (RSET ct, const struct rset_control *sel, void *parms)
 
     ct->no_rset_terms = 1;
     ct->rset_terms = xmalloc (sizeof(*ct->rset_terms));
-    ct->rset_terms[0] = rset_term_dup (r_parms->rset_term);
+    ct->rset_terms[0] = r_parms->rset_term;
     return info;
 }
 
index bb142cf..49bff34 100644 (file)
@@ -1,5 +1,5 @@
 # Zebra indexes as referred to from the *.abs-files.
-#  $Id: default.idx,v 1.4 1998-02-10 12:03:06 adam Exp $
+#  $Id: default.idx,v 1.5 1998-09-22 10:03:47 adam Exp $
 #
 # Traditional word index
 index w
@@ -29,4 +29,4 @@ charmap @
 # Sort register (no mapping at all)
 sort s
 completeness 1
-charmap @
+charmap string.chr