From: Heikki Levanto Date: Fri, 30 Jan 2004 11:43:40 +0000 (+0000) Subject: Added forward functions to rsbool, and a few tests for them. X-Git-Tag: ZEBRA.1.3.16~133 X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=commitdiff_plain;h=7ead84f2bb444f7a420b1d1c8e8c47aec61f156c Added forward functions to rsbool, and a few tests for them. --- diff --git a/include/rset.h b/include/rset.h index 172ce37..cd8312a 100644 --- a/include/rset.h +++ b/include/rset.h @@ -1,4 +1,4 @@ -/* $Id: rset.h,v 1.20 2004-01-16 18:04:33 heikki Exp $ +/* $Id: rset.h,v 1.21 2004-01-30 11:43:40 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -43,13 +43,17 @@ struct rset_control void (*f_close)(RSFD rfd); void (*f_delete)(RSET ct); void (*f_rewind)(RSFD rfd); - int (*f_forward)(RSFD rfd, void *buf, const void *untilbuf); + int (*f_forward)(RSET ct, RSFD rfd, void *buf, int *term_index, + int (*cmpfunc)(const void *p1, const void *p2), + const void *untilbuf); int (*f_count)(RSET ct); int (*f_read)(RSFD rfd, void *buf, int *term_index); int (*f_write)(RSFD rfd, const void *buf); }; -int rset_default_forward(RSFD rfd, void *buf, const void *untilbuf); +int rset_default_forward(RSET ct, RSFD rfd, void *buf, int *term_index, + int (*cmpfunc)(const void *p1, const void *p2), + const void *untilbuf); struct rset_term { char *name; @@ -93,10 +97,14 @@ RSET rset_dup (RSET rs); /* void rset_rewind(RSET rs); */ #define rset_rewind(rs, rfd) (*(rs)->control->f_rewind)((rfd)) +/* int rset_forward(RSET rs, void *buf, int *indx, void *untilbuf); */ +#define rset_forward(rs, fd, buf, indx, cmpfunc, untilbuf) \ + (*(rs)->control->f_forward)((rs), (fd), (buf), (indx), (cmpfunc), (untilbuf)) + /* int rset_count(RSET rs); */ #define rset_count(rs) (*(rs)->control->f_count)(rs) -/* int rset_read(RSET rs, void *buf); */ +/* int rset_read(RSET rs, void *buf, int *indx); */ #define rset_read(rs, fd, buf, indx) (*(rs)->control->f_read)((fd), (buf), indx) /* int rset_write(RSET rs, const void *buf); */ diff --git a/rset/rsbool.c b/rset/rsbool.c index db767ba..aa6e280 100644 --- a/rset/rsbool.c +++ b/rset/rsbool.c @@ -1,4 +1,4 @@ -/* $Id: rsbool.c,v 1.23 2004-01-16 15:27:35 heikki Exp $ +/* $Id: rsbool.c,v 1.24 2004-01-30 11:43:41 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003 Index Data Aps @@ -30,11 +30,17 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include +#include <../index/index.h> /* for log_keydump. Debugging only */ + + static void *r_create(RSET ct, const struct rset_control *sel, void *parms); static RSFD r_open (RSET ct, int flag); static void r_close (RSFD rfd); static void r_delete (RSET ct); static void r_rewind (RSFD rfd); +static int r_forward(RSET ct, RSFD rfd, void *buf, int *term_index, + int (*cmpfunc)(const void *p1, const void *p2), + const void *untilbuf); static int r_count (RSET ct); static int r_read_and (RSFD rfd, void *buf, int *term_index); static int r_read_or (RSFD rfd, void *buf, int *term_index); @@ -49,7 +55,7 @@ static const struct rset_control control_and = r_close, r_delete, r_rewind, - rset_default_forward, + r_forward, /*rset_default_forward,*/ r_count, r_read_and, r_write, @@ -63,7 +69,11 @@ static const struct rset_control control_or = r_close, r_delete, r_rewind, +#if 1 + r_forward, +#else rset_default_forward, +#endif r_count, r_read_or, r_write, @@ -77,7 +87,7 @@ static const struct rset_control control_not = r_close, r_delete, r_rewind, - rset_default_forward, + r_forward, r_count, r_read_not, r_write, @@ -209,6 +219,40 @@ static void r_rewind (RSFD rfd) p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r, &p->term_index_r); } +static int r_forward(RSET ct, RSFD rfd, void *buf, int *term_index, + int (*cmpfunc)(const void *p1, const void *p2), + const void *untilbuf) +{ + struct rset_bool_info *info = ((struct rset_bool_rfd*)rfd)->info; + struct rset_bool_rfd *p = (struct rset_bool_rfd *) rfd; + int cmp=0; + + logf (LOG_DEBUG, "rsbool_forward '%s' (ct=%p rfd=%p m=%d,%d)", + ct->control->desc, ct, rfd, p->more_l, p->more_r); + if ( p->more_l) + p->more_l = rset_forward(info->rset_l, p->rfd_l, p->buf_l, + &p->term_index_l, info->cmp, untilbuf); + if ( p->more_r) + p->more_r = rset_forward(info->rset_r, p->rfd_r, p->buf_r, + &p->term_index_r, info->cmp, untilbuf); + if (p->more_l && p->more_r) + cmp = (*info->cmp)(p->buf_l, p->buf_r); + else if (p->more_l) + cmp = -2; + else + cmp = 2; + if ( (cmp<0) && (p->more_l) ) + { + memcpy (buf, p->buf_l, info->key_size); + *term_index = p->term_index_l; + } else if ( (cmp>0) && (p->more_r) ) + { + memcpy (buf, p->buf_r, info->key_size); + *term_index = p->term_index_r + info->term_index_s; + } + return ( p->more_l || p->more_r); +} + static int r_count (RSET ct) { return 0; @@ -245,10 +289,14 @@ static int r_read_and (RSFD rfd, void *buf, int *term_index) cmp = -2; else cmp = 2; + logf (LOG_DEBUG, "r_read_and looping: m=%d/%d c=%d t=%d", + p->more_l, p->more_r, cmp, p->tail); + key_logdump(LOG_DEBUG,p->buf_l); + key_logdump(LOG_DEBUG,p->buf_r); if (!cmp) { memcpy (buf, p->buf_l, info->key_size); - *term_index = p->term_index_l; + *term_index = p->term_index_l; p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l, &p->term_index_l); p->tail = 1; @@ -256,23 +304,31 @@ static int r_read_and (RSFD rfd, void *buf, int *term_index) else if (cmp == 1) { memcpy (buf, p->buf_r, info->key_size); - *term_index = p->term_index_r + info->term_index_s; + *term_index = p->term_index_r + info->term_index_s; p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r, &p->term_index_r); p->tail = 1; + logf (LOG_DEBUG, "r_read_and returning A m=%d/%d c=%d", + p->more_l, p->more_r, cmp); + key_logdump(LOG_DEBUG,buf); return 1; } else if (cmp == -1) { memcpy (buf, p->buf_l, info->key_size); - *term_index = p->term_index_l; + *term_index = p->term_index_l; p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l, &p->term_index_l); p->tail = 1; + logf (LOG_DEBUG, "r_read_and returning B m=%d/%d c=%d", + p->more_l, p->more_r, cmp); + key_logdump(LOG_DEBUG,buf); return 1; } else if (cmp > 1) { +#define OLDCODE 0 +#if OLDCODE memcpy (buf, p->buf_r, info->key_size); *term_index = p->term_index_r + info->term_index_s; @@ -282,21 +338,87 @@ static int r_read_and (RSFD rfd, void *buf, int *term_index) { if (!p->more_r || (*info->cmp)(p->buf_r, buf) > 1) p->tail = 0; + logf (LOG_DEBUG, "r_read_and returning C m=%d/%d c=%d", + p->more_l, p->more_r, cmp); + key_logdump(LOG_DEBUG,buf); return 1; } +#else + + if (p->tail) + { + logf (LOG_DEBUG, "r_read_and returning R tail m=%d/%d c=%d", + p->more_l, p->more_r, cmp); + memcpy (buf, p->buf_r, info->key_size); + *term_index = p->term_index_r + info->term_index_s; + p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r, + &p->term_index_r); + if (!p->more_r || (*info->cmp)(p->buf_r, buf) > 1) + p->tail = 0; + logf (LOG_DEBUG, "r_read_and returning D m=%d/%d c=%d", + p->more_l, p->more_r, cmp); + key_logdump(LOG_DEBUG,buf); + return 1; + } else + { + logf (LOG_DEBUG, "r_read_and about to forward R m=%d/%d c=%d", + p->more_l, p->more_r, cmp); + if (p->more_r && p->more_l) + p->more_r = rset_forward( + info->rset_r, p->rfd_r, + p->buf_r, &p->term_index_r, + (info->cmp), p->buf_l); + else + return 0; /* no point in reading further */ + } +#endif } else { - memcpy (buf, p->buf_l, info->key_size); - *term_index = p->term_index_l; - p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l, - &p->term_index_l); +#if OLDCODE + memcpy (buf, p->buf_l, info->key_size); + *term_index = p->term_index_l; + p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l, + &p->term_index_l); + if (p->tail) + { + if (!p->more_l || (*info->cmp)(p->buf_l, buf) > 1) + p->tail = 0; + logf (LOG_DEBUG, "r_read_and returning E m=%d/%d c=%d", + p->more_l, p->more_r, cmp); + key_logdump(LOG_DEBUG,buf); + return 1; + } +#else if (p->tail) { + logf (LOG_DEBUG, "r_read_and returning L tail m=%d/%d c=%d", + p->more_l, p->more_r, cmp); + memcpy (buf, p->buf_l, info->key_size); + *term_index = p->term_index_l; + p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l, + &p->term_index_l); if (!p->more_l || (*info->cmp)(p->buf_l, buf) > 1) p->tail = 0; + logf (LOG_DEBUG, "r_read_and returning F m=%d/%d c=%d", + p->more_l, p->more_r, cmp); + key_logdump(LOG_DEBUG,buf); return 1; } + else + { + logf (LOG_DEBUG, "r_read_and about to forward L m=%d/%d c=%d", + p->more_l, p->more_r, cmp); + if (p->more_r && p->more_l) + p->more_l = rset_forward( + /* p->more_l = rset_default_forward( */ + info->rset_l, p->rfd_l, + p->buf_l, &p->term_index_l, + (info->cmp), p->buf_r); + else + return 0; /* no point in reading further */ + } +#endif } } return 0; @@ -320,27 +442,36 @@ static int r_read_or (RSFD rfd, void *buf, int *term_index) if (!cmp) { memcpy (buf, p->buf_l, info->key_size); - *term_index = p->term_index_l; + *term_index = p->term_index_l; p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l, &p->term_index_l); p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r, &p->term_index_r); + logf (LOG_DEBUG, "r_read_or returning A m=%d/%d c=%d", + p->more_l, p->more_r, cmp); + key_logdump(LOG_DEBUG,buf); return 1; } else if (cmp > 0) { memcpy (buf, p->buf_r, info->key_size); - *term_index = p->term_index_r + info->term_index_s; + *term_index = p->term_index_r + info->term_index_s; p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r, &p->term_index_r); + logf (LOG_DEBUG, "r_read_or returning B m=%d/%d c=%d", + p->more_l, p->more_r, cmp); + key_logdump(LOG_DEBUG,buf); return 1; } else { memcpy (buf, p->buf_l, info->key_size); - *term_index = p->term_index_l; + *term_index = p->term_index_l; p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l, &p->term_index_l); + logf (LOG_DEBUG, "r_read_or returning C m=%d/%d c=%d", + p->more_l, p->more_r, cmp); + key_logdump(LOG_DEBUG,buf); return 1; } } @@ -365,14 +496,21 @@ static int r_read_not (RSFD rfd, void *buf, int *term_index) if (cmp < -1) { memcpy (buf, p->buf_l, info->key_size); - *term_index = p->term_index_l; + *term_index = p->term_index_l; p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l, &p->term_index_l); return 1; } else if (cmp > 1) +#if 0 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r, &p->term_index_r); +#else + p->more_r = rset_forward( + info->rset_r, p->rfd_r, + p->buf_r, &p->term_index_r, + (info->cmp), p->buf_l); +#endif else { memcpy (buf, p->buf_l, info->key_size); diff --git a/rset/rset.c b/rset/rset.c index a89191e..e798148 100644 --- a/rset/rset.c +++ b/rset/rset.c @@ -1,4 +1,4 @@ -/* $Id: rset.c,v 1.19 2004-01-22 11:27:22 adam Exp $ +/* $Id: rset.c,v 1.20 2004-01-30 11:43:41 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -27,6 +27,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include +#include <../index/index.h> /* for log_keydump. Debugging only */ RSET rset_create(const struct rset_control *sel, void *parms) { @@ -63,10 +64,27 @@ RSET rset_dup (RSET rs) return rs; } -int rset_default_forward(RSFD rfd, void *buf, const void *untilbuf) +int rset_default_forward(RSET ct, RSFD rfd, void *buf, int *term_index, + int (*cmpfunc)(const void *p1, const void *p2), + const void *untilbuf) { - logf (LOG_FATAL, "rset_default-forward not yet implemented"); - return 0; + int more=1; + int cmp=2; + logf (LOG_DEBUG, "rset_default_forward starting '%s' (ct=%p rfd=%p)", + ct->control->desc, ct,rfd); + key_logdump(LOG_DEBUG, untilbuf); + while ( (cmp==2) && (more)) + { + logf (LOG_DEBUG, "rset_default_forward looping m=%d c=%d",more,cmp); + more=rset_read(ct, rfd, buf, term_index); + if (more) + cmp=(*cmpfunc)(untilbuf,buf); + if (more) + key_logdump(LOG_DEBUG,buf); + } + logf (LOG_DEBUG, "rset_default_forward exiting m=%d c=%d",more,cmp); + + return more; } RSET_TERM *rset_terms(RSET rs, int *no) diff --git a/rset/rsisamb.c b/rset/rsisamb.c index ed009dd..34adc2d 100644 --- a/rset/rsisamb.c +++ b/rset/rsisamb.c @@ -1,4 +1,4 @@ -/* $Id: rsisamb.c,v 1.4 2004-01-28 10:44:52 heikki Exp $ +/* $Id: rsisamb.c,v 1.5 2004-01-30 11:43:41 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -40,7 +40,7 @@ static int r_write (RSFD rfd, const void *buf); static const struct rset_control control = { - "isamc", + "isamb", r_create, r_open, r_close, diff --git a/test/gils/Makefile.am b/test/gils/Makefile.am index dae785c..a1fa604 100644 --- a/test/gils/Makefile.am +++ b/test/gils/Makefile.am @@ -1,11 +1,11 @@ -# $Id: Makefile.am,v 1.16 2003-09-24 11:45:44 adam Exp $ +# $Id: Makefile.am,v 1.17 2004-01-30 11:43:41 heikki Exp $ dist-hook: -mkdir $(distdir)/records cp $(srcdir)/records/*.grs $(distdir)/records check_SCRIPTS = stop01.sh stop02.sh stop03.sh stop04.sh \ - test1.sh test2.sh timing1.sh timing2.sh + test1.sh test2.sh test3.sh timing1.sh timing2.sh TESTS = $(check_SCRIPTS) diff --git a/test/marcxml/test1.sh b/test/marcxml/test1.sh index 58bb388..add59eb 100755 --- a/test/marcxml/test1.sh +++ b/test/marcxml/test1.sh @@ -1,13 +1,15 @@ #!/bin/sh LOG=test1.log +DBG="-v 1647" + rm -f $LOG if ../../index/zebraidx -l $LOG -V|grep Expat >/dev/null; then - ../../index/zebraidx -l$LOG init + ../../index/zebraidx -l $LOG $DBG init else exit 0 fi -../../index/zebraidx -l$LOG update m*.xml -../../index/zebrasrv -l$LOG unix:socket & +../../index/zebraidx -l $LOG $DBG update m*.xml +../../index/zebrasrv -l $LOG $DBG unix:socket & sleep 1 ../api/testclient unix:socket '@and @attr 1=1003 jack @attr 1=4 computer' >tmp1 echo 'Result count: 2' >tmp2