From: Adam Dickmeiss Date: Wed, 15 May 1996 18:35:17 +0000 (+0000) Subject: Implemented snot operation. X-Git-Tag: ZEBRA.1.0~452 X-Git-Url: http://git.indexdata.com/?a=commitdiff_plain;h=82e1d75fa903fa0380a4416b8d87ec898324b820;hp=37a0daf2cf9d12c9b62fce9975e56bc86bc858b2;p=idzebra-moved-to-github.git Implemented snot operation. --- diff --git a/rset/Makefile b/rset/Makefile index 3970f4c..87bbed3 100644 --- a/rset/Makefile +++ b/rset/Makefile @@ -1,13 +1,13 @@ -# Copyright (C) 1994, Index Data I/S +# Copyright (C) 1994-1996, Index Data I/S # All rights reserved. # Sebastian Hammer, Adam Dickmeiss -# $Id: Makefile,v 1.10 1995-12-11 09:15:21 adam Exp $ +# $Id: Makefile,v 1.11 1996-05-15 18:35:17 adam Exp $ SHELL=/bin/sh RANLIB=ranlib -YAZLIB=-lyaz -YAZINC= +YAZLIB=../../yaz/lib/libyaz.a +YAZINC=-I../../yaz/include INCLUDE=-I../include $(YAZINC) #CFLAGS=-g -Wall -pedantic -ansi diff --git a/rset/rssbool.c b/rset/rssbool.c index 32855d3..ec7e80a 100644 --- a/rset/rssbool.c +++ b/rset/rssbool.c @@ -1,10 +1,13 @@ /* - * Copyright (C) 1994-1995, Index Data I/S + * Copyright (C) 1994-1996, Index Data I/S * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: rssbool.c,v $ - * Revision 1.1 1995-12-11 09:15:27 adam + * Revision 1.2 1996-05-15 18:35:17 adam + * Implemented snot operation. + * + * Revision 1.1 1995/12/11 09:15:27 adam * New set types: sand/sor/snot - ranked versions of and/or/not in * ranked/semi-ranked result sets. * Note: the snot not finished yet. @@ -257,12 +260,49 @@ static void *r_create_not (const struct rset_control *sel, void *parms, int *flags) { char *buf_l, *buf_r; + int more_l, more_r; + RSFD fd_l, fd_r; struct rset_bool_info *info; info = r_create_common (sel, parms, flags); buf_l = xmalloc (info->key_size); buf_r = xmalloc (info->key_size); + + fd_l = rset_open (info->rset_l, RSETF_SORT_SYSNO|RSETF_READ); + fd_r = rset_open (info->rset_r, RSETF_SORT_SYSNO|RSETF_READ); + + more_l = rset_read(info->rset_l, fd_l, buf_l); + more_r = rset_read(info->rset_r, fd_r, buf_r); + + while (more_l || more_r) + { + int cmp; + int score; + + if (more_l && more_r) + cmp = (*info->cmp)(buf_l, buf_r); + else if (more_r) + cmp = 2; + else + cmp = -2; + + if (cmp >= -1 && cmp <= 1) + more_l = rset_read (info->rset_l, fd_l, buf_l); + else if (cmp > 1) + { + more_r = rset_read (info->rset_r, fd_r, buf_r); + } + else + { + rset_score (info->rset_l, fd_l, &score); + key_add (info, buf_l, score == -1 ? 1 : score); + more_l = rset_read (info->rset_l, fd_l, buf_l); + } + } + rset_close (info->rset_l, fd_l); + rset_close (info->rset_r, fd_r); + rset_delete (info->rset_l); rset_delete (info->rset_r); xfree (buf_l);