From 82e1d75fa903fa0380a4416b8d87ec898324b820 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Wed, 15 May 1996 18:35:17 +0000 Subject: [PATCH] Implemented snot operation. --- rset/Makefile | 8 ++++---- rset/rssbool.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 6 deletions(-) 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); -- 1.7.10.4