2 * Copyright (C) 1994-1995, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.6 1995-10-06 14:38:05 adam
8 * New result set method: r_score.
9 * Local no (sysno) and score is transferred to retrieveCtrl.
11 * Revision 1.5 1995/09/08 14:52:41 adam
12 * Work on relevance feedback.
14 * Revision 1.4 1995/09/08 08:54:04 adam
15 * More efficient and operation.
17 * Revision 1.3 1995/09/07 13:58:43 adam
18 * New parameter: result-set file descriptor (RSFD) to support multiple
19 * positions within the same result-set.
20 * Boolean operators: and, or, not implemented.
22 * Revision 1.2 1995/09/06 16:11:55 adam
23 * More work on boolean sets.
25 * Revision 1.1 1995/09/06 13:27:15 adam
26 * New set type: bool. Not finished yet.
36 static rset_control *r_create(const struct rset_control *sel, void *parms);
37 static RSFD r_open (rset_control *ct, int wflag);
38 static void r_close (RSFD rfd);
39 static void r_delete (rset_control *ct);
40 static void r_rewind (RSFD rfd);
41 static int r_count (rset_control *ct);
42 static int r_read_and (RSFD rfd, void *buf);
43 static int r_read_or (RSFD rfd, void *buf);
44 static int r_read_not (RSFD rfd, void *buf);
45 static int r_write (RSFD rfd, const void *buf);
46 static int r_score (RSFD rfd, int *score);
48 static const rset_control control_and =
63 static const rset_control control_or =
78 static const rset_control control_not =
94 const rset_control *rset_kind_and = &control_and;
95 const rset_control *rset_kind_or = &control_or;
96 const rset_control *rset_kind_not = &control_not;
98 struct rset_bool_info {
102 int (*cmp)(const void *p1, const void *p2);
103 struct rset_bool_rfd *rfd_list;
106 struct rset_bool_rfd {
113 struct rset_bool_rfd *next;
114 struct rset_bool_info *info;
117 static rset_control *r_create (const struct rset_control *sel, void *parms)
120 rset_bool_parms *bool_parms = parms;
121 struct rset_bool_info *info;
123 newct = xmalloc(sizeof(*newct));
124 memcpy (newct, sel, sizeof(*sel));
125 newct->buf = xmalloc (sizeof(struct rset_bool_info));
126 info = (struct rset_bool_info*) newct->buf;
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_control *ct, int wflag)
137 struct rset_bool_info *info = ct->buf;
138 struct rset_bool_rfd *rfd;
142 logf (LOG_FATAL, "bool set type is read-only");
145 rfd = xmalloc (sizeof(*rfd));
146 rfd->next = info->rfd_list;
147 info->rfd_list = rfd;
149 rfd->buf_l = xmalloc (info->key_size);
150 rfd->buf_r = xmalloc (info->key_size);
151 rfd->rfd_l = rset_open (info->rset_l, wflag);
152 rfd->rfd_r = rset_open (info->rset_r, wflag);
153 rfd->more_l = rset_read (info->rset_l, rfd->rfd_l, rfd->buf_l);
154 rfd->more_r = rset_read (info->rset_r, rfd->rfd_r, rfd->buf_r);
159 static void r_close (RSFD rfd)
161 struct rset_bool_info *info = ((struct rset_bool_rfd*)rfd)->info;
162 struct rset_bool_rfd **rfdp;
164 for (rfdp = &info->rfd_list; *rfdp; rfdp = &(*rfdp)->next)
167 xfree ((*rfdp)->buf_l);
168 xfree ((*rfdp)->buf_r);
169 rset_close (info->rset_l, (*rfdp)->rfd_l);
170 rset_close (info->rset_r, (*rfdp)->rfd_r);
171 *rfdp = (*rfdp)->next;
175 logf (LOG_FATAL, "r_close but no rfd match!");
179 static void r_delete (rset_control *ct)
181 struct rset_bool_info *info = ct->buf;
183 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_control *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)