X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=rset%2Frsprox.c;h=964ef71c5d0a0acf050cfd0963892f3a31e1efa1;hp=2df259233728e0874dbba018dfe453543b930a36;hb=20e2d608e0cd383054e627db00264388affb58cd;hpb=4e6078e4660869b9d83223c8ce842ed8dda211ab diff --git a/rset/rsprox.c b/rset/rsprox.c index 2df2592..964ef71 100644 --- a/rset/rsprox.c +++ b/rset/rsprox.c @@ -1,5 +1,5 @@ /* This file is part of the Zebra server. - Copyright (C) 1994-2009 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 @@ -17,6 +17,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#if HAVE_CONFIG_H +#include +#endif #include #include #include @@ -29,16 +32,16 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #define RSET_DEBUG 0 #endif -static RSFD r_open (RSET ct, int flag); -static void r_close (RSFD rfd); -static void r_delete (RSET ct); +static RSFD r_open(RSET ct, int flag); +static void r_close(RSFD rfd); +static void r_delete(RSET ct); static int r_forward(RSFD rfd, void *buf, TERMID *term, const void *untilbuf); -static int r_read (RSFD rfd, void *buf, TERMID *term); -static int r_write (RSFD rfd, const void *buf); -static void r_pos (RSFD rfd, double *current, double *total); +static int r_read(RSFD rfd, void *buf, TERMID *term); +static int r_write(RSFD rfd, const void *buf); +static void r_pos(RSFD rfd, double *current, double *total); static void r_get_terms(RSET ct, TERMID *terms, int maxterms, int *curterm); -static const struct rset_control control = +static const struct rset_control control = { "prox", r_delete, @@ -64,7 +67,7 @@ struct rset_prox_rfd { char *more; /* more in each lookahead? */ TERMID *terms; /* lookahead terms */ zint hits; -}; +}; RSET rset_create_prox(NMEM nmem, struct rset_key_control *kcontrol, @@ -85,11 +88,11 @@ RSET rset_create_prox(NMEM nmem, struct rset_key_control *kcontrol, return rnew; } -static void r_delete (RSET ct) +static void r_delete(RSET ct) { } -static RSFD r_open (RSET ct, int flag) +static RSFD r_open(RSET ct, int flag) { RSFD rfd; struct rset_prox_rfd *p; @@ -103,37 +106,39 @@ static RSFD r_open (RSET ct, int flag) rfd = rfd_create_base(ct); if (rfd->priv) p = (struct rset_prox_rfd *)(rfd->priv); - else { + else + { p = (struct rset_prox_rfd *) nmem_malloc(ct->nmem,sizeof(*p)); rfd->priv = p; - p->more = nmem_malloc (ct->nmem,sizeof(*p->more) * ct->no_children); + p->more = nmem_malloc(ct->nmem,sizeof(*p->more) * ct->no_children); p->buf = nmem_malloc(ct->nmem,sizeof(*p->buf) * ct->no_children); p->terms = nmem_malloc(ct->nmem,sizeof(*p->terms) * ct->no_children); - for (i = 0; i < ct->no_children; i++) + for (i = 0; i < ct->no_children; i++) { p->buf[i] = nmem_malloc(ct->nmem,ct->keycontrol->key_size); p->terms[i] = 0; } p->rfd = nmem_malloc(ct->nmem,sizeof(*p->rfd) * ct->no_children); } - yaz_log(YLOG_DEBUG,"rsprox (%s) open [%p] n=%d", + yaz_log(YLOG_DEBUG,"rsprox (%s) open [%p] n=%d", ct->control->desc, rfd, ct->no_children); - for (i = 0; i < ct->no_children; i++) { - p->rfd[i] = rset_open (ct->children[i], RSETF_READ); - p->more[i] = rset_read (p->rfd[i], p->buf[i], &p->terms[i]); + for (i = 0; i < ct->no_children; i++) + { + p->rfd[i] = rset_open(ct->children[i], RSETF_READ); + p->more[i] = rset_read(p->rfd[i], p->buf[i], &p->terms[i]); } p->hits = 0; return rfd; } -static void r_close (RSFD rfd) +static void r_close(RSFD rfd) { RSET ct = rfd->rset; struct rset_prox_rfd *p = (struct rset_prox_rfd *)(rfd->priv); - + int i; - for (i = 0; ino_children; i++) + for (i = 0; i < ct->no_children; i++) rset_close(p->rfd[i]); } @@ -149,18 +154,18 @@ static int r_forward(RSFD rfd, void *buf, TERMID *term, const void *untilbuf) if (untilbuf) { /* it is enough to forward first one. Other will follow. */ - if ( p->more[0] && /* was: cmp >=2 */ - ((kctrl->cmp)(untilbuf, p->buf[0]) >= rfd->rset->scope) ) - p->more[0] = rset_forward(p->rfd[0], p->buf[0], + if (p->more[0] && /* was: cmp >=2 */ + ((kctrl->cmp)(untilbuf, p->buf[0]) >= rfd->rset->scope) ) + p->more[0] = rset_forward(p->rfd[0], p->buf[0], &p->terms[0], untilbuf); } if (info->ordered && info->relation <= 3 && info->exclusion == 0) { - while (p->more[0]) + while (p->more[0]) { for (i = 1; i < ct->no_children; i++) { - if (!p->more[i]) + if (!p->more[i]) { p->more[0] = 0; /* saves us a goto out of while loop. */ break; @@ -168,10 +173,10 @@ static int r_forward(RSFD rfd, void *buf, TERMID *term, const void *untilbuf) cmp = (*kctrl->cmp)(p->buf[i], p->buf[i-1]); if (cmp >= rfd->rset->scope) /* not same record */ { - p->more[i-1] = rset_forward (p->rfd[i-1], - p->buf[i-1], - &p->terms[i-1], - p->buf[i]); + p->more[i-1] = rset_forward(p->rfd[i-1], + p->buf[i-1], + &p->terms[i-1], + p->buf[i]); break; } else if (cmp > 0) /* within record and ordered */ @@ -210,23 +215,23 @@ static int r_forward(RSFD rfd, void *buf, TERMID *term, const void *untilbuf) } else if (ct->no_children == 2) { - while (p->more[0] && p->more[1]) + while (p->more[0] && p->more[1]) { int cmp = (*kctrl->cmp)(p->buf[0], p->buf[1]); if ( cmp <= - rfd->rset->scope) /* cmp<-1*/ - p->more[0] = rset_forward (p->rfd[0], p->buf[0], - &p->terms[0],p->buf[1]); + p->more[0] = rset_forward(p->rfd[0], p->buf[0], + &p->terms[0],p->buf[1]); else if ( cmp >= rfd->rset->scope ) /* cmp>1 */ - p->more[1] = rset_forward (p->rfd[1], p->buf[1], - &p->terms[1],p->buf[0]); + p->more[1] = rset_forward(p->rfd[1], p->buf[1], + &p->terms[1],p->buf[0]); else { zint seqno[500]; /* FIXME - why 500 ?? */ int n = 0; - + seqno[n++] = (*kctrl->getseq)(p->buf[0]); - while ((p->more[0] = rset_read (p->rfd[0], - p->buf[0], &p->terms[0]))) + while ((p->more[0] = rset_read(p->rfd[0], + p->buf[0], &p->terms[0]))) { cmp = (*kctrl->cmp)(p->buf[0], p->buf[1]); if (cmp <= - rfd->rset->scope || cmp >= rfd->rset->scope) @@ -275,8 +280,8 @@ static int r_forward(RSFD rfd, void *buf, TERMID *term, const void *untilbuf) } if (excl) { - p->more[1] = rset_read ( p->rfd[1], p->buf[1], - &p->terms[1]); + p->more[1] = rset_read( p->rfd[1], p->buf[1], + &p->terms[1]); p->hits++; return 1; } @@ -295,55 +300,49 @@ static int r_forward(RSFD rfd, void *buf, TERMID *term, const void *untilbuf) } -static int r_read (RSFD rfd, void *buf, TERMID *term) +static int r_read(RSFD rfd, void *buf, TERMID *term) { return r_forward(rfd, buf, term, 0); } -static int r_write (RSFD rfd, const void *buf) +static int r_write(RSFD rfd, const void *buf) { yaz_log(YLOG_FATAL, "prox set type is read-only"); return -1; } -static void r_pos (RSFD rfd, double *current, double *total) +static void r_pos(RSFD rfd, double *current, double *total) { RSET ct = rfd->rset; struct rset_prox_rfd *p = (struct rset_prox_rfd *)(rfd->priv); int i; - double r = 0.0; - double cur, tot = -1.0; - double scur = 0.0, stot = 0.0; - - yaz_log(YLOG_DEBUG, "rsprox_pos"); + double ratio = 0.0; for (i = 0; i < ct->no_children; i++) { - rset_pos(p->rfd[i], &cur, &tot); - if (tot>0) { - scur += cur; - stot += tot; + double cur, tot; + rset_pos(p->rfd[i], &cur, &tot); + if (tot > 0.0) + { + double nratio = cur / tot; + if (ratio < nratio) + ratio = nratio; } } - if (tot <0) { /* nothing found */ - *current = -1; - *total = -1; - } else if (tot < 1) { /* most likely tot==0 */ - *current = 0; - *total = 0; - } else { - r = scur/stot; - *current = (double) p->hits; - *total=*current/r ; - } - yaz_log(YLOG_DEBUG,"prox_pos: [%d] %0.1f/%0.1f= %0.4f ", - i,*current, *total, r); + *current = (double) p->hits; + if (ratio > 0.0) + *total = *current/ratio; + else + *total = 0.0; + + yaz_log(YLOG_DEBUG, "prox_pos: [%d] %0.1f/%0.1f= %0.4f ", + i, *current, *total, ratio); } static void r_get_terms(RSET ct, TERMID *terms, int maxterms, int *curterm) { int i; - for (i = 0; ino_children; i++) + for (i = 0; i < ct->no_children; i++) rset_getterms(ct->children[i], terms, maxterms, curterm); }