2 * Copyright (C) 1994-1995, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.8 1995-10-12 12:41:55 adam
8 * Private info (buf) moved from struct rset_control to struct rset.
9 * Bug fixes in relevance.
11 * Revision 1.7 1995/10/10 14:00:03 adam
12 * Function rset_open changed its wflag parameter to general flags.
14 * Revision 1.6 1995/10/06 14:38:05 adam
15 * New result set method: r_score.
16 * Local no (sysno) and score is transferred to retrieveCtrl.
18 * Revision 1.5 1995/09/08 14:52:41 adam
19 * Work on relevance feedback.
21 * Revision 1.4 1995/09/08 08:54:04 adam
22 * More efficient and operation.
24 * Revision 1.3 1995/09/07 13:58:43 adam
25 * New parameter: result-set file descriptor (RSFD) to support multiple
26 * positions within the same result-set.
27 * Boolean operators: and, or, not implemented.
29 * Revision 1.2 1995/09/06 16:11:55 adam
30 * More work on boolean sets.
32 * Revision 1.1 1995/09/06 13:27:15 adam
33 * New set type: bool. Not finished yet.
43 static void *r_create(const struct rset_control *sel, void *parms);
44 static RSFD r_open (RSET ct, int flag);
45 static void r_close (RSFD rfd);
46 static void r_delete (RSET ct);
47 static void r_rewind (RSFD rfd);
48 static int r_count (RSET ct);
49 static int r_read_and (RSFD rfd, void *buf);
50 static int r_read_or (RSFD rfd, void *buf);
51 static int r_read_not (RSFD rfd, void *buf);
52 static int r_write (RSFD rfd, const void *buf);
53 static int r_score (RSFD rfd, int *score);
55 static const rset_control control_and =
69 static const rset_control control_or =
83 static const rset_control control_not =
98 const rset_control *rset_kind_and = &control_and;
99 const rset_control *rset_kind_or = &control_or;
100 const rset_control *rset_kind_not = &control_not;
102 struct rset_bool_info {
106 int (*cmp)(const void *p1, const void *p2);
107 struct rset_bool_rfd *rfd_list;
110 struct rset_bool_rfd {
117 struct rset_bool_rfd *next;
118 struct rset_bool_info *info;
121 static void *r_create (const struct rset_control *sel, void *parms)
123 rset_bool_parms *bool_parms = parms;
124 struct rset_bool_info *info;
126 info = xmalloc (sizeof(struct rset_bool_info));
127 info->key_size = bool_parms->key_size;
128 info->rset_l = bool_parms->rset_l;
129 info->rset_r = bool_parms->rset_r;
130 info->cmp = bool_parms->cmp;
131 info->rfd_list = NULL;
135 static RSFD r_open (RSET ct, int flag)
137 struct rset_bool_info *info = ct->buf;
138 struct rset_bool_rfd *rfd;
140 if (flag & RSETF_WRITE)
142 logf (LOG_FATAL, "bool set type is read-only");
146 rfd = xmalloc (sizeof(*rfd));
147 rfd->next = info->rfd_list;
148 info->rfd_list = rfd;
150 rfd->buf_l = xmalloc (info->key_size);
151 rfd->buf_r = xmalloc (info->key_size);
152 rfd->rfd_l = rset_open (info->rset_l, flag);
153 rfd->rfd_r = rset_open (info->rset_r, flag);
154 rfd->more_l = rset_read (info->rset_l, rfd->rfd_l, rfd->buf_l);
155 rfd->more_r = rset_read (info->rset_r, rfd->rfd_r, rfd->buf_r);
160 static void r_close (RSFD rfd)
162 struct rset_bool_info *info = ((struct rset_bool_rfd*)rfd)->info;
163 struct rset_bool_rfd **rfdp;
165 for (rfdp = &info->rfd_list; *rfdp; rfdp = &(*rfdp)->next)
168 xfree ((*rfdp)->buf_l);
169 xfree ((*rfdp)->buf_r);
170 rset_close (info->rset_l, (*rfdp)->rfd_l);
171 rset_close (info->rset_r, (*rfdp)->rfd_r);
172 *rfdp = (*rfdp)->next;
176 logf (LOG_FATAL, "r_close but no rfd match!");
180 static void r_delete (RSET ct)
182 struct rset_bool_info *info = ct->buf;
184 assert (info->rfd_list == NULL);
188 static void r_rewind (RSFD rfd)
190 struct rset_bool_info *info = ((struct rset_bool_rfd*)rfd)->info;
191 struct rset_bool_rfd *p = rfd;
193 logf (LOG_DEBUG, "rsbool_rewind");
194 rset_rewind (info->rset_l, p->rfd_l);
195 rset_rewind (info->rset_r, p->rfd_r);
196 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
197 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
200 static int r_count (RSET ct)
205 static int r_read_and (RSFD rfd, void *buf)
207 struct rset_bool_rfd *p = rfd;
208 struct rset_bool_info *info = p->info;
210 while (p->more_l && p->more_r)
214 cmp = (*info->cmp)(p->buf_l, p->buf_r);
217 memcpy (buf, p->buf_l, info->key_size);
218 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
219 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
224 memcpy (buf, p->buf_r, info->key_size);
225 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
230 memcpy (buf, p->buf_l, info->key_size);
231 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
235 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
237 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
242 static int r_read_or (RSFD rfd, void *buf)
244 struct rset_bool_rfd *p = rfd;
245 struct rset_bool_info *info = p->info;
247 while (p->more_l || p->more_r)
251 if (p->more_l && p->more_r)
252 cmp = (*info->cmp)(p->buf_l, p->buf_r);
259 memcpy (buf, p->buf_l, info->key_size);
260 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
261 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
266 memcpy (buf, p->buf_r, info->key_size);
267 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
272 memcpy (buf, p->buf_l, info->key_size);
273 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
280 static int r_read_not (RSFD rfd, void *buf)
282 struct rset_bool_rfd *p = rfd;
283 struct rset_bool_info *info = p->info;
285 while (p->more_l || p->more_r)
289 if (p->more_l && p->more_r)
290 cmp = (*info->cmp)(p->buf_l, p->buf_r);
297 memcpy (buf, p->buf_l, info->key_size);
298 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
302 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
305 memcpy (buf, p->buf_l, info->key_size);
308 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
311 cmp = (*info->cmp)(p->buf_l, buf);
312 } while (cmp >= -1 && cmp <= 1);
315 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
318 cmp = (*info->cmp)(p->buf_r, buf);
319 } while (cmp >= -1 && cmp <= 1);
326 static int r_write (RSFD rfd, const void *buf)
328 logf (LOG_FATAL, "bool set type is read-only");
332 static int r_score (RSFD rfd, int *score)