annotate src/plugins/fts/fts-search.c @ 6911:a215deb3de8d HEAD

Fixed non-ASCII searches.
author Timo Sirainen <tss@iki.fi>
date Mon, 03 Dec 2007 14:23:45 +0200
parents a8d3513b54c5
children 414c9d631a81
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6903
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (c) 2006-2007 Dovecot authors, see the included COPYING file */
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "array.h"
6911
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
5 #include "str.h"
6903
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "seq-range-array.h"
6911
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
7 #include "charset-utf8.h"
6903
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "mail-search.h"
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "mail-storage-private.h"
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "fts-api-private.h"
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "fts-storage.h"
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 static void
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 uid_range_to_seqs(struct mailbox *box, const ARRAY_TYPE(seq_range) *uid_range,
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 ARRAY_TYPE(seq_range) *seq_range)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 const struct seq_range *range;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 struct seq_range new_range;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 unsigned int i, count;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 range = array_get(uid_range, &count);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 i_array_init(seq_range, count);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 for (i = 0; i < count; i++) {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 mailbox_get_uids(box, range[i].seq1, range[i].seq2,
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 &new_range.seq1, &new_range.seq2);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 if (new_range.seq1 != 0)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 array_append(seq_range, &new_range, 1);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 }
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 }
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 static void fts_uid_results_to_seq(struct fts_search_context *fctx)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 ARRAY_TYPE(seq_range) uid_range;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 uid_range = fctx->definite_seqs;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 i_array_init(&fctx->definite_seqs, array_count(&uid_range));
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 uid_range_to_seqs(fctx->t->box, &uid_range, &fctx->definite_seqs);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 array_free(&uid_range);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 uid_range = fctx->maybe_seqs;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 i_array_init(&fctx->maybe_seqs, array_count(&uid_range));
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 uid_range_to_seqs(fctx->t->box, &uid_range, &fctx->maybe_seqs);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 array_free(&uid_range);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 }
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 static int fts_search_lookup_arg(struct fts_search_context *fctx,
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 struct mail_search_arg *arg, bool filter)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 struct fts_backend *backend;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 enum fts_lookup_flags flags = 0;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 const char *key;
6911
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
52 string_t *key_utf8;
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
53 enum charset_result result;
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
54 int ret;
6903
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 switch (arg->type) {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 case SEARCH_HEADER:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 /* we can filter out messages that don't have the header,
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 but we can't trust definite results list. */
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 flags = FTS_LOOKUP_FLAG_HEADER;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 backend = fctx->fbox->backend_substr;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 key = arg->value.str;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 if (*key == '\0') {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 /* we're only checking the existence
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 of the header. */
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 key = arg->hdr_field_name;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 }
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 break;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 case SEARCH_TEXT:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 case SEARCH_TEXT_FAST:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 flags = FTS_LOOKUP_FLAG_HEADER;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 case SEARCH_BODY:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 case SEARCH_BODY_FAST:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 flags |= FTS_LOOKUP_FLAG_BODY;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 key = arg->value.str;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 backend = fctx->fbox->backend_fast != NULL &&
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 (arg->type == SEARCH_TEXT_FAST ||
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 arg->type == SEARCH_BODY_FAST) ?
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 fctx->fbox->backend_fast : fctx->fbox->backend_substr;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 break;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 default:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 /* can't filter this */
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 i_assert(filter);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 return 0;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 }
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 if (arg->not)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 flags |= FTS_LOOKUP_FLAG_INVERT;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88
6911
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
89 /* convert key to titlecase */
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
90 t_push();
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
91 key_utf8 = t_str_new(128);
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
92 if (charset_to_utf8_str(fctx->charset, CHARSET_FLAG_DECOMP_TITLECASE,
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
93 key, key_utf8, &result) < 0) {
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
94 /* unknown charset, can't handle this */
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
95 ret = 0;
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
96 } else if (result != CHARSET_RET_OK) {
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
97 /* let the core code handle this error */
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
98 ret = 0;
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
99 } else if (!backend->locked && fts_backend_lock(backend) <= 0)
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
100 ret = -1;
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
101 else if (!filter) {
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
102 ret = fts_backend_lookup(backend, str_c(key_utf8), flags,
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
103 &fctx->definite_seqs,
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
104 &fctx->maybe_seqs);
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
105 } else {
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
106 ret = fts_backend_filter(backend, str_c(key_utf8), flags,
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
107 &fctx->definite_seqs,
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
108 &fctx->maybe_seqs);
6903
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 }
6911
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
110 t_pop();
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
111 return ret;
6903
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 }
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 void fts_search_lookup(struct fts_search_context *fctx)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 struct mail_search_arg *arg;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117 int ret;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 if (fctx->best_arg == NULL)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 return;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 i_array_init(&fctx->definite_seqs, 64);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 i_array_init(&fctx->maybe_seqs, 64);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 /* start filtering with the best arg */
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 ret = fts_search_lookup_arg(fctx, fctx->best_arg, FALSE);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 /* filter the rest */
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 for (arg = fctx->args; arg != NULL && ret == 0; arg = arg->next) {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 if (arg != fctx->best_arg)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 ret = fts_search_lookup_arg(fctx, arg, TRUE);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 }
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 if (fctx->fbox->backend_fast != NULL &&
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 fctx->fbox->backend_fast->locked)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 fts_backend_unlock(fctx->fbox->backend_fast);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 if (fctx->fbox->backend_substr != NULL &&
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 fctx->fbox->backend_substr->locked)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 fts_backend_unlock(fctx->fbox->backend_substr);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 if (ret == 0) {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 fctx->seqs_set = TRUE;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 fts_uid_results_to_seq(fctx);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 }
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 }
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 static bool arg_is_better(const struct mail_search_arg *new_arg,
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 const struct mail_search_arg *old_arg)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 if (old_arg == NULL)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 return TRUE;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 if (new_arg == NULL)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 return FALSE;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 /* avoid NOTs */
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 if (old_arg->not && !new_arg->not)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 return TRUE;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 if (!old_arg->not && new_arg->not)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 return FALSE;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 /* prefer not to use headers. they have a larger possibility of
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 having lots of identical strings */
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 if (old_arg->type == SEARCH_HEADER)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 return TRUE;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 else if (new_arg->type == SEARCH_HEADER)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 return FALSE;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 return strlen(new_arg->value.str) > strlen(old_arg->value.str);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 }
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 static void
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 fts_search_args_find_best(struct mail_search_arg *args,
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 struct mail_search_arg **best_fast_arg,
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 struct mail_search_arg **best_substr_arg)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 for (; args != NULL; args = args->next) {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 switch (args->type) {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 case SEARCH_BODY_FAST:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 case SEARCH_TEXT_FAST:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 if (arg_is_better(args, *best_fast_arg))
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 *best_fast_arg = args;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 break;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 case SEARCH_BODY:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 case SEARCH_TEXT:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 case SEARCH_HEADER:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 if (arg_is_better(args, *best_substr_arg))
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 *best_substr_arg = args;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 break;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 default:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 break;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 }
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191 }
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 }
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 void fts_search_analyze(struct fts_search_context *fctx)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 struct mail_search_arg *best_fast_arg = NULL, *best_substr_arg = NULL;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 fts_search_args_find_best(fctx->args, &best_fast_arg, &best_substr_arg);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 if (best_fast_arg != NULL && fctx->fbox->backend_fast != NULL) {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 /* use fast backend whenever possible */
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 fctx->best_arg = best_fast_arg;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 fctx->build_backend = fctx->fbox->backend_fast;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 } else if (best_fast_arg != NULL || best_substr_arg != NULL) {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 fctx->build_backend = fctx->fbox->backend_substr;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 fctx->best_arg = arg_is_better(best_substr_arg, best_fast_arg) ?
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 best_substr_arg : best_fast_arg;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 }
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 }