fts-search.c revision c8b5a21a139992e66b4ad02adb69eaf929b3d024
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainen/* Copyright (c) 2006-2008 Dovecot authors, see the included COPYING file */
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainenuid_range_to_seqs(struct mailbox *box, const ARRAY_TYPE(seq_range) *uid_range,
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen unsigned int i, count;
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen for (i = 0; i < count; i++) {
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen mailbox_get_uids(box, range[i].seq1, range[i].seq2,
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen seq_range_array_add_range(seq_range, seq1, seq2);
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainenstatic void fts_uid_results_to_seq(struct fts_search_context *fctx)
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen uid_range_to_seqs(fctx->t->box, &uid_range, &fctx->definite_seqs);
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen uid_range_to_seqs(fctx->t->box, &uid_range, &fctx->maybe_seqs);
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenstatic int fts_search_lookup_arg(struct fts_search_context *fctx,
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen const char *key;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen /* we can filter out messages that don't have the header,
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen but we can't trust definite results list. */
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen /* we're only checking the existence
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen of the header. */
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen fctx->fbox->backend_fast : fctx->fbox->backend_substr;
cbc61fcb33b370d049c16a3c44568b4deb4e2b33Timo Sirainen /* can't filter this */
cbc61fcb33b370d049c16a3c44568b4deb4e2b33Timo Sirainen /* convert key to titlecase */
73b50eecfc31750a312e2f940023f522eb07178cTimo Sirainen if (charset_to_utf8_str(fctx->charset, CHARSET_FLAG_DECOMP_TITLECASE,
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen /* unknown charset, can't handle this */
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen /* let the core code handle this error */
4d2211dac61c615c5bdfd501ea54d46c89d41b0fTimo Sirainen } else if (!backend->locked && fts_backend_lock(backend) <= 0)
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen ret = fts_backend_lookup(backend, str_c(key_utf8), flags,
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen ret = fts_backend_filter(backend, str_c(key_utf8), flags,
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainenvoid fts_search_lookup(struct fts_search_context *fctx)
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen /* start filtering with the best arg */
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen ret = fts_search_lookup_arg(fctx, fctx->best_arg, FALSE);
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen /* filter the rest */
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen for (arg = fctx->args; arg != NULL && ret == 0; arg = arg->next) {
cbc61fcb33b370d049c16a3c44568b4deb4e2b33Timo Sirainen fts_backend_unlock(fctx->fbox->backend_substr);
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainenstatic bool arg_is_better(const struct mail_search_arg *new_arg,
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen /* avoid NOTs */
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen /* prefer not to use headers. they have a larger possibility of
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen having lots of identical strings */
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen return strlen(new_arg->value.str) > strlen(old_arg->value.str);
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainenfts_search_args_find_best(struct mail_search_arg *args,
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenvoid fts_search_analyze(struct fts_search_context *fctx)
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen struct mail_search_arg *best_fast_arg = NULL, *best_substr_arg = NULL;
cbc61fcb33b370d049c16a3c44568b4deb4e2b33Timo Sirainen fts_search_args_find_best(fctx->args, &best_fast_arg, &best_substr_arg);
cbc61fcb33b370d049c16a3c44568b4deb4e2b33Timo Sirainen if (best_fast_arg != NULL && fctx->fbox->backend_fast != NULL) {
cbc61fcb33b370d049c16a3c44568b4deb4e2b33Timo Sirainen /* use fast backend whenever possible */
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen fctx->build_backend = fctx->fbox->backend_fast;
cbc61fcb33b370d049c16a3c44568b4deb4e2b33Timo Sirainen } else if (best_fast_arg != NULL || best_substr_arg != NULL) {
cbc61fcb33b370d049c16a3c44568b4deb4e2b33Timo Sirainen fctx->build_backend = fctx->fbox->backend_substr;