dovecot-2.2: fts: Fixed FTS search query generation after earlie...

dovecot at dovecot.org dovecot at dovecot.org
Fri Dec 4 12:18:01 UTC 2015


details:   http://hg.dovecot.org/dovecot-2.2/rev/93b0474fe9d6
changeset: 19462:93b0474fe9d6
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Dec 04 14:17:45 2015 +0200
description:
fts: Fixed FTS search query generation after earlier per-language tokenizer changes.

diffstat:

 src/plugins/fts/fts-search-args.c |  43 ++++++++++++++++++++++++--------------
 1 files changed, 27 insertions(+), 16 deletions(-)

diffs (101 lines):

diff -r 9a81cb959ce6 -r 93b0474fe9d6 src/plugins/fts/fts-search-args.c
--- a/src/plugins/fts/fts-search-args.c	Fri Dec 04 13:46:00 2015 +0200
+++ b/src/plugins/fts/fts-search-args.c	Fri Dec 04 14:17:45 2015 +0200
@@ -36,14 +36,13 @@
 	/* create the OR arg first as the parent */
 	or_arg = p_new(pool, struct mail_search_arg, 1);
 	or_arg->type = SEARCH_OR;
-	or_arg->next = orig_arg->next;
 
 	/* now create all the child args for the OR */
 	argp = &or_arg->value.subargs;
 	array_foreach(tokens, tokenp) {
 		arg = p_new(pool, struct mail_search_arg, 1);
 		*arg = *orig_arg;
-		arg->match_not = FALSE; /* we copied this to the parent SUB */
+		arg->match_not = FALSE; /* we copied this to the root OR */
 		arg->next = NULL;
 		arg->value.str = p_strdup(pool, *tokenp);
 
@@ -95,14 +94,23 @@
 
 static int
 fts_backend_dovecot_tokenize_lang(struct fts_user_language *user_lang,
-				  pool_t pool, struct mail_search_arg *and_arg,
+				  pool_t pool, struct mail_search_arg *or_arg,
 				  struct mail_search_arg *orig_arg,
 				  const char *orig_token, const char **error_r)
 {
 	unsigned int orig_token_len = strlen(orig_token);
+	struct mail_search_arg *and_arg;
 	const char *token, *error;
 	int ret;
 
+	/* we want all the tokens found from the string to be found, so create
+	   a parent AND and place all the filtered token alternatives under
+	   it */
+	and_arg = p_new(pool, struct mail_search_arg, 1);
+	and_arg->type = SEARCH_SUB;
+	and_arg->next = or_arg->value.subargs;
+	or_arg->value.subargs = and_arg;
+
 	/* reset tokenizer between search args in case there's any state left
 	   from some previous failure */
 	fts_tokenizer_reset(user_lang->search_tokenizer);
@@ -125,6 +133,10 @@
 		*error_r = t_strdup_printf("Couldn't tokenize search args: %s", error);
 		return -1;
 	}
+	if (and_arg->value.subargs == NULL) {
+		/* nothing was actually expanded, remove the empty and_arg */
+		or_arg->value.subargs = NULL;
+	}
 	return 0;
 }
 
@@ -133,33 +145,32 @@
 {
 	const ARRAY_TYPE(fts_user_language) *languages;
 	struct fts_user_language *const *langp;
-	struct mail_search_arg *and_arg, *orig_arg = *argp;
+	struct mail_search_arg *or_arg, *orig_arg = *argp;
 	const char *error, *orig_token = orig_arg->value.str;
 
 	languages = fts_user_get_all_languages(backend->ns->user);
 
-	/* we want all the tokens found from the string to be found, so create
-	   a parent AND and place all the filtered token alternatives under
-	   it */
-	and_arg = p_new(pool, struct mail_search_arg, 1);
-	and_arg->type = SEARCH_SUB;
-	and_arg->match_not = orig_arg->match_not;
-	and_arg->next = orig_arg->next;
+	/* OR together all the different expansions for different languages.
+	   it's enough for one of them to match. */
+	or_arg = p_new(pool, struct mail_search_arg, 1);
+	or_arg->type = SEARCH_OR;
+	or_arg->match_not = orig_arg->match_not;
+	or_arg->next = orig_arg->next;
 
 	array_foreach(languages, langp) {
-		if (fts_backend_dovecot_tokenize_lang(*langp, pool, and_arg,
+		if (fts_backend_dovecot_tokenize_lang(*langp, pool, or_arg,
 						      orig_arg, orig_token, &error) < 0) {
 			i_error("fts: %s", error);
 			return -1;
 		}
 	}
 
-	if (and_arg->value.subargs == NULL) {
+	if (or_arg->value.subargs == NULL) {
 		/* we couldn't parse any tokens from the input */
-		and_arg->type = SEARCH_ALL;
-		and_arg->match_not = !and_arg->match_not;
+		or_arg->type = SEARCH_ALL;
+		or_arg->match_not = !or_arg->match_not;
 	}
-	*argp = and_arg;
+	*argp = or_arg;
 	return 0;
 }
 


More information about the dovecot-cvs mailing list