Remove isamd. It's not been in use for a long time and isamb is better
[idzebra-moved-to-github.git] / index / zsets.c
index 6db021b..a26ac40 100644 (file)
@@ -1,5 +1,5 @@
-/* $Id: zsets.c,v 1.38 2002-08-02 19:26:56 adam Exp $
-   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
+/* $Id: zsets.c,v 1.50 2004-08-04 08:35:24 adam Exp $
+   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004
    Index Data Aps
 
 This file is part of the Zebra server.
@@ -58,7 +58,7 @@ struct zebra_set {
 };
 
 struct zset_sort_entry {
-    int sysno;
+    zint sysno;
     int score;
     char buf[ZSET_SORT_MAX_LEVEL][SORT_IDX_ENTRYSIZE];
 };
@@ -70,7 +70,7 @@ struct zset_sort_info {
     struct zset_sort_entry **entries;
 };
 
-ZebraSet resultSetAddRPN (ZebraHandle zh, ODR input, ODR output,
+ZebraSet resultSetAddRPN (ZebraHandle zh, NMEM m,
                          Z_RPNQuery *rpn, int num_bases,
                           char **basenames, 
                          const char *setname)
@@ -87,7 +87,7 @@ ZebraSet resultSetAddRPN (ZebraHandle zh, ODR input, ODR output,
        return 0;
     zebraSet->locked = 1;
     zebraSet->rpn = 0;
-    zebraSet->nmem = nmem_create ();
+    zebraSet->nmem = m;
 
     zebraSet->num_bases = num_bases;
     zebraSet->basenames = 
@@ -96,7 +96,7 @@ ZebraSet resultSetAddRPN (ZebraHandle zh, ODR input, ODR output,
         zebraSet->basenames[i] = nmem_strdup (zebraSet->nmem, basenames[i]);
 
 
-    zebraSet->rset = rpn_search (zh, output->mem, rpn,
+    zebraSet->rset = rpn_search (zh, zebraSet->nmem, rpn,
                                  zebraSet->num_bases,
                                 zebraSet->basenames, zebraSet->name,
                                 zebraSet);
@@ -160,13 +160,13 @@ int zebra_resultSetTerms (ZebraHandle zh, const char *setname,
         size_t inleft = strlen(inbuf);
         size_t outleft = *len - 1;
        int converted = 0;
-#if HAVE_ICONV_H
-        if (zh->iconv_from_utf8 != (iconv_t)(-1))
+
+        if (zh->iconv_from_utf8 != 0)
         {
             char *outbuf = out;
             size_t ret;
             
-            ret = iconv(zh->iconv_from_utf8, &inbuf, &inleft,
+            ret = yaz_iconv(zh->iconv_from_utf8, &inbuf, &inleft,
                         &outbuf, &outleft);
             if (ret == (size_t)(-1))
                 *len = 0;
@@ -174,7 +174,6 @@ int zebra_resultSetTerms (ZebraHandle zh, const char *setname,
                 *len = outbuf - out;
            converted = 1;
         }
-#endif
         if (!converted)
         {
             if (inleft > outleft)
@@ -198,7 +197,7 @@ ZebraSet resultSetAdd (ZebraHandle zh, const char *name, int ov)
            break;
     if (s)
     {
-       logf (LOG_DEBUG, "updating result set %s", name);
+       yaz_log (LOG_DEBUG, "updating result set %s", name);
        if (!ov || s->locked)
            return NULL;
        if (s->rset)
@@ -208,7 +207,9 @@ ZebraSet resultSetAdd (ZebraHandle zh, const char *name, int ov)
     }
     else
     {
-       logf (LOG_DEBUG, "adding result set %s", name);
+       const char *sort_max_str = zebra_get_resource(zh, "sortmax", "1000");
+
+       yaz_log (LOG_DEBUG, "adding result set %s", name);
        s = (ZebraSet) xmalloc (sizeof(*s));
        s->next = zh->sets;
        zh->sets = s;
@@ -217,7 +218,10 @@ ZebraSet resultSetAdd (ZebraHandle zh, const char *name, int ov)
 
        s->sort_info = (struct zset_sort_info *)
            xmalloc (sizeof(*s->sort_info));
-       s->sort_info->max_entries = 1000;
+       s->sort_info->max_entries = atoi(sort_max_str);
+       if (s->sort_info->max_entries < 2)
+           s->sort_info->max_entries = 2;
+
        s->sort_info->entries = (struct zset_sort_entry **)
            xmalloc (sizeof(*s->sort_info->entries) *
                     s->sort_info->max_entries);
@@ -364,7 +368,7 @@ ZebraPosSet zebraPosSetCreate (ZebraHandle zh, const char *name,
                position = positions[i];
                if (position > 0 && position <= sort_info->num_entries)
                {
-                   logf (LOG_DEBUG, "got pos=%d (sorted)", position);
+                   yaz_log (LOG_DEBUG, "got pos=%d (sorted)", position);
                    sr[i].sysno = sort_info->entries[position-1]->sysno;
                    sr[i].score = sort_info->entries[position-1]->score;
                }
@@ -380,7 +384,7 @@ ZebraPosSet zebraPosSetCreate (ZebraHandle zh, const char *name,
        {
            int position = 0;
            int num_i = 0;
-           int psysno = 0;
+           zint psysno = 0;
            int term_index;
            RSFD rfd;
            struct it_key key;
@@ -392,9 +396,14 @@ ZebraPosSet zebraPosSetCreate (ZebraHandle zh, const char *name,
            rfd = rset_open (rset, RSETF_READ);
            while (num_i < num && rset_read (rset, rfd, &key, &term_index))
            {
-               if (key.sysno != psysno)
+#if IT_KEY_NEW
+               zint this_sys = key.mem[0];
+#else
+               zint this_sys = key.sysno;
+#endif
+               if (this_sys != psysno)
                {
-                   psysno = key.sysno;
+                   psysno = this_sys;
                    if (sort_info)
                    {
                        /* determine we alreay have this in our set */
@@ -409,7 +418,7 @@ ZebraPosSet zebraPosSetCreate (ZebraHandle zh, const char *name,
                    if (position == positions[num_i])
                    {
                        sr[num_i].sysno = psysno;
-                       logf (LOG_DEBUG, "got pos=%d (unsorted)", position);
+                       yaz_log (LOG_DEBUG, "got pos=%d (unsorted)", position);
                        sr[num_i].score = -1;
                        num_i++;
                    }
@@ -434,7 +443,7 @@ struct sortKeyInfo {
 
 void resultSetInsertSort (ZebraHandle zh, ZebraSet sset,
                          struct sortKeyInfo *criteria, int num_criteria,
-                         int sysno)
+                         zint sysno)
 {
     struct zset_sort_entry this_entry;
     struct zset_sort_entry *new_entry = NULL;
@@ -508,7 +517,7 @@ void resultSetInsertSort (ZebraHandle zh, ZebraSet sset,
 }
 
 void resultSetInsertRank (ZebraHandle zh, struct zset_sort_info *sort_info,
-                         int sysno, int score, int relation)
+                         zint sysno, int score, int relation)
 {
     struct zset_sort_entry *new_entry = NULL;
     int i, j;
@@ -571,7 +580,7 @@ void resultSetSort (ZebraHandle zh, NMEM nmem,
        zh->errCode = 230;
        return;
     }
-    logf (LOG_DEBUG, "result set sort input=%s output=%s",
+    yaz_log (LOG_DEBUG, "result set sort input=%s output=%s",
          *input_setnames, output_setname);
     sset = resultSetGet (zh, input_setnames[0]);
     if (!sset)
@@ -599,14 +608,15 @@ void resultSetSortSingle (ZebraHandle zh, NMEM nmem,
                          ZebraSet sset, RSET rset,
                          Z_SortKeySpecList *sort_sequence, int *sort_status)
 {
-    int i, psysno = 0;
+    int i;
+    zint psysno = 0;
     struct it_key key;
     struct sortKeyInfo sort_criteria[3];
     int num_criteria;
     int term_index;
     RSFD rfd;
 
-    logf (LOG_LOG, "resultSetSortSingle start");
+    yaz_log (LOG_LOG, "resultSetSortSingle start");
     sset->sort_info->num_entries = 0;
 
     sset->hits = 0;
@@ -618,9 +628,9 @@ void resultSetSortSingle (ZebraHandle zh, NMEM nmem,
        Z_SortKeySpec *sks = sort_sequence->specs[i];
        Z_SortKey *sk;
 
-       if (*sks->sortRelation == Z_SortRelation_ascending)
+       if (*sks->sortRelation == Z_SortKeySpec_ascending)
            sort_criteria[i].relation = 'A';
-       else if (*sks->sortRelation == Z_SortRelation_descending)
+       else if (*sks->sortRelation == Z_SortKeySpec_descending)
            sort_criteria[i].relation = 'D';
        else
        {
@@ -641,20 +651,20 @@ void resultSetSortSingle (ZebraHandle zh, NMEM nmem,
        switch (sk->which)
        {
        case Z_SortKey_sortField:
-           logf (LOG_DEBUG, "Sort: key %d is of type sortField", i+1);
+           yaz_log (LOG_DEBUG, "Sort: key %d is of type sortField", i+1);
            zh->errCode = 207;
            return;
        case Z_SortKey_elementSpec:
-           logf (LOG_DEBUG, "Sort: key %d is of type elementSpec", i+1);
+           yaz_log (LOG_DEBUG, "Sort: key %d is of type elementSpec", i+1);
            zh->errCode = 207;
            return;
        case Z_SortKey_sortAttributes:
-           logf (LOG_DEBUG, "Sort: key %d is of type sortAttributes", i+1);
+           yaz_log (LOG_DEBUG, "Sort: key %d is of type sortAttributes", i+1);
            sort_criteria[i].attrUse =
                zebra_maps_sort (zh->reg->zebra_maps,
                                 sk->u.sortAttributes,
                                  &sort_criteria[i].numerical);
-           logf (LOG_DEBUG, "use value = %d", sort_criteria[i].attrUse);
+           yaz_log (LOG_DEBUG, "use value = %d", sort_criteria[i].attrUse);
            if (sort_criteria[i].attrUse == -1)
            {
                zh->errCode = 116;
@@ -671,10 +681,15 @@ void resultSetSortSingle (ZebraHandle zh, NMEM nmem,
     rfd = rset_open (rset, RSETF_READ);
     while (rset_read (rset, rfd, &key, &term_index))
     {
-        if (key.sysno != psysno)
+#if IT_KEY_NEW
+       zint this_sys = key.mem[0];
+#else
+       zint this_sys = key.sysno;
+#endif
+        if (this_sys != psysno)
         {
            (sset->hits)++;
-            psysno = key.sysno;
+            psysno = this_sys;
            resultSetInsertSort (zh, sset,
                                 sort_criteria, num_criteria, psysno);
         }
@@ -688,11 +703,11 @@ void resultSetSortSingle (ZebraHandle zh, NMEM nmem,
                  rset->rset_terms[i]->flags,
                  rset->rset_terms[i]->count);
 
-    *sort_status = Z_SortStatus_success;
-    logf (LOG_LOG, "resultSetSortSingle end");
+    *sort_status = Z_SortResponse_success;
+    yaz_log (LOG_LOG, "resultSetSortSingle end");
 }
 
-RSET resultSetRef (ZebraHandle zh, Z_ResultSetId *resultSetId)
+RSET resultSetRef (ZebraHandle zh, const char *resultSetId)
 {
     ZebraSet s;
 
@@ -710,6 +725,7 @@ void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset)
     ZebraRankClass rank_class;
     struct rank_control *rc;
     struct zset_sort_info *sort_info;
+    const char *rank_handler_name = res_get_def(zh->res, "rank", "rank-1");
 
     sort_info = zebraSet->sort_info;
     sort_info->num_entries = 0;
@@ -718,28 +734,42 @@ void resultSetRank (ZebraHandle zh, ZebraSet zebraSet, RSET rset)
 
     yaz_log (LOG_LOG, "resultSetRank");
 
-    rank_class = zebraRankLookup (zh, "rank-1");
+    rank_class = zebraRankLookup (zh, rank_handler_name);
+    if (!rank_class)
+    {
+        yaz_log (LOG_WARN, "No such rank handler: %s", rank_handler_name);
+        return;
+    }
     rc = rank_class->control;
 
     if (rset_read (rset, rfd, &key, &term_index))
     {
-       int psysno = key.sysno;
+#if IT_KEY_NEW
+       zint psysno = key.mem[0];
+#else
+       zint psysno = key.sysno;
+#endif
        int score;
        void *handle =
            (*rc->begin) (zh->reg, rank_class->class_handle, rset);
        (zebraSet->hits)++;
        do
        {
+#if IT_KEY_NEW
+           zint this_sys = key.mem[0];
+#else
+           zint this_sys = key.sysno;
+#endif
            kno++;
-           if (key.sysno != psysno)
+           if (this_sys != psysno)
            {
                score = (*rc->calc) (handle, psysno);
 
                resultSetInsertRank (zh, sort_info, psysno, score, 'A');
                (zebraSet->hits)++;
-               psysno = key.sysno;
+               psysno = this_sys;
            }
-           (*rc->add) (handle, key.seqno, term_index);
+           (*rc->add) (handle, this_sys, term_index);
        }
        while (rset_read (rset, rfd, &key, &term_index));
        score = (*rc->calc) (handle, psysno);
@@ -766,7 +796,7 @@ ZebraRankClass zebraRankLookup (ZebraHandle zh, const char *name)
     if (p && !p->init_flag)
     {
        if (p->control->create)
-           p->class_handle = (*p->control->create)(zh->reg);
+           p->class_handle = (*p->control->create)(zh);
        p->init_flag = 1;
     }
     return p;