2 * Copyright (C) 1994-1996, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.2 1996-05-15 18:35:17 adam
8 * Implemented snot operation.
10 * Revision 1.1 1995/12/11 09:15:27 adam
11 * New set types: sand/sor/snot - ranked versions of and/or/not in
12 * ranked/semi-ranked result sets.
13 * Note: the snot not finished yet.
14 * New rset member: flag.
15 * Bug fix: r_delete in rsrel.c did free bad memory block.
25 static void *r_create_and(const struct rset_control *sel, void *parms,
27 static void *r_create_or(const struct rset_control *sel, void *parms,
29 static void *r_create_not(const struct rset_control *sel, void *parms,
31 static RSFD r_open (RSET ct, int flag);
32 static void r_close (RSFD rfd);
33 static void r_delete (RSET ct);
34 static void r_rewind (RSFD rfd);
35 static int r_count (RSET ct);
36 static int r_read (RSFD rfd, void *buf);
37 static int r_write (RSFD rfd, const void *buf);
38 static int r_score (RSFD rfd, int *score);
40 static const rset_control control_sand =
54 static const rset_control control_sor =
68 static const rset_control control_snot =
83 const rset_control *rset_kind_sand = &control_sand;
84 const rset_control *rset_kind_sor = &control_sor;
85 const rset_control *rset_kind_snot = &control_snot;
87 struct rset_bool_info {
95 int (*cmp)(const void *p1, const void *p2);
96 struct rset_bool_rfd *rfd_list;
99 struct rset_bool_rfd {
100 struct rset_bool_rfd *next;
101 struct rset_bool_info *info;
107 static void *r_create_common (const struct rset_control *sel,
108 rset_bool_parms *bool_parms, int *flags);
110 static void key_add (struct rset_bool_info *info,
111 char *buf, int score)
113 if (info->key_no == info->key_max)
115 memcpy (info->key_buf + info->key_size * info->key_no,
116 buf, info->key_size);
117 info->score_buf[info->key_no] = score;
121 static void *r_create_and (const struct rset_control *sel, void *parms,
128 struct rset_bool_info *info;
129 info = r_create_common (sel, parms, flags);
131 buf_l = xmalloc (info->key_size);
132 buf_r = xmalloc (info->key_size);
133 fd_l = rset_open (info->rset_l, RSETF_SORT_SYSNO|RSETF_READ);
134 fd_r = rset_open (info->rset_r, RSETF_SORT_SYSNO|RSETF_READ);
136 more_l = rset_read(info->rset_l, fd_l, buf_l);
137 more_r = rset_read(info->rset_r, fd_r, buf_r);
139 while (more_l || more_r)
142 int score, score_l, score_r;
144 if (more_l && more_r)
145 cmp = (*info->cmp)(buf_l, buf_r);
151 if (cmp >= -1 && cmp <= 1)
153 rset_score (info->rset_l, fd_l, &score_l);
154 rset_score (info->rset_r, fd_r, &score_r);
157 else if (score_r == -1)
160 score = score_l > score_r ? score_r : score_l;
161 key_add (info, buf_l, score);
163 more_l = rset_read (info->rset_l, fd_l, buf_l);
164 more_r = rset_read (info->rset_r, fd_r, buf_r);
168 rset_score (info->rset_r, fd_r, &score_r);
170 key_add (info, buf_r, 1);
171 more_r = rset_read (info->rset_r, fd_r, buf_r);
175 rset_score (info->rset_l, fd_l, &score_l);
177 key_add (info, buf_l, 1);
178 more_l = rset_read (info->rset_l, fd_l, buf_l);
181 rset_close (info->rset_l, fd_l);
182 rset_close (info->rset_r, fd_r);
183 rset_delete (info->rset_l);
184 rset_delete (info->rset_r);
190 static void *r_create_or (const struct rset_control *sel, void *parms,
197 struct rset_bool_info *info;
198 info = r_create_common (sel, parms, flags);
200 buf_l = xmalloc (info->key_size);
201 buf_r = xmalloc (info->key_size);
202 fd_l = rset_open (info->rset_l, RSETF_SORT_SYSNO|RSETF_READ);
203 fd_r = rset_open (info->rset_r, RSETF_SORT_SYSNO|RSETF_READ);
205 more_l = rset_read(info->rset_l, fd_l, buf_l);
206 more_r = rset_read(info->rset_r, fd_r, buf_r);
208 while (more_l || more_r)
211 int score, score_l, score_r;
213 if (more_l && more_r)
214 cmp = (*info->cmp)(buf_l, buf_r);
220 if (cmp >= -1 && cmp <= 1)
222 rset_score (info->rset_l, fd_l, &score_l);
223 rset_score (info->rset_r, fd_r, &score_r);
226 else if (score_r == -1)
229 score = score_r > score_l ? score_r : score_l;
230 key_add (info, buf_l, score);
232 more_l = rset_read (info->rset_l, fd_l, buf_l);
233 more_r = rset_read (info->rset_r, fd_r, buf_r);
237 rset_score (info->rset_r, fd_r, &score_r);
239 key_add (info, buf_r, score_r / 2);
240 more_r = rset_read (info->rset_r, fd_r, buf_r);
244 rset_score (info->rset_l, fd_l, &score_l);
246 key_add (info, buf_l, score_l / 2);
247 more_l = rset_read (info->rset_l, fd_l, buf_l);
250 rset_close (info->rset_l, fd_l);
251 rset_close (info->rset_r, fd_r);
252 rset_delete (info->rset_l);
253 rset_delete (info->rset_r);
259 static void *r_create_not (const struct rset_control *sel, void *parms,
266 struct rset_bool_info *info;
267 info = r_create_common (sel, parms, flags);
269 buf_l = xmalloc (info->key_size);
270 buf_r = xmalloc (info->key_size);
272 fd_l = rset_open (info->rset_l, RSETF_SORT_SYSNO|RSETF_READ);
273 fd_r = rset_open (info->rset_r, RSETF_SORT_SYSNO|RSETF_READ);
275 more_l = rset_read(info->rset_l, fd_l, buf_l);
276 more_r = rset_read(info->rset_r, fd_r, buf_r);
278 while (more_l || more_r)
283 if (more_l && more_r)
284 cmp = (*info->cmp)(buf_l, buf_r);
290 if (cmp >= -1 && cmp <= 1)
291 more_l = rset_read (info->rset_l, fd_l, buf_l);
294 more_r = rset_read (info->rset_r, fd_r, buf_r);
298 rset_score (info->rset_l, fd_l, &score);
299 key_add (info, buf_l, score == -1 ? 1 : score);
300 more_l = rset_read (info->rset_l, fd_l, buf_l);
303 rset_close (info->rset_l, fd_l);
304 rset_close (info->rset_r, fd_r);
306 rset_delete (info->rset_l);
307 rset_delete (info->rset_r);
313 static void *r_create_common (const struct rset_control *sel,
314 rset_bool_parms *bool_parms, int *flags)
316 struct rset_bool_info *info;
318 info = xmalloc (sizeof(*info));
319 info->key_size = bool_parms->key_size;
320 info->rset_l = bool_parms->rset_l;
321 info->rset_r = bool_parms->rset_r;
322 info->cmp = bool_parms->cmp;
323 info->rfd_list = NULL;
325 if (rset_is_ranked(info->rset_l) || rset_is_ranked(info->rset_r))
326 *flags |= RSET_FLAG_RANKED;
328 info->key_max = rset_count(bool_parms->rset_l)
329 +rset_count(bool_parms->rset_r);
332 if (info->key_max > 1000)
333 info->key_max = 1000;
334 info->key_buf = xmalloc (info->key_size * info->key_max);
335 info->score_buf = xmalloc (info->key_max * sizeof(*info->score_buf));
341 static RSFD r_open (RSET ct, int flag)
343 struct rset_bool_info *info = ct->buf;
344 struct rset_bool_rfd *rfd;
346 if (flag & RSETF_WRITE)
348 logf (LOG_FATAL, "sbool set type is read-only");
351 rfd = xmalloc (sizeof(*rfd));
352 rfd->next = info->rfd_list;
353 info->rfd_list = rfd;
358 rfd->open_flag = flag;
363 static void r_close (RSFD rfd)
365 struct rset_bool_info *info = ((struct rset_bool_rfd*)rfd)->info;
366 struct rset_bool_rfd **rfdp;
368 for (rfdp = &info->rfd_list; *rfdp; rfdp = &(*rfdp)->next)
371 *rfdp = (*rfdp)->next;
375 logf (LOG_FATAL, "r_close but no rfd match!");
379 static void r_delete (RSET ct)
381 struct rset_bool_info *info = ct->buf;
383 assert (info->rfd_list == NULL);
384 xfree (info->score_buf);
385 xfree (info->key_buf);
389 static void r_rewind (RSFD rfd)
391 struct rset_bool_rfd *p = rfd;
393 logf (LOG_DEBUG, "rsbool_rewind");
394 p->position = p->last_pos = 0;
397 static int r_count (RSET ct)
399 struct rset_bool_info *info = ct->buf;
404 static int r_read (RSFD rfd, void *buf)
406 struct rset_bool_rfd *p = rfd;
407 struct rset_bool_info *info = p->info;
409 if (p->position >= info->key_no)
411 p->last_pos = (p->position)++;
412 memcpy (buf, info->key_buf + info->key_size * p->last_pos,
417 static int r_write (RSFD rfd, const void *buf)
419 logf (LOG_FATAL, "sbool set type is read-only");
423 static int r_score (RSFD rfd, int *score)
425 struct rset_bool_rfd *p = rfd;
426 struct rset_bool_info *info = p->info;
428 *score = info->score_buf[p->last_pos];