Fix warning and code WRT uninit var (sort)
[idzebra-moved-to-github.git] / index / zsets.c
index 5187cf4..4a8c74c 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the Zebra server.
-   Copyright (C) 1995-2008 Index Data
+   Copyright (C) 1994-2011 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
@@ -113,6 +113,7 @@ static ZEBRA_RES resultSetSearch(ZebraHandle zh, NMEM nmem, NMEM rset_nmem,
     rpn_get_top_approx_limit(zh, rpn->RPNStructure, &sset->approx_limit);
 
     res = rpn_search_top(zh, rpn->RPNStructure, rpn->attributeSetId,
+                         sset->approx_limit,
                         nmem, rset_nmem,
                         sort_sequence,
                         sset->num_bases, sset->basenames,
@@ -125,7 +126,8 @@ static ZEBRA_RES resultSetSearch(ZebraHandle zh, NMEM nmem, NMEM rset_nmem,
     for (i = 0; sort_sequence->specs[i]; i++)
         ;
     sort_sequence->num_specs = i;
-    rset->hits_limit = sset->approx_limit;
+    rset_set_hits_limit(rset, sset->approx_limit);
+
     if (!i)
     {
         res = resultSetRank(zh, sset, rset, rset_nmem);
@@ -576,23 +578,28 @@ void resultSetInsertSort(ZebraHandle zh, ZebraSet sset,
                     criteria[i].ord[database_no]);
             zebra_sort_type(zh->reg->sort_index, criteria[i].ord[database_no]);
             wrbuf_rewind(w);
-            if (zebra_sort_read(zh->reg->sort_index, w))
+            if (zebra_sort_read(zh->reg->sort_index, 0, w))
             {
+                /* consider each sort entry and take lowest/highest one
+                   of the one as sorting key depending on whether sort is
+                   ascending/descending */
                 int off = 0;
                 while (off != wrbuf_len(w))
                 {
+                    size_t l = strlen(wrbuf_buf(w)+off);
                     assert(off < wrbuf_len(w));
-                    if (off == 0)
-                        strcpy(this_entry_buf, wrbuf_buf(w));
-                    else if (criteria[i].relation == 'A')
-                    {
-                        if (strcmp(wrbuf_buf(w)+off, this_entry_buf) < 0)
-                            strcpy(this_entry_buf, wrbuf_buf(w)+off);
-                    }
-                    else if (criteria[i].relation == 'D')
+
+                    if (l >= SORT_IDX_ENTRYSIZE)
+                        l = SORT_IDX_ENTRYSIZE-1;
+                    if ( (off == 0)
+                         || (criteria[i].relation == 'A'
+                             && strcmp(wrbuf_buf(w)+off, this_entry_buf) < 0)
+                         || (criteria[i].relation == 'D'
+                             && strcmp(wrbuf_buf(w)+off, this_entry_buf) > 0)
+                        )
                     {
-                        if (strcmp(wrbuf_buf(w)+off, this_entry_buf) > 0)
-                            strcpy(this_entry_buf, wrbuf_buf(w)+off);
+                        memcpy(this_entry_buf, wrbuf_buf(w)+off, l);
+                        this_entry_buf[l] = '\0';
                     }
                     off += 1 + strlen(wrbuf_buf(w)+off);
                 }
@@ -618,12 +625,6 @@ void resultSetInsertSort(ZebraHandle zh, ZebraSet sset,
                 char this_entry_org[1024];
                 char other_entry_org[1024];
                 double diff;
-                /* when searching multiple databases, we use the index
-                   type of the first one. So if they differ between
-                   databases, we have a problem here we could store the
-                   index_type for each database, but if we didn't find the
-                   record in any sort index, then we still don't know to
-                   which database it belongs. */
                 const char *index_type = criteria[j].index_type;
                 zebra_term_untrans(zh, index_type, this_entry_org,
                                    this_entry_buf);
@@ -904,7 +905,6 @@ ZEBRA_RES resultSetSortSingle(ZebraHandle zh, NMEM nmem,
     {
         Z_SortKeySpec *sks = sort_sequence->specs[i];
         Z_SortKey *sk;
-        ZEBRA_RES res;
         
         sort_criteria[i].ord = (int *)
             nmem_malloc(nmem, sizeof(int)*numbases);
@@ -976,13 +976,12 @@ ZEBRA_RES resultSetSortSingle(ZebraHandle zh, NMEM nmem,
             for (ib = 0; ib < numbases; ib++)
             {
                 zebraExplain_curDatabase(zh->reg->zei, zh->basenames[ib]);
-                res = zebra_sort_get_ord(zh, sk->u.sortAttributes,
-                                         &sort_criteria[i].ord[ib],
-                                         &sort_criteria[i].numerical[ib]);
+                if (zebra_sort_get_ord(zh, sk->u.sortAttributes,
+                                       &sort_criteria[i].ord[ib],
+                                       &sort_criteria[i].numerical[ib]) != 
+                    ZEBRA_OK && sks->which != Z_SortKeySpec_null)
+                    return ZEBRA_FAIL;
             }
-            
-            if (sks->which != Z_SortKeySpec_null && res != ZEBRA_OK)
-                return ZEBRA_FAIL;
             break;
         }
         /* right now we look up the index type based on the first database
@@ -1145,6 +1144,11 @@ ZEBRA_RES resultSetRank(ZebraHandle zh, ZebraSet zebraSet,
                 }
                if (rfd->counted_items > rset->hits_limit)
                     stop_flag = 1;
+                if (stop_flag)
+                {
+                    zebraSet->estimated_hit_count = 1;
+                    break;
+                }
                if (psysno)
                {   /* only if we did have a previous record */
                    score = (*rc->calc)(handle, psysno, pstaticrank,
@@ -1153,12 +1157,6 @@ ZEBRA_RES resultSetRank(ZebraHandle zh, ZebraSet zebraSet,
                    resultSetInsertRank(zh, sort_info, psysno, score, 'A');
                    count++;
                }
-                if (stop_flag)
-                {
-                    zebraSet->estimated_hit_count = 1;
-                    rset_set_hits_limit(rset, 0);
-                    break;
-                }
                psysno = this_sys;
                if (zh->m_staticrank)
                    pstaticrank = key.mem[0];
@@ -1524,6 +1522,7 @@ void zebra_count_set(ZebraHandle zh, RSET rset, zint *count,
 /*
  * Local variables:
  * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
  * indent-tabs-mode: nil
  * End:
  * vim: shiftwidth=4 tabstop=8 expandtab