For estimated hit counts, Zebra returns resultSetStatus=estimtate as
authorAdam Dickmeiss <adam@indexdata.dk>
Tue, 16 Jan 2007 15:01:15 +0000 (15:01 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Tue, 16 Jan 2007 15:01:15 +0000 (15:01 +0000)
part of SearchResponse. Requires YAZ 2.1.47 or later. Bump Zebra
to version 2.0.9.

NEWS
configure.ac
include/idzebra/api.h
include/idzebra/version.h
index/index.h
index/zebraapi.c
index/zebrasrv.c
index/zsets.c

diff --git a/NEWS b/NEWS
index 0cb11a7..90c6112 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,6 @@
+For estimated hit counts, Zebra returns resultSetStatus=estimtate as
+part of SearchResponse. Requires YAZ 2.1.47 or later.
+
 --- 2.0.8 2007/01/15
 
 For searches, do not truncate more than at most 'truncmax' terms in one
 --- 2.0.8 2007/01/15
 
 For searches, do not truncate more than at most 'truncmax' terms in one
index b44332d..190ea8b 100644 (file)
@@ -1,8 +1,8 @@
 dnl Zebra, Index Data ApS, 1995-2007
 dnl Zebra, Index Data ApS, 1995-2007
-dnl $Id: configure.ac,v 1.46 2007-01-15 20:14:37 adam Exp $
+dnl $Id: configure.ac,v 1.47 2007-01-16 15:01:15 adam Exp $
 dnl
 AC_PREREQ(2.59)
 dnl
 AC_PREREQ(2.59)
-AC_INIT([idzebra],[2.0.8],[zebra-help@indexdata.dk])
+AC_INIT([idzebra],[2.0.9],[zebra-help@indexdata.dk])
 AC_CONFIG_SRCDIR(configure.ac)
 AC_CONFIG_AUX_DIR(config)
 AM_INIT_AUTOMAKE([1.8])
 AC_CONFIG_SRCDIR(configure.ac)
 AC_CONFIG_AUX_DIR(config)
 AM_INIT_AUTOMAKE([1.8])
@@ -41,7 +41,7 @@ else
 fi
 dnl
 dnl ------ YAZ
 fi
 dnl
 dnl ------ YAZ
-YAZ_INIT($yazflag,2.1.45)
+YAZ_INIT($yazflag,2.1.47)
 if test "$YAZVERSION" = "NONE"; then
     AC_MSG_ERROR([YAZ development libraries required])
 fi
 if test "$YAZVERSION" = "NONE"; then
     AC_MSG_ERROR([YAZ development libraries required])
 fi
index 9bb70c6..1a41b65 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: api.h,v 1.42 2007-01-15 20:08:24 adam Exp $
+/* $Id: api.h,v 1.43 2007-01-16 15:01:15 adam Exp $
    Copyright (C) 1995-2007
    Index Data ApS
 
    Copyright (C) 1995-2007
    Index Data ApS
 
@@ -186,6 +186,22 @@ ZEBRA_RES zebra_search_PQF(ZebraHandle zh, const char *pqf_query,
     \param query RPN query using YAZ structure
     \param setname name of resultset
     \param hits number of hits is returned
     \param query RPN query using YAZ structure
     \param setname name of resultset
     \param hits number of hits is returned
+    \param estimated_hit_count whether hit count is an estimate
+    \param partial_resultset whether result is only partially evaluated
+*/
+YAZ_EXPORT
+ZEBRA_RES zebra_search_RPN_x(ZebraHandle zh, ODR o, Z_RPNQuery *query,
+                           const char *setname, zint *hits,
+                           int *estimated_hit_count,
+                           int *partial_resultset);
+
+
+/** \brief Search using RPN Query structure (from ASN.1)
+    \param zh session handle
+    \param o ODR handle
+    \param query RPN query using YAZ structure
+    \param setname name of resultset
+    \param hits number of hits is returned
 */
 YAZ_EXPORT
 ZEBRA_RES zebra_search_RPN(ZebraHandle zh, ODR o, Z_RPNQuery *query,
 */
 YAZ_EXPORT
 ZEBRA_RES zebra_search_RPN(ZebraHandle zh, ODR o, Z_RPNQuery *query,
index bf290c5..863c497 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: version.h,v 1.15 2007-01-15 20:14:38 adam Exp $
+/* $Id: version.h,v 1.16 2007-01-16 15:01:15 adam Exp $
    Copyright (C) 1995-2007
    Index Data ApS
 
    Copyright (C) 1995-2007
    Index Data ApS
 
@@ -22,9 +22,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 #ifndef ZEBRAVER
 
 
 #ifndef ZEBRAVER
 
-#define ZEBRAVER "2.0.8"
+#define ZEBRAVER "2.0.9"
 
 
-#define ZEBRADATE "$Date: 2007-01-15 20:14:38 $"
+#define ZEBRADATE "$Date: 2007-01-16 15:01:15 $"
 
 #endif
 /*
 
 #endif
 /*
index cafe44d..f890e57 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: index.h,v 1.190 2007-01-15 20:08:25 adam Exp $
+/* $Id: index.h,v 1.191 2007-01-16 15:01:15 adam Exp $
    Copyright (C) 1995-2007
    Index Data ApS
 
    Copyright (C) 1995-2007
    Index Data ApS
 
@@ -198,7 +198,6 @@ struct zebra_session {
     char *user_perm;
     char *dbaccesslist;
     int errCode;
     char *user_perm;
     char *dbaccesslist;
     int errCode;
-    zint hits;
     char *errString;
 #if HAVE_SYS_TIMES_H
     struct tms tms1;
     char *errString;
 #if HAVE_SYS_TIMES_H
     struct tms tms1;
@@ -285,8 +284,10 @@ void resultSetAddTerm(ZebraHandle zh, ZebraSet s, int reg_type,
 ZebraSet resultSetAdd(ZebraHandle zh, const char *name, int ov);
 ZebraSet resultSetGet(ZebraHandle zh, const char *name);
 ZEBRA_RES resultSetAddRPN(ZebraHandle zh, NMEM m, Z_RPNQuery *rpn,
 ZebraSet resultSetAdd(ZebraHandle zh, const char *name, int ov);
 ZebraSet resultSetGet(ZebraHandle zh, const char *name);
 ZEBRA_RES resultSetAddRPN(ZebraHandle zh, NMEM m, Z_RPNQuery *rpn,
-                    int num_bases, char **basenames,
-                    const char *setname);
+                          int num_bases, char **basenames,
+                          const char *setname,
+                          zint *hits, int *estimated_hit_count,
+                          int *partial_resultset);
 RSET resultSetRef(ZebraHandle zh, const char *resultSetId);
 void resultSetDestroy(ZebraHandle zh, int num_names, char **names,
                       int *statuses);
 RSET resultSetRef(ZebraHandle zh, const char *resultSetId);
 void resultSetDestroy(ZebraHandle zh, int num_names, char **names,
                       int *statuses);
index 6ecea62..a8e8039 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: zebraapi.c,v 1.242 2007-01-15 15:10:17 adam Exp $
+/* $Id: zebraapi.c,v 1.243 2007-01-16 15:01:15 adam Exp $
    Copyright (C) 1995-2007
    Index Data ApS
 
    Copyright (C) 1995-2007
    Index Data ApS
 
@@ -1015,8 +1015,10 @@ ZEBRA_RES zebra_set_approx_limit(ZebraHandle zh, zint approx_limit)
     return ZEBRA_OK;
 }
 
     return ZEBRA_OK;
 }
 
-ZEBRA_RES zebra_search_RPN(ZebraHandle zh, ODR o, Z_RPNQuery *query,
-                          const char *setname, zint *hits)
+ZEBRA_RES zebra_search_RPN_x(ZebraHandle zh, ODR o, Z_RPNQuery *query,
+                             const char *setname, zint *hits,
+                             int *estimated_hit_count,
+                             int *partial_resultset)
 {
     ZEBRA_RES r;
     
 {
     ZEBRA_RES r;
     
@@ -1027,19 +1029,27 @@ ZEBRA_RES zebra_search_RPN(ZebraHandle zh, ODR o, Z_RPNQuery *query,
     assert(hits);
     assert(setname);
     yaz_log(log_level, "zebra_search_rpn");
     assert(hits);
     assert(setname);
     yaz_log(log_level, "zebra_search_rpn");
-    zh->hits = 0;
-    *hits = 0;
 
     if (zebra_begin_read(zh) == ZEBRA_FAIL)
        return ZEBRA_FAIL;
 
     r = resultSetAddRPN(zh, odr_extract_mem(o), query, 
 
     if (zebra_begin_read(zh) == ZEBRA_FAIL)
        return ZEBRA_FAIL;
 
     r = resultSetAddRPN(zh, odr_extract_mem(o), query, 
-                       zh->num_basenames, zh->basenames, setname);
+                       zh->num_basenames, zh->basenames, setname,
+                        hits, estimated_hit_count, partial_resultset);
     zebra_end_read(zh);
     zebra_end_read(zh);
-    *hits = zh->hits;
     return r;
 }
 
     return r;
 }
 
+ZEBRA_RES zebra_search_RPN(ZebraHandle zh, ODR o, Z_RPNQuery *query,
+                           const char *setname, zint *hits)
+{
+    int estimated_hit_count;
+    int partial_resultset;
+    return zebra_search_RPN_x(zh, o, query, setname, hits,
+                              &estimated_hit_count,
+                              &partial_resultset);
+}
+
 ZEBRA_RES zebra_records_retrieve(ZebraHandle zh, ODR stream,
                                 const char *setname,
                                 Z_RecordComposition *comp,
 ZEBRA_RES zebra_records_retrieve(ZebraHandle zh, ODR stream,
                                 const char *setname,
                                 Z_RecordComposition *comp,
@@ -2387,6 +2397,7 @@ ZEBRA_RES zebra_search_PQF(ZebraHandle zh, const char *pqf_query,
     Z_RPNQuery *query;
     ODR odr;
 
     Z_RPNQuery *query;
     ODR odr;
 
+
     ZEBRA_CHECK_HANDLE(zh);
 
     odr = odr_createmem(ODR_ENCODE);
     ZEBRA_CHECK_HANDLE(zh);
 
     odr = odr_createmem(ODR_ENCODE);
index 7112234..234fae0 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: zebrasrv.c,v 1.5 2007-01-15 15:10:17 adam Exp $
+/* $Id: zebrasrv.c,v 1.6 2007-01-16 15:01:15 adam Exp $
    Copyright (C) 1995-2007
    Index Data ApS
 
    Copyright (C) 1995-2007
    Index Data ApS
 
@@ -278,8 +278,10 @@ int bend_search(void *handle, bend_search_rr *r)
     switch (r->query->which)
     {
     case Z_Query_type_1: case Z_Query_type_101:
     switch (r->query->which)
     {
     case Z_Query_type_1: case Z_Query_type_101:
-       res = zebra_search_RPN(zh, r->stream, r->query->u.type_1,
-                              r->setname, &zhits);
+       res = zebra_search_RPN_x(zh, r->stream, r->query->u.type_1,
+                                 r->setname, &zhits,
+                                 &r->estimated_hit_count,
+                                 &r->partial_resultset);
        if (res != ZEBRA_OK)
            zebra_result(zh, &r->errcode, &r->errstring);
        else
        if (res != ZEBRA_OK)
            zebra_result(zh, &r->errcode, &r->errstring);
        else
index 982e6d1..9b045d4 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: zsets.c,v 1.115 2007-01-15 15:10:17 adam Exp $
+/* $Id: zsets.c,v 1.116 2007-01-16 15:01:15 adam Exp $
    Copyright (C) 1995-2007
    Index Data ApS
 
    Copyright (C) 1995-2007
    Index Data ApS
 
@@ -58,6 +58,7 @@ struct zebra_set {
     int term_entries_max;
     struct zebra_set *next;
     int locked;
     int term_entries_max;
     struct zebra_set *next;
     int locked;
+    int estimated_hit_count;
 
     zint cache_position;  /* last position */
     RSFD cache_rfd;       /* rfd (NULL if not existing) */
 
     zint cache_position;  /* last position */
     RSFD cache_rfd;       /* rfd (NULL if not existing) */
@@ -95,8 +96,8 @@ static void loglevels(void)
 }
 
 
 }
 
 
-ZEBRA_RES resultSetSearch(ZebraHandle zh, NMEM nmem, NMEM rset_nmem,
-                         Z_RPNQuery *rpn, ZebraSet sset)
+static ZEBRA_RES resultSetSearch(ZebraHandle zh, NMEM nmem, NMEM rset_nmem,
+                                 Z_RPNQuery *rpn, ZebraSet sset)
 {
     RSET rset = 0;
     oident *attrset;
 {
     RSET rset = 0;
     oident *attrset;
@@ -104,8 +105,6 @@ ZEBRA_RES resultSetSearch(ZebraHandle zh, NMEM nmem, NMEM rset_nmem,
     int sort_status, i;
     ZEBRA_RES res = ZEBRA_OK;
 
     int sort_status, i;
     ZEBRA_RES res = ZEBRA_OK;
 
-    zh->hits = 0;
-
     sort_sequence = (Z_SortKeySpecList *)
         nmem_malloc(nmem, sizeof(*sort_sequence));
     sort_sequence->num_specs = 10; /* FIXME - Hard-coded number */
     sort_sequence = (Z_SortKeySpecList *)
         nmem_malloc(nmem, sizeof(*sort_sequence));
     sort_sequence->num_specs = 10; /* FIXME - Hard-coded number */
@@ -149,13 +148,17 @@ ZEBRA_RES resultSetSearch(ZebraHandle zh, NMEM nmem, NMEM rset_nmem,
 
 ZEBRA_RES resultSetAddRPN (ZebraHandle zh, NMEM m, Z_RPNQuery *rpn,
                           int num_bases, char **basenames,
 
 ZEBRA_RES resultSetAddRPN (ZebraHandle zh, NMEM m, Z_RPNQuery *rpn,
                           int num_bases, char **basenames,
-                          const char *setname)
+                          const char *setname,
+                           zint *hits, int *estimated_hit_count,
+                           int *partial_resultset)
 {
     ZebraSet zebraSet;
     int i;
     ZEBRA_RES res;
 
 {
     ZebraSet zebraSet;
     int i;
     ZEBRA_RES res;
 
-    zh->hits = 0;
+    *hits = 0;
+    *estimated_hit_count = 0;
+    *partial_resultset = 0;
 
     zebraSet = resultSetAdd(zh, setname, 1);
     if (!zebraSet)
 
     zebraSet = resultSetAdd(zh, setname, 1);
     if (!zebraSet)
@@ -173,7 +176,10 @@ ZEBRA_RES resultSetAddRPN (ZebraHandle zh, NMEM m, Z_RPNQuery *rpn,
 
     res = resultSetSearch(zh, zebraSet->nmem, zebraSet->rset_nmem,
                          rpn, zebraSet);
 
     res = resultSetSearch(zh, zebraSet->nmem, zebraSet->rset_nmem,
                          rpn, zebraSet);
-    zh->hits = zebraSet->hits;
+    *hits = zebraSet->hits;
+    if (zebraSet->estimated_hit_count)
+        *estimated_hit_count = 1;
+
     if (zebraSet->rset)
         zebraSet->rpn = rpn;
     zebraSet->locked = 0;
     if (zebraSet->rset)
         zebraSet->rpn = rpn;
     zebraSet->locked = 0;
@@ -273,6 +279,7 @@ ZebraSet resultSetAdd(ZebraHandle zh, const char *name, int ov)
     s->cache_position = 0;
     s->cache_rfd = 0;
     s->approx_limit = zh->approx_limit;
     s->cache_position = 0;
     s->cache_rfd = 0;
     s->approx_limit = zh->approx_limit;
+    s->estimated_hit_count = 0;
     return s;
 }
 
     return s;
 }
 
@@ -987,6 +994,7 @@ ZEBRA_RES resultSetRank(ZebraHandle zh, ZebraSet zebraSet,
     sort_info = zebraSet->sort_info;
     sort_info->num_entries = 0;
     zebraSet->hits = 0;
     sort_info = zebraSet->sort_info;
     sort_info->num_entries = 0;
     zebraSet->hits = 0;
+    zebraSet->estimated_hit_count = 0;
     rset_getterms(rset, 0, 0, &n);
     terms = (TERMID *) nmem_malloc(nmem, sizeof(*terms)*n);
     rset_getterms(rset, terms, n, &numTerms);
     rset_getterms(rset, 0, 0, &n);
     terms = (TERMID *) nmem_malloc(nmem, sizeof(*terms)*n);
     rset_getterms(rset, terms, n, &numTerms);
@@ -1023,7 +1031,10 @@ ZEBRA_RES resultSetRank(ZebraHandle zh, ZebraSet zebraSet,
            if (this_sys != psysno) 
            {   /* new record .. */
                if (rfd->counted_items > rset->hits_limit)
            if (this_sys != psysno) 
            {   /* new record .. */
                if (rfd->counted_items > rset->hits_limit)
+                {
+                    zebraSet->estimated_hit_count = 1;
                    break;
                    break;
+                }
                if (psysno)
                {   /* only if we did have a previous record */
                    score = (*rc->calc) (handle, psysno, pstaticrank,
                if (psysno)
                {   /* only if we did have a previous record */
                    score = (*rc->calc) (handle, psysno, pstaticrank,