X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=rset%2Frsmultiandor.c;h=1d06c37f8143c50b075266c514f98cb2e57a3967;hp=fceb7727b7559d59862c57c7329dc7badb88e9fc;hb=0e56fa84bb4a5985c19a21926e86862c08d84689;hpb=0229bb1ac74706a4e460a11a8a8712b4ea0f2ebe diff --git a/rset/rsmultiandor.c b/rset/rsmultiandor.c index fceb772..1d06c37 100644 --- a/rset/rsmultiandor.c +++ b/rset/rsmultiandor.c @@ -1,4 +1,4 @@ -/* $Id: rsmultiandor.c,v 1.6 2004-10-15 10:07:34 heikki Exp $ +/* $Id: rsmultiandor.c,v 1.11 2004-12-08 14:02:37 adam Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -40,7 +40,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include -#include +#include #include static RSFD r_open_and (RSET ct, int flag); @@ -55,11 +55,13 @@ static int r_forward_and(RSFD rfd, void *buf, TERMID *term, static int r_forward_or(RSFD rfd, void *buf, TERMID *term, const void *untilbuf); 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_or = { "multi-or", r_delete, + r_get_terms, r_open_or, r_close, r_forward_or, @@ -71,6 +73,7 @@ static const struct rset_control control_and = { "multi-and", r_delete, + r_get_terms, r_open_and, r_close, r_forward_and, @@ -122,6 +125,10 @@ struct rset_multiandor_rfd { char *tailbits; }; +static int log_level=0; +static int log_level_initialized=0; + + /* Heap functions ***********************/ #if 0 @@ -130,13 +137,13 @@ static void heap_dump_item( HEAP h, int i, int level) { if (i>h->heapnum) return; (void)rset_pos(h->heap[i]->rset,h->heap[i]->fd, &cur, &tot); - logf(LOG_LOG," %d %*s i=%p buf=%p %0.1f/%0.1f",i, level, "", + yaz_log(log_level," %d %*s i=%p buf=%p %0.1f/%0.1f",i, level, "", &(h->heap[i]), h->heap[i]->buf, cur,tot ); heap_dump_item(h, 2*i, level+1); heap_dump_item(h, 2*i+1, level+1); } static void heap_dump( HEAP h,char *msg) { - logf(LOG_LOG, "heap dump: %s num=%d max=%d",msg, h->heapnum, h->heapmax); + yaz_log(log_level, "heap dump: %s num=%d max=%d",msg, h->heapnum, h->heapmax); heap_dump_item(h,1,1); } #endif @@ -261,6 +268,11 @@ static RSET rsmulti_andor_create( NMEM nmem, const struct key_control *kcontrol, { RSET rnew=rset_create_base(ctrl, nmem,kcontrol, scope,0); struct rset_multiandor_info *info; + if (!log_level_initialized) + { + log_level=yaz_log_module_level("rsmultiandor"); + log_level_initialized=1; + } info = (struct rset_multiandor_info *) nmem_malloc(rnew->nmem,sizeof(*info)); info->no_rsets=no_rsets; info->rsets=(RSET*)nmem_malloc(rnew->nmem, no_rsets*sizeof(*rsets)); @@ -304,7 +316,7 @@ static RSFD r_open_andor (RSET ct, int flag, int is_and) if (flag & RSETF_WRITE) { - logf (LOG_FATAL, "multiandor set type is read-only"); + yaz_log (YLOG_FATAL, "multiandor set type is read-only"); return NULL; } rfd=rfd_create_base(ct); @@ -559,23 +571,46 @@ static void r_pos (RSFD rfd, double *current, double *total) int i; for (i=0; ino_rsets; i++){ rset_pos(mrfd->items[i].fd, &cur, &tot); - logf(LOG_DEBUG, "r_pos: %d %0.1f %0.1f", i, cur,tot); + yaz_log(log_level, "r_pos: %d %0.1f %0.1f", i, cur,tot); scur += cur; stot += tot; } if (stot <1.0) { /* nothing there */ *current=0; *total=0; + yaz_log(log_level, "r_pos: NULL %0.1f %0.1f", *current, *total); return; } *current=mrfd->hits; *total=*current*stot/scur; + yaz_log(log_level, "r_pos: = %0.1f %0.1f", *current, *total); } static int r_write (RSFD rfd, const void *buf) { - logf (LOG_FATAL, "multior set type is read-only"); + yaz_log (YLOG_FATAL, "multior set type is read-only"); return -1; } + +static void r_get_terms(RSET ct, TERMID *terms, int maxterms, int *curterm) + /* Special case: Some multi-ors have all terms pointing to the same */ + /* term. We do not want to duplicate those. Other multiors (and ands) */ + /* have different terms under them. Those we want. */ +{ + struct rset_multiandor_info *info = + (struct rset_multiandor_info *) ct->priv; + int firstterm= *curterm; + int i; + for (i=0;ino_rsets;i++) + { + rset_getterms(info->rsets[i], terms, maxterms, curterm); + if ( ( (*curterm) > firstterm+1 ) && + ( (*curterm) <= maxterms ) && + ( terms[(*curterm)-1] == terms[firstterm] ) ) + (*curterm)--; /* forget the term, seen that before */ + } +} + +