Added support for static ranking. Bug #174. The staticrank is enabled
[idzebra-moved-to-github.git] / index / zsets.c
index 3ec27f7..260f567 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: zsets.c,v 1.86 2005-06-06 21:31:08 adam Exp $
+/* $Id: zsets.c,v 1.91 2005-08-18 12:50:18 adam Exp $
    Copyright (C) 1995-2005
    Index Data ApS
 
@@ -62,6 +62,7 @@ struct zebra_set {
     zint cache_position;  /* last position */
     RSFD cache_rfd;       /* rfd (NULL if not existing) */
     zint cache_psysno;    /* sysno for last position */
+    zint approx_limit;    /* limit before we do approx */
 };
 
 struct zset_sort_entry {
@@ -128,6 +129,7 @@ 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;
     if (!i)
     {
         res = resultSetRank (zh, sset, rset, rset_nmem);
@@ -152,7 +154,7 @@ ZEBRA_RES resultSetAddRPN (ZebraHandle zh, NMEM m, Z_RPNQuery *rpn,
 
     zh->hits = 0;
 
-    zebraSet = resultSetAdd (zh, setname, 1);
+    zebraSet = resultSetAdd(zh, setname, 1);
     if (!zebraSet)
         return ZEBRA_FAIL;
     zebraSet->locked = 1;
@@ -164,7 +166,7 @@ ZEBRA_RES resultSetAddRPN (ZebraHandle zh, NMEM m, Z_RPNQuery *rpn,
     zebraSet->basenames = 
         nmem_malloc (zebraSet->nmem, num_bases * sizeof(*zebraSet->basenames));
     for (i = 0; i<num_bases; i++)
-        zebraSet->basenames[i] = nmem_strdup (zebraSet->nmem, basenames[i]);
+        zebraSet->basenames[i] = nmem_strdup(zebraSet->nmem, basenames[i]);
 
     res = resultSetSearch(zh, zebraSet->nmem, zebraSet->rset_nmem,
                          rpn, zebraSet);
@@ -205,7 +207,7 @@ void resultSetAddTerm (ZebraHandle zh, ZebraSet s, int reg_type,
     (s->hits)++;
 }
 
-ZebraSet resultSetAdd (ZebraHandle zh, const char *name, int ov)
+ZebraSet resultSetAdd(ZebraHandle zh, const char *name, int ov)
 {
     ZebraSet s;
     int i;
@@ -267,10 +269,11 @@ ZebraSet resultSetAdd (ZebraHandle zh, const char *name, int ov)
     s->rpn = 0;
     s->cache_position = 0;
     s->cache_rfd = 0;
+    s->approx_limit = zh->approx_limit;
     return s;
 }
 
-ZebraSet resultSetGet (ZebraHandle zh, const char *name)
+ZebraSet resultSetGet(ZebraHandle zh, const char *name)
 {
     ZebraSet s;
 
@@ -313,7 +316,7 @@ void resultSetInvalidate (ZebraHandle zh)
     }
 }
 
-void resultSetDestroy (ZebraHandle zh, int num, char **names,int *statuses)
+void resultSetDestroy(ZebraHandle zh, int num, char **names,int *statuses)
 {
     ZebraSet * ss = &zh->sets;
     int i;
@@ -395,6 +398,10 @@ ZebraMetaRecord *zebra_meta_records_create(ZebraHandle zh, const char *name,
     RSET rset;
     int i;
     struct zset_sort_info *sort_info;
+    size_t sysno_mem_index = 0;
+
+    if (zh->m_staticrank)
+       sysno_mem_index = 1;
 
     if (!log_level_set)
         loglevels();
@@ -480,7 +487,7 @@ ZebraMetaRecord *zebra_meta_records_create(ZebraHandle zh, const char *name,
            }
             while (num_i < num && rset_read (rfd, &key, 0))
             {
-                zint this_sys = key.mem[0];
+                zint this_sys = key.mem[sysno_mem_index];
                 if (this_sys != psysno)
                 {
                     psysno = this_sys;
@@ -708,6 +715,11 @@ ZEBRA_RES resultSetSortSingle(ZebraHandle zh, NMEM nmem,
     TERMID termid;
     TERMID *terms;
     int numTerms = 0;
+    size_t sysno_mem_index = 0;
+
+    if (zh->m_staticrank)
+       sysno_mem_index = 1;
+
 
     assert(nmem); /* compiler shut up about unused param */
     sset->sort_info->num_entries = 0;
@@ -782,7 +794,7 @@ ZEBRA_RES resultSetSortSingle(ZebraHandle zh, NMEM nmem,
     rfd = rset_open (rset, RSETF_READ);
     while (rset_read (rfd, &key, &termid))
     {
-        zint this_sys = key.mem[0];
+        zint this_sys = key.mem[sysno_mem_index];
        if (log_level_searchhits)
            key_logdump_txt(log_level_searchhits, &key, termid->name);
        kno++;
@@ -835,6 +847,10 @@ ZEBRA_RES resultSetRank(ZebraHandle zh, ZebraSet zebraSet,
     rset_getterms(rset, 0, 0, &n);
     terms = (TERMID *) nmem_malloc(nmem, sizeof(*terms)*n);
     rset_getterms(rset, terms, n, &numTerms);
+    size_t sysno_mem_index = 0;
+
+    if (zh->m_staticrank)
+       sysno_mem_index = 1;
 
     rank_class = zebraRankLookup(zh, rank_handler_name);
     if (!rank_class)
@@ -848,6 +864,7 @@ ZEBRA_RES resultSetRank(ZebraHandle zh, ZebraSet zebraSet,
        RSFD rfd = rset_open(rset, RSETF_READ);
        struct rank_control *rc = rank_class->control;
        double score;
+       zint count = 0;
        
        void *handle =
            (*rc->begin) (zh->reg, rank_class->class_handle, rset, nmem,
@@ -855,19 +872,20 @@ ZEBRA_RES resultSetRank(ZebraHandle zh, ZebraSet zebraSet,
        zint psysno = 0;
        while (rset_read(rfd, &key, &termid))
        {
-           zint this_sys = key.mem[0];
+           zint this_sys = key.mem[sysno_mem_index];
            zint seqno = key.mem[key.len-1];
            kno++;
            if (log_level_searchhits)
                key_logdump_txt(log_level_searchhits, &key, termid->name);
            if (this_sys != psysno)
            {
-               if (rfd->counted_items >= rset->hits_limit)
+               if (rfd->counted_items > rset->hits_limit)
                    break;
                if (psysno)
                {
                    score = (*rc->calc) (handle, psysno);
                    resultSetInsertRank (zh, sort_info, psysno, score, 'A');
+                   count++;
                }
                psysno = this_sys;
            }
@@ -877,6 +895,7 @@ ZEBRA_RES resultSetRank(ZebraHandle zh, ZebraSet zebraSet,
        {
            score = (*rc->calc)(handle, psysno);
            resultSetInsertRank(zh, sort_info, psysno, score, 'A');
+           count++;
        }
        (*rc->end) (zh->reg, handle);
        rset_close (rfd);
@@ -954,8 +973,9 @@ static int trav_rset_for_termids(RSET rset, TERMID *termid_array,
        if (approx_array)
            approx_array[no] = rset->hits_approx;
 #if 0
-       yaz_log(YLOG_LOG, "rset=%p term=%s count=" ZINT_FORMAT,
-               rset, rset->term->name, rset->hits_count);
+       yaz_log(YLOG_LOG, "rset=%p term=%s limit=" ZINT_FORMAT
+               " count=" ZINT_FORMAT,
+               rset, rset->term->name, rset->hits_limit, rset->hits_count);
 #endif
        no++;
     }
@@ -977,7 +997,8 @@ ZEBRA_RES zebra_result_set_term_no(ZebraHandle zh, const char *setname,
 
 ZEBRA_RES zebra_result_set_term_info(ZebraHandle zh, const char *setname,
                                     int no, zint *count, int *approx,
-                                    char *termbuf, size_t *termlen)
+                                    char *termbuf, size_t *termlen,
+                                    const char **term_ref_id)
 {
     ZebraSet sset = resultSetGet(zh, setname);
     if (sset)
@@ -1023,6 +1044,8 @@ ZEBRA_RES zebra_result_set_term_info(ZebraHandle zh, const char *setname,
                }
                termbuf[*termlen] = '\0';
            }
+           if (term_ref_id)
+               *term_ref_id = term_array[no]->ref_id;
 
            xfree(term_array);
            xfree(hits_array);
@@ -1033,8 +1056,8 @@ ZEBRA_RES zebra_result_set_term_info(ZebraHandle zh, const char *setname,
     return ZEBRA_FAIL;
 }
 
-ZEBRA_RES zebra_get_hit_vector(ZebraHandle zh, const char *setname,
-                              zint sysno)
+ZEBRA_RES zebra_snippets_hit_vector(ZebraHandle zh, const char *setname,
+                                   zint sysno, zebra_snippets *snippets)
 {
     ZebraSet sset = resultSetGet(zh, setname);
     yaz_log(YLOG_LOG, "zebra_get_hit_vector setname=%s zysno=" ZINT_FORMAT,
@@ -1073,15 +1096,18 @@ ZEBRA_RES zebra_get_hit_vector(ZebraHandle zh, const char *setname,
            if (termid)
            {
                struct ord_list *ol;
-               key_logdump_txt(YLOG_LOG, &key, termid->name);
-               yaz_log(YLOG_LOG, "   type=%d", termid->type);
                for (ol = termid->ol; ol; ol = ol->next)
-                   yaz_log(YLOG_LOG, "   ord=%d", ol->ord);
+               {
+                   zebra_snippets_append(snippets, key.mem[key.len-1],
+                                         termid->reg_type,
+                                         ol->ord, termid->name);
+               }
            }
        }
        rset_close(rsfd);
        
        rset_delete(rset_comb);
+       nmem_destroy(nmem);
     }
     return ZEBRA_OK;
 }