2 c00beb4f 2022-04-14 op * Copyright (c) 2022 Omar Polo <op@omarpolo.com>
4 e2b5610c 2022-04-11 op * Permission to use, copy, modify, and distribute this software for any
5 e2b5610c 2022-04-11 op * purpose with or without fee is hereby granted, provided that the above
6 e2b5610c 2022-04-11 op * copyright notice and this permission notice appear in all copies.
8 e2b5610c 2022-04-11 op * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 e2b5610c 2022-04-11 op * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 e2b5610c 2022-04-11 op * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 e2b5610c 2022-04-11 op * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 e2b5610c 2022-04-11 op * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 e2b5610c 2022-04-11 op * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 e2b5610c 2022-04-11 op * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 e2b5610c 2022-04-11 op #include <stdio.h>
18 e2b5610c 2022-04-11 op #include <stdlib.h>
20 e2b5610c 2022-04-11 op #include "db.h"
21 e2b5610c 2022-04-11 op #include "fts.h"
22 e2b5610c 2022-04-11 op #include "tokenize.h"
24 e2b5610c 2022-04-11 op struct doclist {
25 e2b5610c 2022-04-11 op uint32_t *ids;
30 e2b5610c 2022-04-11 op fts(struct db *db, const char *query, db_hit_cb cb, void *data)
32 e2b5610c 2022-04-11 op struct doclist *xs = NULL;
33 e2b5610c 2022-04-11 op size_t i, len;
34 e2b5610c 2022-04-11 op char **toks, **t;
37 e2b5610c 2022-04-11 op if ((toks = tokenize(query)) == NULL)
41 e2b5610c 2022-04-11 op for (t = toks; *t != NULL; ++t)
47 e2b5610c 2022-04-11 op if ((xs = calloc(len, sizeof(*xs))) == NULL) {
48 e2b5610c 2022-04-11 op freetoks(toks);
52 e2b5610c 2022-04-11 op for (i = 0; i < len; ++i) {
53 e2b5610c 2022-04-11 op xs[i].ids = db_word_docs(db, toks[i], &xs[i].len);
54 e2b5610c 2022-04-11 op if (xs[i].ids == NULL || xs[i].len == 0)
59 e2b5610c 2022-04-11 op struct db_entry e;
60 e2b5610c 2022-04-11 op uint32_t mdoc;
62 e2b5610c 2022-04-11 op mdoc = xs[0].ids[0];
63 e2b5610c 2022-04-11 op for (i = 1; i < len; ++i) {
64 e2b5610c 2022-04-11 op if (xs[i].ids[0] > mdoc)
66 e2b5610c 2022-04-11 op while (xs[i].ids[0] < mdoc) {
67 e2b5610c 2022-04-11 op if (--xs[i].len == 0)
72 e2b5610c 2022-04-11 op if (xs[i].ids[0] != mdoc)
76 e2b5610c 2022-04-11 op if (db_doc_by_id(db, mdoc, &e) == -1) {
81 e2b5610c 2022-04-11 op if (cb(db, &e, data) == -1) {
87 e2b5610c 2022-04-11 op if (--xs[0].len == 0)
94 e2b5610c 2022-04-11 op freetoks(toks);