X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=rset%2Frsprox.c;h=9a9951a4ea4ce7d25ef6d827b62aa82cafe4c651;hp=2df259233728e0874dbba018dfe453543b930a36;hb=96e4c5479e111511f5df3531b6648931251b9e5d;hpb=4e6078e4660869b9d83223c8ce842ed8dda211ab diff --git a/rset/rsprox.c b/rset/rsprox.c index 2df2592..9a9951a 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,13 +32,13 @@ 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 = @@ -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,10 +106,11 @@ 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++) @@ -118,22 +122,23 @@ static RSFD r_open (RSET ct, int flag) } 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,8 +154,8 @@ 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) ) + 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); } @@ -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 */ @@ -184,7 +189,7 @@ static int r_forward(RSFD rfd, void *buf, TERMID *term, const void *untilbuf) continue; else if (info->relation == 1 && diff < info->distance) continue; - + p->more[i-1] = rset_read(p->rfd[i-1], p->buf[i-1], &p->terms[i-1]); break; @@ -214,19 +219,19 @@ static int r_forward(RSFD rfd, void *buf, TERMID *term, const void *untilbuf) { 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); }