C++ compilation.
[idzebra-moved-to-github.git] / index / zsets.c
index 974e2de..6394f3d 100644 (file)
@@ -1,10 +1,39 @@
 /*
- * Copyright (C) 1994-1998, Index Data I/S 
+ * Copyright (C) 1994-1999, Index Data
  * All rights reserved.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: zsets.c,v $
- * Revision 1.15  1998-03-05 08:45:14  adam
+ * Revision 1.23  1999-05-26 07:49:13  adam
+ * C++ compilation.
+ *
+ * Revision 1.22  1999/02/02 14:51:15  adam
+ * Updated WIN32 code specific sections. Changed header.
+ *
+ * Revision 1.21  1998/11/16 16:03:46  adam
+ * Moved loggin utilities to Yaz. Was implemented in file zlogs.c.
+ *
+ * Revision 1.20  1998/11/16 10:10:53  adam
+ * Fixed problem with zebraPosSetCreate that occurred when positions were
+ * less than 1.
+ *
+ * Revision 1.19  1998/09/22 10:48:22  adam
+ * Minor changes in search API.
+ *
+ * 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).
+ *
+ * Revision 1.16  1998/05/20 10:12:24  adam
+ * Implemented automatic EXPLAIN database maintenance.
+ * Modified Zebra to work with ASN.1 compiled version of YAZ.
+ *
+ * Revision 1.15  1998/03/05 08:45:14  adam
  * New result set model and modular ranking system. Moved towards
  * descent server API. System information stored as "SGML" records.
  *
@@ -59,7 +88,7 @@
  */
 #include <stdio.h>
 #include <assert.h>
-#ifdef WINDOWS
+#ifdef WIN32
 #include <io.h>
 #else
 #include <unistd.h>
 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;
 };
@@ -88,44 +121,79 @@ struct zset_sort_entry {
 struct zset_sort_info {
     int max_entries;
     int num_entries;
+    struct zset_sort_entry *all_entries;
     struct zset_sort_entry **entries;
 };
 
-void resultSetRank (ZebraHandle zh, struct zset_sort_info *si,
-                   RSET rset, int *hits);
+ZebraSet resultSetAddRPN (ZebraHandle zh, ODR input, ODR output,
+                         Z_RPNQuery *rpn, int num_bases, char **basenames, 
+                         const char *setname)
+{
+    ZebraSet zebraSet;
 
-ZebraSet resultSetAdd (ZebraHandle zh, const char *name, int ov,
-                         RSET rset, int *hits)
+    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 (input);
+
+    zebraSet->rset = rpn_search (zh, output->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)
 {
     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);
-    for (i = 0; i < s->sort_info->max_entries; i++)
-       s->sort_info->entries[i] = xmalloc (sizeof(**s->sort_info->entries));
-    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 = (ZebraSet) xmalloc (sizeof(*s));
+       s->next = zh->sets;
+       zh->sets = s;
+       s->name = (char *) xmalloc (strlen(name)+1);
+       strcpy (s->name, name);
+
+       s->sort_info = (struct zset_sort_info *)
+           xmalloc (sizeof(*s->sort_info));
+       s->sort_info->max_entries = 1000;
+       s->sort_info->entries = (struct zset_sort_entry **)
+           xmalloc (sizeof(*s->sort_info->entries) *
+                    s->sort_info->max_entries);
+       s->sort_info->all_entries = (struct zset_sort_entry *)
+           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;
 }
 
@@ -135,7 +203,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;
 }
 
@@ -146,13 +225,14 @@ void resultSetDestroy (ZebraHandle zh)
 
     for (s = zh->sets; s; s = s1)
     {
-       int i;
         s1 = s->next;
 
-       for (i = 0; i < s->sort_info->max_entries; i++)
-           xfree (s->sort_info->entries[i]);
+       xfree (s->sort_info->all_entries);
+       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);
@@ -173,7 +253,7 @@ ZebraPosSet zebraPosSetCreate (ZebraHandle zh, const char *name,
         return NULL;
     if (!(rset = sset->rset))
         return NULL;
-    sr = xmalloc (sizeof(*sr) * num);
+    sr = (ZebraPosSet) xmalloc (sizeof(*sr) * num);
     for (i = 0; i<num; i++)
     {
        sr[i].sysno = 0;
@@ -187,7 +267,7 @@ ZebraPosSet zebraPosSetCreate (ZebraHandle zh, const char *name,
        for (i = 0; i<num; i++)
        {
            position = positions[i];
-           if (position <= sort_info->num_entries)
+           if (position > 0 && position <= sort_info->num_entries)
            {
                logf (LOG_DEBUG, "got pos=%d (sorted)", position);
                sr[i].sysno = sort_info->entries[position-1]->sysno;
@@ -283,12 +363,12 @@ void resultSetInsertSort (ZebraHandle zh, ZebraSet sset,
        }       
        if (!rel)
            break;
-       if (criteria[j].relation == 'D')
+       if (criteria[j].relation == 'A')
         {
            if (rel > 0)
                break;
        }
-        else if (criteria[j].relation == 'A')
+        else if (criteria[j].relation == 'D')
        {
            if (rel < 0)
                break;
@@ -356,19 +436,13 @@ void resultSetInsertRank (ZebraHandle zh, struct zset_sort_info *sort_info,
     new_entry->score = score;
 }
 
-void resultSetSort (ZebraHandle zh, ODR stream,
-                   int num_input_setnames, char **input_setnames,
-                   char *output_setname, Z_SortKeySpecList *sort_sequence,
-                   int *sort_status)
+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)
     {
@@ -380,19 +454,45 @@ void resultSetSort (ZebraHandle zh, ODR stream,
        zh->errCode = 230;
        return;
     }
+    logf (LOG_DEBUG, "result set sort input=%s output=%s",
+         *input_setnames, output_setname);
     sset = resultSetGet (zh, input_setnames[0]);
     if (!sset)
     {
        zh->errCode = 30;
-       zh->errString = input_setnames[0];
+       zh->errString = nmem_strdup (nmem, input_setnames[0]);
        return;
     }
     if (!(rset = sset->rset))
     {
        zh->errCode = 30;
-       zh->errString = 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;
@@ -449,19 +549,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);
@@ -471,8 +564,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)
@@ -484,8 +576,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;
@@ -493,9 +584,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");
@@ -514,7 +607,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++;
@@ -523,7 +616,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);
@@ -534,7 +627,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)
@@ -553,8 +646,8 @@ ZebraRankClass zebraRankLookup (ZebraHandle zh, const char *name)
 
 void zebraRankInstall (ZebraHandle zh, struct rank_control *ctrl)
 {
-    ZebraRankClass p = xmalloc (sizeof(*p));
-    p->control = xmalloc (sizeof(*p->control));
+    ZebraRankClass p = (ZebraRankClass) xmalloc (sizeof(*p));
+    p->control = (struct rank_control *) xmalloc (sizeof(*p->control));
     memcpy (p->control, ctrl, sizeof(*p->control));
     p->control->name = xstrdup (ctrl->name);
     p->init_flag = 0;