New method result set method rs_hits that returns the number of
authorAdam Dickmeiss <adam@indexdata.dk>
Thu, 18 Dec 1997 10:54:24 +0000 (10:54 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Thu, 18 Dec 1997 10:54:24 +0000 (10:54 +0000)
hits in result-set (if known). The ranked result set returns real
number of hits but only when not combined with other operands.

14 files changed:
LICENSE.2
TODO
include/rset.h
include/rsrel.h
index/zrpn.c
rset/rsbool.c
rset/rsisam.c
rset/rsisamc.c
rset/rsm_or.c
rset/rsnull.c
rset/rsrel.c
rset/rssbool.c
rset/rstemp.c
tab/default.idx

index e2c8375..7733ace 100644 (file)
--- a/LICENSE.2
+++ b/LICENSE.2
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (c) 1995,1996 Index Data.
+ * Copyright (c) 1995-1998 Index Data.
  * 
  * All rights reserved.
  * 
  * 
  * All rights reserved.
  * 
diff --git a/TODO b/TODO
index fc1656c..80751be 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,4 +1,6 @@
-Zebra TODO $Id: TODO,v 1.2 1997-09-29 09:09:04 adam Exp $
+Zebra TODO $Id: TODO,v 1.3 1997-12-18 10:54:24 adam Exp $
+
+Make regx-filter thread safe.
 
 Better ranking in searches. Admin should be able specify initial
  weight to certain fields.
 
 Better ranking in searches. Admin should be able specify initial
  weight to certain fields.
index 2cfb23d..12f08f3 100644 (file)
@@ -4,7 +4,12 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: rset.h,v $
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: rset.h,v $
- * Revision 1.12  1997-09-05 15:30:03  adam
+ * Revision 1.13  1997-12-18 10:54:24  adam
+ * New method result set method rs_hits that returns the number of
+ * hits in result-set (if known). The ranked result set returns real
+ * number of hits but only when not combined with other operands.
+ *
+ * Revision 1.12  1997/09/05 15:30:03  adam
  * Changed prototype for chr_map_input - added const.
  * Added support for C++, headers uses extern "C" for public definitions.
  *
  * Changed prototype for chr_map_input - added const.
  * Added support for C++, headers uses extern "C" for public definitions.
  *
@@ -74,6 +79,7 @@ typedef struct rset_control
     void (*f_delete)(RSET ct);
     void (*f_rewind)(RSFD rfd);
     int (*f_count)(RSET ct);
     void (*f_delete)(RSET ct);
     void (*f_rewind)(RSFD rfd);
     int (*f_count)(RSET ct);
+    int (*f_hits)(RSET ct, void *oi);
     int (*f_read)(RSFD rfd, void *buf);
     int (*f_write)(RSFD rfd, const void *buf);
     int (*f_score)(RSFD rfd, int *score);
     int (*f_read)(RSFD rfd, void *buf);
     int (*f_write)(RSFD rfd, const void *buf);
     int (*f_score)(RSFD rfd, int *score);
@@ -95,27 +101,31 @@ typedef struct rset
 RSET rset_create(const rset_control *sel, void *parms);       /* parameters? */
 
 /* int rset_open(RSET rs, int wflag); */
 RSET rset_create(const rset_control *sel, void *parms);       /* parameters? */
 
 /* int rset_open(RSET rs, int wflag); */
-#define rset_open(rs, wflag) ((*(rs)->control->f_open)((rs), (wflag)))
+#define rset_open(rs, wflag) (*(rs)->control->f_open)((rs), (wflag))
 
 /* void rset_close(RSET rs); */
 
 /* void rset_close(RSET rs); */
-#define rset_close(rs, rfd) ((*(rs)->control->f_close)((rfd)))
+#define rset_close(rs, rfd) (*(rs)->control->f_close)(rfd)
 
 void rset_delete(RSET rs);
 
 /* void rset_rewind(RSET rs); */
 
 void rset_delete(RSET rs);
 
 /* void rset_rewind(RSET rs); */
-#define rset_rewind(rs, rfd) ((*(rs)->control->f_rewind)((rfd)))
+#define rset_rewind(rs, rfd) (*(rs)->control->f_rewind)((rfd))
 
 /* int rset_count(RSET rs); */
 
 /* int rset_count(RSET rs); */
-#define rset_count(rs) ((*(rs)->control->f_count)(rs))
+#define rset_count(rs) (*(rs)->control->f_count)(rs)
+
+/* int rset_hits (RSET) */
+#define rset_hits(rs) (*(rs)->control->f_hits)((rs), 0)
 
 /* int rset_read(RSET rs, void *buf); */
 
 /* int rset_read(RSET rs, void *buf); */
-#define rset_read(rs, fd, buf) ((*(rs)->control->f_read)((fd), (buf)))
+#define rset_read(rs, fd, buf) (*(rs)->control->f_read)((fd), (buf))
 
 /* int rset_write(RSET rs, const void *buf); */
 
 /* int rset_write(RSET rs, const void *buf); */
-#define rset_write(rs, fd, buf) ((*(rs)->control->f_write)((fd), (buf)))
+#define rset_write(rs, fd, buf) (*(rs)->control->f_write)((fd), (buf))
 
 /* int rset_score(RSET rs, int *buf); */
 
 /* int rset_score(RSET rs, int *buf); */
-#define rset_score(rs, fd, score) ((*(rs)->control->f_score)((fd), (score)))
+#define rset_score(rs, fd, score) (*(rs)->control->f_score)((fd), (score))
+
 
 /* int rset_type (RSET) */
 #define rset_type(rs) ((rs)->control->desc)
 
 /* int rset_type (RSET) */
 #define rset_type(rs) ((rs)->control->desc)
index 08d01f3..a847c09 100644 (file)
@@ -4,7 +4,12 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: rsrel.h,v $
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: rsrel.h,v $
- * Revision 1.5  1997-09-22 12:39:06  adam
+ * Revision 1.6  1997-12-18 10:54:24  adam
+ * New method result set method rs_hits that returns the number of
+ * hits in result-set (if known). The ranked result set returns real
+ * number of hits but only when not combined with other operands.
+ *
+ * Revision 1.5  1997/09/22 12:39:06  adam
  * Added get_pos method for the ranked result sets.
  *
  * Revision 1.4  1997/09/05 15:30:05  adam
  * Added get_pos method for the ranked result sets.
  *
  * Revision 1.4  1997/09/05 15:30:05  adam
@@ -33,6 +38,9 @@ extern "C" {
 
 extern const rset_control *rset_kind_relevance;
 
 
 extern const rset_control *rset_kind_relevance;
 
+#define RSREL_METHOD_A  1
+#define RSREL_METHOD_B  2
+
 typedef struct rset_relevance_parms
 {
     int     key_size;
 typedef struct rset_relevance_parms
 {
     int     key_size;
@@ -47,6 +55,8 @@ typedef struct rset_relevance_parms
     int     no_terms;
     int     *term_no;
     int     (*get_pos)(const void *p);
     int     no_terms;
     int     *term_no;
     int     (*get_pos)(const void *p);
+
+    int     method;
 } rset_relevance_parms;
 
 #ifdef __cplusplus
 } rset_relevance_parms;
 
 #ifdef __cplusplus
index 0101904..8ede147 100644 (file)
@@ -4,7 +4,12 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: zrpn.c,v $
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: zrpn.c,v $
- * Revision 1.70  1997-10-31 12:34:43  adam
+ * Revision 1.71  1997-12-18 10:54:24  adam
+ * New method result set method rs_hits that returns the number of
+ * hits in result-set (if known). The ranked result set returns real
+ * number of hits but only when not combined with other operands.
+ *
+ * Revision 1.70  1997/10/31 12:34:43  adam
  * Changed a few log statements.
  *
  * Revision 1.69  1997/10/29 12:05:02  adam
  * Changed a few log statements.
  *
  * Revision 1.69  1997/10/29 12:05:02  adam
@@ -910,12 +915,13 @@ static RSET rpn_search_APT_relevance (ZServerInfo *zi,
     int r;
 
     parms.key_size = sizeof(struct it_key);
     int r;
 
     parms.key_size = sizeof(struct it_key);
-    parms.max_rec = 1000;
+    parms.max_rec = 200;
     parms.cmp = key_compare_it;
     parms.get_pos = key_get_pos;
     parms.is = zi->isam;
     parms.isc = zi->isamc;
     parms.no_terms = 0;
     parms.cmp = key_compare_it;
     parms.get_pos = key_get_pos;
     parms.is = zi->isam;
     parms.isc = zi->isamc;
     parms.no_terms = 0;
+    parms.method = RSREL_METHOD_A;
 
     if (zapt->term->which != Z_Term_general)
     {
 
     if (zapt->term->which != Z_Term_general)
     {
@@ -1398,6 +1404,7 @@ static void count_set (RSET r, int *count)
     RSFD rfd;
 
     logf (LOG_DEBUG, "count_set");
     RSFD rfd;
 
     logf (LOG_DEBUG, "count_set");
+    
     *count = 0;
     rfd = rset_open (r, RSETF_READ|RSETF_SORT_SYSNO);
     while (rset_read (r, rfd, &key))
     *count = 0;
     rfd = rset_open (r, RSETF_READ|RSETF_SORT_SYSNO);
     while (rset_read (r, rfd, &key))
@@ -1417,6 +1424,7 @@ int rpn_search (ZServerInfo *zi,
                 Z_RPNQuery *rpn, int num_bases, char **basenames, 
                 const char *setname, int *hits)
 {
                 Z_RPNQuery *rpn, int num_bases, char **basenames, 
                 const char *setname, int *hits)
 {
+    int i;
     RSET rset;
     oident *attrset;
     oid_value attributeSet;
     RSET rset;
     oident *attrset;
     oid_value attributeSet;
@@ -1433,7 +1441,9 @@ int rpn_search (ZServerInfo *zi,
     if (!rset)
         return zi->errCode;
     if (rset_is_volatile(rset))
     if (!rset)
         return zi->errCode;
     if (rset_is_volatile(rset))
-        count_set_save(zi, &rset,hits);
+        count_set_save(zi, &rset, hits);
+    else if ((i = rset_hits (rset)) >= 0)
+       *hits = i;
     else
         count_set (rset, hits);
     resultSetAdd (zi, setname, 1, rset);
     else
         count_set (rset, hits);
     resultSetAdd (zi, setname, 1, rset);
index 883125c..568a937 100644 (file)
@@ -4,7 +4,12 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: rsbool.c,v $
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: rsbool.c,v $
- * Revision 1.12  1997-10-31 12:37:01  adam
+ * Revision 1.13  1997-12-18 10:54:24  adam
+ * New method result set method rs_hits that returns the number of
+ * hits in result-set (if known). The ranked result set returns real
+ * number of hits but only when not combined with other operands.
+ *
+ * Revision 1.12  1997/10/31 12:37:01  adam
  * Code calls xfree() instead of free().
  *
  * Revision 1.11  1997/09/09 13:38:15  adam
  * Code calls xfree() instead of free().
  *
  * Revision 1.11  1997/09/09 13:38:15  adam
@@ -65,6 +70,7 @@ static void r_close (RSFD rfd);
 static void r_delete (RSET ct);
 static void r_rewind (RSFD rfd);
 static int r_count (RSET ct);
 static void r_delete (RSET ct);
 static void r_rewind (RSFD rfd);
 static int r_count (RSET ct);
+static int r_hits (RSET ct, void *oi);
 static int r_read_and (RSFD rfd, void *buf);
 static int r_read_or (RSFD rfd, void *buf);
 static int r_read_not (RSFD rfd, void *buf);
 static int r_read_and (RSFD rfd, void *buf);
 static int r_read_or (RSFD rfd, void *buf);
 static int r_read_not (RSFD rfd, void *buf);
@@ -80,6 +86,7 @@ static const rset_control control_and =
     r_delete,
     r_rewind,
     r_count,
     r_delete,
     r_rewind,
     r_count,
+    r_hits,
     r_read_and,
     r_write,
     r_score
     r_read_and,
     r_write,
     r_score
@@ -94,6 +101,7 @@ static const rset_control control_or =
     r_delete,
     r_rewind,
     r_count,
     r_delete,
     r_rewind,
     r_count,
+    r_hits,
     r_read_or,
     r_write,
     r_score
     r_read_or,
     r_write,
     r_score
@@ -108,6 +116,7 @@ static const rset_control control_not =
     r_delete,
     r_rewind,
     r_count,
     r_delete,
     r_rewind,
     r_count,
+    r_hits,
     r_read_not,
     r_write,
     r_score
     r_read_not,
     r_write,
     r_score
@@ -225,6 +234,11 @@ static int r_count (RSET ct)
     return 0;
 }
 
     return 0;
 }
 
+static int r_hits (RSET ct, void *oi)
+{
+    return -1;
+}
+
 static int r_read_and (RSFD rfd, void *buf)
 {
     struct rset_bool_rfd *p = rfd;
 static int r_read_and (RSFD rfd, void *buf)
 {
     struct rset_bool_rfd *p = rfd;
index 8c2ddac..b2ad821 100644 (file)
@@ -4,7 +4,12 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: rsisam.c,v $
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: rsisam.c,v $
- * Revision 1.16  1997-10-31 12:37:01  adam
+ * Revision 1.17  1997-12-18 10:54:25  adam
+ * New method result set method rs_hits that returns the number of
+ * hits in result-set (if known). The ranked result set returns real
+ * number of hits but only when not combined with other operands.
+ *
+ * Revision 1.16  1997/10/31 12:37:01  adam
  * Code calls xfree() instead of free().
  *
  * Revision 1.15  1996/10/29 13:55:22  adam
  * Code calls xfree() instead of free().
  *
  * Revision 1.15  1996/10/29 13:55:22  adam
@@ -71,6 +76,7 @@ static void r_close (RSFD rfd);
 static void r_delete (RSET ct);
 static void r_rewind (RSFD rfd);
 static int r_count (RSET ct);
 static void r_delete (RSET ct);
 static void r_rewind (RSFD rfd);
 static int r_count (RSET ct);
+static int r_hits (RSET ct, void *oi);
 static int r_read (RSFD rfd, void *buf);
 static int r_write (RSFD rfd, const void *buf);
 static int r_score (RSFD rfd, int *score);
 static int r_read (RSFD rfd, void *buf);
 static int r_write (RSFD rfd, const void *buf);
 static int r_score (RSFD rfd, int *score);
@@ -84,6 +90,7 @@ static const rset_control control =
     r_delete,
     r_rewind,
     r_count,
     r_delete,
     r_rewind,
     r_count,
+    r_hits,
     r_read,
     r_write,
     r_score
     r_read,
     r_write,
     r_score
@@ -173,6 +180,11 @@ static int r_count (RSET ct)
     return 0;
 }
 
     return 0;
 }
 
+static int r_hits (RSET ct, void *oi)
+{
+    return -1;
+}
+
 static int r_read (RSFD rfd, void *buf)
 {
     return is_readkey( ((struct rset_ispt_info*) rfd)->pt, buf);
 static int r_read (RSFD rfd, void *buf)
 {
     return is_readkey( ((struct rset_ispt_info*) rfd)->pt, buf);
index b67839f..fb429ad 100644 (file)
@@ -4,7 +4,12 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: rsisamc.c,v $
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: rsisamc.c,v $
- * Revision 1.3  1997-10-31 12:37:01  adam
+ * Revision 1.4  1997-12-18 10:54:25  adam
+ * New method result set method rs_hits that returns the number of
+ * hits in result-set (if known). The ranked result set returns real
+ * number of hits but only when not combined with other operands.
+ *
+ * Revision 1.3  1997/10/31 12:37:01  adam
  * Code calls xfree() instead of free().
  *
  * Revision 1.2  1996/11/08 11:15:57  adam
  * Code calls xfree() instead of free().
  *
  * Revision 1.2  1996/11/08 11:15:57  adam
@@ -27,6 +32,7 @@ static void r_close (RSFD rfd);
 static void r_delete (RSET ct);
 static void r_rewind (RSFD rfd);
 static int r_count (RSET ct);
 static void r_delete (RSET ct);
 static void r_rewind (RSFD rfd);
 static int r_count (RSET ct);
+static int r_hits (RSET ct, void *oi);
 static int r_read (RSFD rfd, void *buf);
 static int r_write (RSFD rfd, const void *buf);
 static int r_score (RSFD rfd, int *score);
 static int r_read (RSFD rfd, void *buf);
 static int r_write (RSFD rfd, const void *buf);
 static int r_score (RSFD rfd, int *score);
@@ -40,6 +46,7 @@ static const rset_control control =
     r_delete,
     r_rewind,
     r_count,
     r_delete,
     r_rewind,
     r_count,
+    r_hits,
     r_read,
     r_write,
     r_score
     r_read,
     r_write,
     r_score
@@ -129,6 +136,11 @@ static int r_count (RSET ct)
     return 0;
 }
 
     return 0;
 }
 
+static int r_hits (RSET ct, void *oi)
+{
+    return -1;
+}
+
 static int r_read (RSFD rfd, void *buf)
 {
     return isc_pp_read( ((struct rset_pp_info*) rfd)->pt, buf);
 static int r_read (RSFD rfd, void *buf)
 {
     return isc_pp_read( ((struct rset_pp_info*) rfd)->pt, buf);
index 2121a88..aa61ba3 100644 (file)
@@ -4,7 +4,12 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: rsm_or.c,v $
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: rsm_or.c,v $
- * Revision 1.4  1997-10-31 12:37:55  adam
+ * Revision 1.5  1997-12-18 10:54:25  adam
+ * New method result set method rs_hits that returns the number of
+ * hits in result-set (if known). The ranked result set returns real
+ * number of hits but only when not combined with other operands.
+ *
+ * Revision 1.4  1997/10/31 12:37:55  adam
  * Code calls xfree() instead of free().
  *
  * Revision 1.3  1997/09/09 13:38:16  adam
  * Code calls xfree() instead of free().
  *
  * Revision 1.3  1997/09/09 13:38:16  adam
@@ -35,6 +40,7 @@ static void r_close (RSFD rfd);
 static void r_delete (RSET ct);
 static void r_rewind (RSFD rfd);
 static int r_count (RSET ct);
 static void r_delete (RSET ct);
 static void r_rewind (RSFD rfd);
 static int r_count (RSET ct);
+static int r_hits (RSET ct, void *oi);
 static int r_read (RSFD rfd, void *buf);
 static int r_write (RSFD rfd, const void *buf);
 static int r_score (RSFD rfd, int *score);
 static int r_read (RSFD rfd, void *buf);
 static int r_write (RSFD rfd, const void *buf);
 static int r_score (RSFD rfd, int *score);
@@ -48,6 +54,7 @@ static const rset_control control =
     r_delete,
     r_rewind,
     r_count,
     r_delete,
     r_rewind,
     r_count,
+    r_hits,
     r_read,
     r_write,
     r_score
     r_read,
     r_write,
     r_score
@@ -276,6 +283,11 @@ static int r_count (RSET ct)
     return 0;
 }
 
     return 0;
 }
 
+static int r_hits (RSET ct, void *oi)
+{
+    return -1;
+}
+
 static int r_read (RSFD rfd, void *buf)
 {
     struct trunc_info *ti = ((struct rset_mor_rfd *) rfd)->ti;
 static int r_read (RSFD rfd, void *buf)
 {
     struct trunc_info *ti = ((struct rset_mor_rfd *) rfd)->ti;
index 79613d8..5ba6a4f 100644 (file)
@@ -4,7 +4,12 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: rsnull.c,v $
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: rsnull.c,v $
- * Revision 1.8  1996-10-29 13:55:24  adam
+ * Revision 1.9  1997-12-18 10:54:25  adam
+ * New method result set method rs_hits that returns the number of
+ * hits in result-set (if known). The ranked result set returns real
+ * number of hits but only when not combined with other operands.
+ *
+ * Revision 1.8  1996/10/29 13:55:24  adam
  * Include of zebrautl.h instead of alexutil.h.
  *
  * Revision 1.7  1995/12/11 09:15:25  adam
  * Include of zebrautl.h instead of alexutil.h.
  *
  * Revision 1.7  1995/12/11 09:15:25  adam
@@ -49,6 +54,7 @@ static void r_close (RSFD rfd);
 static void r_delete (RSET ct);
 static void r_rewind (RSFD rfd);
 static int r_count (RSET ct);
 static void r_delete (RSET ct);
 static void r_rewind (RSFD rfd);
 static int r_count (RSET ct);
+static int r_hits (RSET ct, void *oi);
 static int r_read (RSFD rfd, void *buf);
 static int r_write (RSFD rfd, const void *buf);
 static int r_score (RSFD rfd, int *score);
 static int r_read (RSFD rfd, void *buf);
 static int r_write (RSFD rfd, const void *buf);
 static int r_score (RSFD rfd, int *score);
@@ -62,6 +68,7 @@ static const rset_control control =
     r_delete,
     r_rewind,
     r_count,
     r_delete,
     r_rewind,
     r_count,
+    r_hits,
     r_read,
     r_write,
     r_score
     r_read,
     r_write,
     r_score
@@ -103,6 +110,11 @@ static int r_count (RSET ct)
     return 0;
 }
 
     return 0;
 }
 
+static int r_hits (RSET ct, void *oi)
+{
+    return 0;
+}
+
 static int r_read (RSFD rfd, void *buf)
 {
     return 0;
 static int r_read (RSFD rfd, void *buf)
 {
     return 0;
index d344b01..16ed04c 100644 (file)
@@ -4,7 +4,12 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: rsrel.c,v $
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: rsrel.c,v $
- * Revision 1.21  1997-11-18 10:05:08  adam
+ * Revision 1.22  1997-12-18 10:54:25  adam
+ * New method result set method rs_hits that returns the number of
+ * hits in result-set (if known). The ranked result set returns real
+ * number of hits but only when not combined with other operands.
+ *
+ * Revision 1.21  1997/11/18 10:05:08  adam
  * Changed character map facility so that admin can specify character
  * mapping files for each register type, w, p, etc.
  *
  * Changed character map facility so that admin can specify character
  * mapping files for each register type, w, p, etc.
  *
@@ -92,6 +97,7 @@ static void r_close (RSFD rfd);
 static void r_delete (RSET ct);
 static void r_rewind (RSFD rfd);
 static int r_count (RSET ct);
 static void r_delete (RSET ct);
 static void r_rewind (RSFD rfd);
 static int r_count (RSET ct);
+static int r_hits (RSET ct, void *oi);
 static int r_read (RSFD rfd, void *buf);
 static int r_write (RSFD rfd, const void *buf);
 static int r_score (RSFD rfd, int *score);
 static int r_read (RSFD rfd, void *buf);
 static int r_write (RSFD rfd, const void *buf);
 static int r_score (RSFD rfd, int *score);
@@ -105,6 +111,7 @@ static const rset_control control =
     r_delete,
     r_rewind,
     r_count,
     r_delete,
     r_rewind,
     r_count,
+    r_hits,
     r_read,
     r_write,
     r_score
     r_read,
     r_write,
     r_score
@@ -116,12 +123,13 @@ struct rset_rel_info {
     int     key_size;
     int     max_rec;
     int     no_rec;
     int     key_size;
     int     max_rec;
     int     no_rec;
+    int     hits;                       /* hits count */
     int     (*cmp)(const void *p1, const void *p2);
     int     (*get_pos)(const void *p);
     char    *key_buf;                   /* key buffer */
     float   *score_buf;                 /* score buffer */
     int     *sort_idx;                  /* score sorted index */
     int     (*cmp)(const void *p1, const void *p2);
     int     (*get_pos)(const void *p);
     char    *key_buf;                   /* key buffer */
     float   *score_buf;                 /* score buffer */
     int     *sort_idx;                  /* score sorted index */
-    int     *sysno_idx;                /* sysno sorted index (ring buffer) */
+    int     *sysno_idx;                 /* sysno sorted index (ring buffer) */
     struct rset_rel_rfd *rfd_list;
 };
 
     struct rset_rel_rfd *rfd_list;
 };
 
@@ -137,6 +145,7 @@ static void add_rec (struct rset_rel_info *info, double score, void *key)
 {
     int idx, i, j;
 
 {
     int idx, i, j;
 
+    (info->hits)++;
     for (i = 0; i<info->no_rec; i++)
     {
         idx = info->sort_idx[i];
     for (i = 0; i<info->no_rec; i++)
     {
         idx = info->sort_idx[i];
@@ -190,13 +199,12 @@ static void relevance (struct rset_rel_info *info, rset_relevance_parms *parms)
     int  *isam_r;
     int  *max_tf, *tf;
 
     int  *isam_r;
     int  *max_tf, *tf;
 
-#if NEW_RANKING
     int  *pos_tf = NULL;
     int score_sum = 0;
     int no_occur = 0;
     char *isam_prev_buf = NULL;
     int fact1, fact2;
     int  *pos_tf = NULL;
     int score_sum = 0;
     int no_occur = 0;
     char *isam_prev_buf = NULL;
     int fact1, fact2;
-#endif
+
     ISPT *isam_pt = NULL;
     ISAMC_PP *isamc_pp = NULL;
     int i;
     ISPT *isam_pt = NULL;
     ISAMC_PP *isamc_pp = NULL;
     int i;
@@ -236,126 +244,132 @@ static void relevance (struct rset_rel_info *info, rset_relevance_parms *parms)
         }
         logf (LOG_DEBUG, "max tf %d = %d", i, max_tf[i]);
     }
         }
         logf (LOG_DEBUG, "max tf %d = %d", i, max_tf[i]);
     }
-#if NEW_RANKING
-    while (1)
+    switch (parms->method)
     {
     {
-       int r, min = -1;
-       int pos = 0;
-        for (i = 0; i<parms->no_isam_positions; i++)
-            if (isam_r[i] && 
-               (min < 0 ||
-                (r = (*parms->cmp)(isam_buf[i], isam_buf[min])) < 1))
-                min = i;
-       if (!isam_prev_buf)
+    case RSREL_METHOD_B:
+       while (1)
        {
        {
-           pos_tf = xmalloc (sizeof(*pos_tf) * parms->no_isam_positions);
-           isam_prev_buf = xmalloc (info->key_size);
-           fact1 = 100000/parms->no_isam_positions;
-           fact2 = 100000/(parms->no_isam_positions*parms->no_isam_positions);
-           
-           no_occur = score_sum = 0;
-           memcpy (isam_prev_buf, isam_buf[min], info->key_size);
+           int r, min = -1;
+           int pos = 0;
+           for (i = 0; i<parms->no_isam_positions; i++)
+               if (isam_r[i] && 
+                   (min < 0 ||
+                    (r = (*parms->cmp)(isam_buf[i], isam_buf[min])) < 1))
+                   min = i;
+           if (!isam_prev_buf)
+           {
+               pos_tf = xmalloc (sizeof(*pos_tf) * parms->no_isam_positions);
+               isam_prev_buf = xmalloc (info->key_size);
+               fact1 = 100000/parms->no_isam_positions;
+               fact2 = 100000/
+                   (parms->no_isam_positions*parms->no_isam_positions);
+               
+               no_occur = score_sum = 0;
+               memcpy (isam_prev_buf, isam_buf[min], info->key_size);
+               for (i = 0; i<parms->no_isam_positions; i++)
+                   pos_tf[i] = -10;
+           }
+           else if (min < 0 ||
+                    (*parms->cmp)(isam_buf[min], isam_prev_buf) > 1)
+           {
+               logf (LOG_LOG, "final occur = %d ratio=%d",
+                     no_occur, score_sum / no_occur);
+               add_rec (info, score_sum / (10000.0*no_occur), isam_prev_buf);
+               if (min < 0)
+                   break;
+               no_occur = score_sum = 0;
+               memcpy (isam_prev_buf, isam_buf[min], info->key_size);
+               for (i = 0; i<parms->no_isam_positions; i++)
+                   pos_tf[i] = -10;
+           }
+           pos = (*parms->get_pos)(isam_buf[min]);
+           logf (LOG_LOG, "pos=%d", pos);
            for (i = 0; i<parms->no_isam_positions; i++)
            for (i = 0; i<parms->no_isam_positions; i++)
-               pos_tf[i] = -10;
-       }
-       else if (min < 0 ||
-                (*parms->cmp)(isam_buf[min], isam_prev_buf) > 1)
+           {
+               int d = pos - pos_tf[i];
+               
+               no_occur++;
+               if (pos_tf[i] < 0 && i != min)
+                   continue;
+               if (d < 10)
+                   d = 10;
+               if (i == min)
+                   score_sum += fact2 / d;
+               else
+                   score_sum += fact1 / d;
+           }
+           pos_tf[min] = pos;
+           logf (LOG_LOG, "score_sum = %d", score_sum);
+           i = min;
+           if (isam_pt)
+               isam_r[i] = is_readkey (isam_pt[i], isam_buf[i]);
+           else if (isamc_pp)
+               isam_r[i] = isc_pp_read (isamc_pp[i], isam_buf[i]);
+       } /* while */
+       xfree (isam_prev_buf);
+       xfree (pos_tf);
+       break;
+    case RSREL_METHOD_A:
+       while (1)
        {
        {
-           logf (LOG_LOG, "final occur = %d ratio=%d",
-                 no_occur, score_sum / no_occur);
-           add_rec (info, score_sum / (10000.0*no_occur), isam_prev_buf);
+           int min = -1, i, r;
+           double score;
+           int co_oc, last_term;    /* Number of co-occurrences */
+           
+           last_term = -1;
+           /* find min with lowest sysno */
+           for (i = 0; i<parms->no_isam_positions; i++)
+           {
+               if (isam_r[i] && 
+                   (min < 0
+                    || (r = (*parms->cmp)(isam_buf[i], isam_buf[min])) < 2))
+               {
+                   min = i;
+                   co_oc = 1;
+               }
+               else if (!r && last_term != parms->term_no[i]) 
+                   co_oc++;  /* new occurrence */
+               last_term = parms->term_no[i];
+           }
+           
            if (min < 0)
                break;
            if (min < 0)
                break;
-           no_occur = score_sum = 0;
-           memcpy (isam_prev_buf, isam_buf[min], info->key_size);
+           memcpy (isam_tmp_buf, isam_buf[min], info->key_size);
+           /* calculate for all with those sysno */
+           for (i = 0; i < parms->no_terms; i++)
+               tf[i] = 0;
            for (i = 0; i<parms->no_isam_positions; i++)
            for (i = 0; i<parms->no_isam_positions; i++)
-               pos_tf[i] = -10;
-       }
-       pos = (*parms->get_pos)(isam_buf[min]);
-       logf (LOG_LOG, "pos=%d", pos);
-       for (i = 0; i<parms->no_isam_positions; i++)
-       {
-           int d = pos - pos_tf[i];
-
-           no_occur++;
-           if (pos_tf[i] < 0 && i != min)
-               continue;
-           if (d < 10)
-               d = 10;
-           if (i == min)
-               score_sum += fact2 / d;
-           else
-               score_sum += fact1 / d;
-       }
-       pos_tf[min] = pos;
-       logf (LOG_LOG, "score_sum = %d", score_sum);
-       i = min;
-       if (isam_pt)
-           isam_r[i] = is_readkey (isam_pt[i], isam_buf[i]);
-       else if (isamc_pp)
-           isam_r[i] = isc_pp_read (isamc_pp[i], isam_buf[i]);
-    }
-    xfree (isam_prev_buf);
-    xfree (pos_tf);
-#else
-    while (1)
-    {
-        int min = -1, i, r;
-        double score;
-       int co_oc, last_term;    /* Number of co-occurrences */
-
-       last_term = -1;
-        /* find min with lowest sysno */
-        for (i = 0; i<parms->no_isam_positions; i++)
-       {
-            if (isam_r[i] && 
-               (min < 0 || (r = (*parms->cmp)(isam_buf[i], isam_buf[min])) < 2))
            {
            {
-                min = i;
-               co_oc = 1;
+               int r;
+               
+               if (isam_r[i])
+                   r = (*parms->cmp)(isam_buf[i], isam_tmp_buf);
+               else 
+                   r = 2;
+               if (r <= 1 && r >= -1)
+               {
+                   do
+                   {
+                       tf[parms->term_no[i]]++;
+                       if (isam_pt)
+                           isam_r[i] = is_readkey (isam_pt[i], isam_buf[i]);
+                       else if (isamc_pp)
+                           isam_r[i] = isc_pp_read (isamc_pp[i], isam_buf[i]);
+                   } while (isam_r[i] && 
+                            (*parms->cmp)(isam_buf[i], isam_tmp_buf) <= 1);
+               }
            }
            }
-           else if (!r && last_term != parms->term_no[i]) /* new occurrence */
-                co_oc++;
-           last_term = parms->term_no[i];
-       }
-        
-        if (min < 0)
-            break;
-        memcpy (isam_tmp_buf, isam_buf[min], info->key_size);
-        /* calculate for all with those sysno */
-       for (i = 0; i < parms->no_terms; i++)
-           tf[i] = 0;
-        for (i = 0; i<parms->no_isam_positions; i++)
-        {
-            int r;
-            
-            if (isam_r[i])
-                r = (*parms->cmp)(isam_buf[i], isam_tmp_buf);
-            else 
-                r = 2;
-           if (r <= 1 && r >= -1)
-            {
-                do
-                {
-                    tf[parms->term_no[i]]++;
-                    if (isam_pt)
-                        isam_r[i] = is_readkey (isam_pt[i], isam_buf[i]);
-                    else if (isamc_pp)
-                        isam_r[i] = isc_pp_read (isamc_pp[i], isam_buf[i]);
-                } while (isam_r[i] && 
-                         (*parms->cmp)(isam_buf[i], isam_tmp_buf) <= 1);
-            }
-        }
-        /* calculate relevance value */
-        score = 0.0;
-        for (i = 0; i<parms->no_terms; i++)
-            if (tf[i])
-               score += SCORE_SHOW + SCORE_COOC*co_oc/parms->no_terms +
-                   SCORE_DYN*tf[i]/max_tf[i];
-        /* if value is in the top score, then save it - don't emit yet */
-        add_rec (info, score/parms->no_terms, isam_tmp_buf);
-    }
-#endif
+           /* calculate relevance value */
+           score = 0.0;
+           for (i = 0; i<parms->no_terms; i++)
+               if (tf[i])
+                   score += SCORE_SHOW + SCORE_COOC*co_oc/parms->no_terms +
+                       SCORE_DYN*tf[i]/max_tf[i];
+           /* if value is in the top score, then save it - don't emit yet */
+           add_rec (info, score/parms->no_terms, isam_tmp_buf);
+       } /* while */
+       break;
+    } /* switch */
     for (i = 0; i<info->no_rec; i++)
         info->sysno_idx[i] = i;
     qsort_info = info;
     for (i = 0; i<info->no_rec; i++)
         info->sysno_idx[i] = i;
     qsort_info = info;
@@ -397,6 +411,7 @@ static void *r_create (const struct rset_control *sel, void *parms,
     info->sort_idx = xmalloc (sizeof(*info->sort_idx) * info->max_rec);
     info->sysno_idx = xmalloc (sizeof(*info->sysno_idx) * info->max_rec);
     info->no_rec = 0;
     info->sort_idx = xmalloc (sizeof(*info->sort_idx) * info->max_rec);
     info->sysno_idx = xmalloc (sizeof(*info->sysno_idx) * info->max_rec);
     info->no_rec = 0;
+    info->hits = 0;
     info->rfd_list = NULL;
 
     relevance (info, r_parms);
     info->rfd_list = NULL;
 
     relevance (info, r_parms);
@@ -468,6 +483,13 @@ static int r_count (RSET ct)
     return info->no_rec;
 }
 
     return info->no_rec;
 }
 
+static int r_hits (RSET ct, void *oi)
+{
+    struct rset_rel_info *info = ct->buf;
+
+    return info->hits;
+}
+
 static int r_read (RSFD rfd, void *buf)
 {
     struct rset_rel_rfd *p = rfd;
 static int r_read (RSFD rfd, void *buf)
 {
     struct rset_rel_rfd *p = rfd;
index c640952..d34f3c4 100644 (file)
@@ -4,7 +4,12 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: rssbool.c,v $
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: rssbool.c,v $
- * Revision 1.5  1997-09-09 13:38:16  adam
+ * Revision 1.6  1997-12-18 10:54:25  adam
+ * New method result set method rs_hits that returns the number of
+ * hits in result-set (if known). The ranked result set returns real
+ * number of hits but only when not combined with other operands.
+ *
+ * Revision 1.5  1997/09/09 13:38:16  adam
  * Partial port to WIN95/NT.
  *
  * Revision 1.4  1996/10/29 13:55:27  adam
  * Partial port to WIN95/NT.
  *
  * Revision 1.4  1996/10/29 13:55:27  adam
@@ -44,6 +49,7 @@ static void r_close (RSFD rfd);
 static void r_delete (RSET ct);
 static void r_rewind (RSFD rfd);
 static int r_count (RSET ct);
 static void r_delete (RSET ct);
 static void r_rewind (RSFD rfd);
 static int r_count (RSET ct);
+static int r_hits (RSET ct, void *oi);
 static int r_read (RSFD rfd, void *buf);
 static int r_write (RSFD rfd, const void *buf);
 static int r_score (RSFD rfd, int *score);
 static int r_read (RSFD rfd, void *buf);
 static int r_write (RSFD rfd, const void *buf);
 static int r_score (RSFD rfd, int *score);
@@ -57,6 +63,7 @@ static const rset_control control_sand =
     r_delete,
     r_rewind,
     r_count,
     r_delete,
     r_rewind,
     r_count,
+    r_hits,
     r_read,
     r_write,
     r_score
     r_read,
     r_write,
     r_score
@@ -71,6 +78,7 @@ static const rset_control control_sor =
     r_delete,
     r_rewind,
     r_count,
     r_delete,
     r_rewind,
     r_count,
+    r_hits,
     r_read,
     r_write,
     r_score
     r_read,
     r_write,
     r_score
@@ -85,6 +93,7 @@ static const rset_control control_snot =
     r_delete,
     r_rewind,
     r_count,
     r_delete,
     r_rewind,
     r_count,
+    r_hits,
     r_read,
     r_write,
     r_score
     r_read,
     r_write,
     r_score
@@ -421,6 +430,11 @@ static int r_count (RSET ct)
     return info->key_no;
 }
 
     return info->key_no;
 }
 
+static int r_hits (RSET ct, void *oi)
+{
+    return -1;
+}
+
 static int r_read (RSFD rfd, void *buf)
 {
     struct rset_bool_rfd *p = rfd;
 static int r_read (RSFD rfd, void *buf)
 {
     struct rset_bool_rfd *p = rfd;
index 21b0e79..f43e5e2 100644 (file)
@@ -4,7 +4,12 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: rstemp.c,v $
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: rstemp.c,v $
- * Revision 1.22  1997-10-31 12:38:12  adam
+ * Revision 1.23  1997-12-18 10:54:25  adam
+ * New method result set method rs_hits that returns the number of
+ * hits in result-set (if known). The ranked result set returns real
+ * number of hits but only when not combined with other operands.
+ *
+ * Revision 1.22  1997/10/31 12:38:12  adam
  * Bug fix: added missing xfree() call.
  *
  * Revision 1.21  1997/09/17 12:19:23  adam
  * Bug fix: added missing xfree() call.
  *
  * Revision 1.21  1997/09/17 12:19:23  adam
@@ -102,6 +107,7 @@ static void r_close (RSFD rfd);
 static void r_delete (RSET ct);
 static void r_rewind (RSFD rfd);
 static int r_count (RSET ct);
 static void r_delete (RSET ct);
 static void r_rewind (RSFD rfd);
 static int r_count (RSET ct);
+static int r_hits (RSET ct, void *oi);
 static int r_read (RSFD rfd, void *buf);
 static int r_write (RSFD rfd, const void *buf);
 static int r_score (RSFD rfd, int *score);
 static int r_read (RSFD rfd, void *buf);
 static int r_write (RSFD rfd, const void *buf);
 static int r_score (RSFD rfd, int *score);
@@ -115,6 +121,7 @@ static const rset_control control =
     r_delete,
     r_rewind,
     r_count,
     r_delete,
     r_rewind,
     r_count,
+    r_hits,
     r_read,
     r_write,
     r_score
     r_read,
     r_write,
     r_score
@@ -133,6 +140,7 @@ struct rset_temp_info {
     size_t  pos_buf;       /* position of first byte in window */
     size_t  pos_border;    /* position of last byte+1 in window */
     int     dirty;         /* window is dirty */
     size_t  pos_buf;       /* position of first byte in window */
     size_t  pos_border;    /* position of last byte+1 in window */
     int     dirty;         /* window is dirty */
+    int     hits;          /* no of hits */
     char   *temp_path;
 };
 
     char   *temp_path;
 };
 
@@ -156,6 +164,7 @@ static void *r_create(const struct rset_control *sel, void *parms, int *flags)
     info->pos_end = 0;
     info->pos_buf = 0;
     info->dirty = 0;
     info->pos_end = 0;
     info->pos_buf = 0;
     info->dirty = 0;
+    info->hits = -1;
     if (!temp_parms->temp_path)
        info->temp_path = NULL;
     else
     if (!temp_parms->temp_path)
        info->temp_path = NULL;
     else
@@ -325,6 +334,13 @@ static int r_count (RSET ct)
     return info->pos_end / info->key_size;
 }
 
     return info->pos_end / info->key_size;
 }
 
+static int r_hits (RSET ct, void *oi)
+{
+    struct rset_temp_info *info = ct->buf;
+
+    return info->hits;
+}
+
 static int r_read (RSFD rfd, void *buf)
 {
     struct rset_temp_info *info = ((struct rset_temp_rfd*)rfd)->info;
 static int r_read (RSFD rfd, void *buf)
 {
     struct rset_temp_info *info = ((struct rset_temp_rfd*)rfd)->info;
index c908a85..e030001 100644 (file)
@@ -1,19 +1,24 @@
+# Traditional word index
 index w
 completeness 0
 charmap string.chr
 
 index w
 completeness 0
 charmap string.chr
 
+# Phrase index
 index p
 completeness 1
 charmap string.chr
 
 index p
 completeness 1
 charmap string.chr
 
+# URX (URL) index
 index u
 completeness 0
 charmap urx.chr
 
 index u
 completeness 0
 charmap urx.chr
 
+# Numeric index (integer only)
 index n
 completeness 0
 charmap numeric.chr
 
 index n
 completeness 0
 charmap numeric.chr
 
+# Null map index (no mapping at all)
 index 0
 completeness 0
 charmap @
 index 0
 completeness 0
 charmap @