annotate src/plugins/fts/fts-search.c @ 7376:1307a1702e5e HEAD

Small optimization.
author Timo Sirainen <tss@iki.fi>
date Sat, 08 Mar 2008 04:03:45 +0200
parents c3d829cdbfa5
children 077bb84e9e77
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7086
7ed926ed7aa4 Updated copyright notices to include year 2008.
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
1 /* Copyright (c) 2006-2008 Dovecot authors, see the included COPYING file */
6903
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 unsigned int i, count;
7376
1307a1702e5e Small optimization.
Timo Sirainen <tss@iki.fi>
parents: 7251
diff changeset
19 uint32_t seq1, seq2;
6903
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,
7376
1307a1702e5e Small optimization.
Timo Sirainen <tss@iki.fi>
parents: 7251
diff changeset
25 &seq1, &seq2);
1307a1702e5e Small optimization.
Timo Sirainen <tss@iki.fi>
parents: 7251
diff changeset
26 if (seq1 != 0)
1307a1702e5e Small optimization.
Timo Sirainen <tss@iki.fi>
parents: 7251
diff changeset
27 seq_range_array_add_range(seq_range, seq1, seq2);
6903
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 uid_range_to_seqs(fctx->t->box, &uid_range, &fctx->definite_seqs);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 array_free(&uid_range);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 uid_range = fctx->maybe_seqs;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 uid_range_to_seqs(fctx->t->box, &uid_range, &fctx->maybe_seqs);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 array_free(&uid_range);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 }
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 static int fts_search_lookup_arg(struct fts_search_context *fctx,
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 struct mail_search_arg *arg, bool filter)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 struct fts_backend *backend;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 enum fts_lookup_flags flags = 0;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 const char *key;
6911
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
50 string_t *key_utf8;
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
51 enum charset_result result;
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
52 int ret;
6903
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 switch (arg->type) {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 case SEARCH_HEADER:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 /* we can filter out messages that don't have the header,
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 but we can't trust definite results list. */
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 flags = FTS_LOOKUP_FLAG_HEADER;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 backend = fctx->fbox->backend_substr;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 key = arg->value.str;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 if (*key == '\0') {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 /* we're only checking the existence
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 of the header. */
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 key = arg->hdr_field_name;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 }
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 break;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 case SEARCH_TEXT:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 case SEARCH_TEXT_FAST:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 flags = FTS_LOOKUP_FLAG_HEADER;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 case SEARCH_BODY:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 case SEARCH_BODY_FAST:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 flags |= FTS_LOOKUP_FLAG_BODY;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 key = arg->value.str;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 backend = fctx->fbox->backend_fast != NULL &&
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 (arg->type == SEARCH_TEXT_FAST ||
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 arg->type == SEARCH_BODY_FAST) ?
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 fctx->fbox->backend_fast : fctx->fbox->backend_substr;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 break;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 default:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 /* can't filter this */
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 i_assert(filter);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 return 0;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 }
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 if (arg->not)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 flags |= FTS_LOOKUP_FLAG_INVERT;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86
6911
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
87 /* convert key to titlecase */
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
88 key_utf8 = t_str_new(128);
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
89 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
90 key, key_utf8, &result) < 0) {
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
91 /* unknown charset, can't handle this */
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
92 ret = 0;
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
93 } else if (result != CHARSET_RET_OK) {
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
94 /* let the core code handle this error */
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 (!backend->locked && fts_backend_lock(backend) <= 0)
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
97 ret = -1;
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
98 else if (!filter) {
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
99 ret = fts_backend_lookup(backend, str_c(key_utf8), flags,
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
100 &fctx->definite_seqs,
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
101 &fctx->maybe_seqs);
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
102 } else {
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
103 ret = fts_backend_filter(backend, str_c(key_utf8), flags,
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
104 &fctx->definite_seqs,
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
105 &fctx->maybe_seqs);
6903
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 }
6911
a215deb3de8d Fixed non-ASCII searches.
Timo Sirainen <tss@iki.fi>
parents: 6903
diff changeset
107 return ret;
6903
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 }
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 void fts_search_lookup(struct fts_search_context *fctx)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 struct mail_search_arg *arg;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 int ret;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 if (fctx->best_arg == NULL)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 return;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 i_array_init(&fctx->definite_seqs, 64);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 i_array_init(&fctx->maybe_seqs, 64);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 /* start filtering with the best arg */
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
122 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6911
diff changeset
123 ret = fts_search_lookup_arg(fctx, fctx->best_arg, FALSE);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
124 } T_END;
6903
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 /* filter the rest */
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 for (arg = fctx->args; arg != NULL && ret == 0; arg = arg->next) {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6911
diff changeset
127 if (arg != fctx->best_arg) {
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
128 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6911
diff changeset
129 ret = fts_search_lookup_arg(fctx, arg, TRUE);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
130 } T_END;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6911
diff changeset
131 }
6903
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
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 if (fctx->fbox->backend_fast != NULL &&
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 fctx->fbox->backend_fast->locked)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 fts_backend_unlock(fctx->fbox->backend_fast);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 if (fctx->fbox->backend_substr != NULL &&
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 fctx->fbox->backend_substr->locked)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 fts_backend_unlock(fctx->fbox->backend_substr);
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 if (ret == 0) {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 fctx->seqs_set = TRUE;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 fts_uid_results_to_seq(fctx);
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
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 static bool arg_is_better(const struct mail_search_arg *new_arg,
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 const struct mail_search_arg *old_arg)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 if (old_arg == NULL)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 return TRUE;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 if (new_arg == NULL)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 return FALSE;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 /* avoid NOTs */
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 if (old_arg->not && !new_arg->not)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 return TRUE;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 if (!old_arg->not && new_arg->not)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 return FALSE;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 /* prefer not to use headers. they have a larger possibility of
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 having lots of identical strings */
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 if (old_arg->type == SEARCH_HEADER)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 return TRUE;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 else if (new_arg->type == SEARCH_HEADER)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 return FALSE;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 return strlen(new_arg->value.str) > strlen(old_arg->value.str);
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
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 static void
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 fts_search_args_find_best(struct mail_search_arg *args,
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 struct mail_search_arg **best_fast_arg,
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 struct mail_search_arg **best_substr_arg)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 for (; args != NULL; args = args->next) {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 switch (args->type) {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 case SEARCH_BODY_FAST:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 case SEARCH_TEXT_FAST:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 if (arg_is_better(args, *best_fast_arg))
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 *best_fast_arg = args;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 break;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 case SEARCH_BODY:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 case SEARCH_TEXT:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 case SEARCH_HEADER:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 if (arg_is_better(args, *best_substr_arg))
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 *best_substr_arg = args;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 break;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 default:
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 break;
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
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 void fts_search_analyze(struct fts_search_context *fctx)
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 struct mail_search_arg *best_fast_arg = NULL, *best_substr_arg = NULL;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 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
200
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 if (best_fast_arg != NULL && fctx->fbox->backend_fast != NULL) {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 /* use fast backend whenever possible */
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 fctx->best_arg = best_fast_arg;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 fctx->build_backend = fctx->fbox->backend_fast;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 } else if (best_fast_arg != NULL || best_substr_arg != NULL) {
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 fctx->build_backend = fctx->fbox->backend_substr;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 fctx->best_arg = arg_is_better(best_substr_arg, best_fast_arg) ?
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 best_substr_arg : best_fast_arg;
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 }
a8d3513b54c5 Added missing files.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 }