Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
Index Data Aps
Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
Index Data Aps
static RSFD r_open_or (RSET ct, int flag);
static void r_close (RSFD rfd);
static void r_delete (RSET ct);
static RSFD r_open_or (RSET ct, int flag);
static void r_close (RSFD rfd);
static void r_delete (RSET ct);
-static int r_read_and (RSFD rfd, void *buf);
-static int r_read_or (RSFD rfd, void *buf);
+static int r_read_and (RSFD rfd, void *buf, TERMID *term);
+static int r_read_or (RSFD rfd, void *buf, TERMID *term);
-static int r_forward_and(RSFD rfd, void *buf,
+static int r_forward_and(RSFD rfd, void *buf, TERMID *term,
-static int r_forward_or(RSFD rfd, void *buf,
+static int r_forward_or(RSFD rfd, void *buf, TERMID *term,
int scope, int no_rsets, RSET* rsets,
const struct rset_control *ctrl)
{
int scope, int no_rsets, RSET* rsets,
const struct rset_control *ctrl)
{
- RSET rnew=rset_create_base(ctrl, nmem,kcontrol, scope);
+ RSET rnew=rset_create_base(ctrl, nmem,kcontrol, scope,0);
struct rset_multiandor_info *info;
info = (struct rset_multiandor_info *) nmem_malloc(rnew->nmem,sizeof(*info));
info->no_rsets=no_rsets;
struct rset_multiandor_info *info;
info = (struct rset_multiandor_info *) nmem_malloc(rnew->nmem,sizeof(*info));
info->no_rsets=no_rsets;
{ /* read the array and sort it */
for (i=0; i<info->no_rsets; i++){
p->items[i].fd=rset_open(info->rsets[i],RSETF_READ);
{ /* read the array and sort it */
for (i=0; i<info->no_rsets; i++){
p->items[i].fd=rset_open(info->rsets[i],RSETF_READ);
{ /* fill the heap for ORing */
for (i=0; i<info->no_rsets; i++){
p->items[i].fd=rset_open(info->rsets[i],RSETF_READ);
{ /* fill the heap for ORing */
for (i=0; i<info->no_rsets; i++){
p->items[i].fd=rset_open(info->rsets[i],RSETF_READ);
-static int r_forward_or(RSFD rfd, void *buf, const void *untilbuf)
+static int r_forward_or(RSFD rfd, void *buf,
+ TERMID *term,const void *untilbuf)
{ /* while heap head behind untilbuf, forward it and rebalance heap */
struct rset_multiandor_rfd *p=rfd->priv;
const struct key_control *kctrl=rfd->rset->keycontrol;
{ /* while heap head behind untilbuf, forward it and rebalance heap */
struct rset_multiandor_rfd *p=rfd->priv;
const struct key_control *kctrl=rfd->rset->keycontrol;
- if ( rset_forward(p->h->heap[1]->fd, p->h->heap[1]->buf, untilbuf) )
+ if (rset_forward(p->h->heap[1]->fd,p->h->heap[1]->buf,
+ &p->h->heap[1]->term, untilbuf))
{ /* Has to return all hits where each item points to the */
/* same sysno (scope), in order. Keep an extra key (hitkey) */
/* as long as all records do not point to hitkey, forward */
{ /* Has to return all hits where each item points to the */
/* same sysno (scope), in order. Keep an extra key (hitkey) */
/* as long as all records do not point to hitkey, forward */
}
/* return the lowest tail */
memcpy(buf, p->items[mintail].buf, kctrl->key_size);
}
/* return the lowest tail */
memcpy(buf, p->items[mintail].buf, kctrl->key_size);
- if (!rset_read(p->items[mintail].fd, p->items[mintail].buf))
+ if (term)
+ *term=p->items[mintail].term;
+ if (!rset_read(p->items[mintail].fd, p->items[mintail].buf,
+ &p->items[mintail].term))
cmp=(*kctrl->cmp)(p->items[0].buf,p->items[i].buf);
if (cmp<=-rfd->rset->scope) { /* [0] was behind, forward it */
if (!rset_forward(p->items[0].fd, p->items[0].buf,
cmp=(*kctrl->cmp)(p->items[0].buf,p->items[i].buf);
if (cmp<=-rfd->rset->scope) { /* [0] was behind, forward it */
if (!rset_forward(p->items[0].fd, p->items[0].buf,
} else if (cmp>=rfd->rset->scope)
{ /* [0] was ahead, forward i */
if (!rset_forward(p->items[i].fd, p->items[i].buf,
} else if (cmp>=rfd->rset->scope)
{ /* [0] was ahead, forward i */
if (!rset_forward(p->items[i].fd, p->items[i].buf,
-static int r_forward_and(RSFD rfd, void *buf, const void *untilbuf)
+static int r_forward_and(RSFD rfd, void *buf, TERMID *term,
+ const void *untilbuf)
{
killtail=1; /* we are moving to a different hit */
if (!rset_forward(p->items[i].fd, p->items[i].buf,
{
killtail=1; /* we are moving to a different hit */
if (!rset_forward(p->items[i].fd, p->items[i].buf,