[geary/mjog/search-update: 4/10] Geary.ImapDb.SearchQuery: Require stemmer to be passed in to ctor
- From: Michael Gratton <mjog src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary/mjog/search-update: 4/10] Geary.ImapDb.SearchQuery: Require stemmer to be passed in to ctor
- Date: Wed, 4 Nov 2020 13:51:25 +0000 (UTC)
commit 4fb360d4de618f8557b42f27e8f42de101e67d30
Author: Michael Gratton <mike vee net>
Date: Wed Nov 4 19:01:48 2020 +1100
Geary.ImapDb.SearchQuery: Require stemmer to be passed in to ctor
Since constructing a libstemmer object is non trivial, this allows a
per-account instance to be created just once, and improves testability.
src/engine/imap-db/imap-db-search-query.vala | 50 ++--------------------
.../imap-engine/imap-engine-generic-account.vala | 48 ++++++++++++++++++++-
2 files changed, 50 insertions(+), 48 deletions(-)
---
diff --git a/src/engine/imap-db/imap-db-search-query.vala b/src/engine/imap-db/imap-db-search-query.vala
index 21dee990c..9e2c38e97 100644
--- a/src/engine/imap-db/imap-db-search-query.vala
+++ b/src/engine/imap-db/imap-db-search-query.vala
@@ -319,18 +319,19 @@ private class Geary.ImapDB.SearchQuery : Geary.SearchQuery {
// A list of all search terms, regardless of search op field name
private Gee.ArrayList<Term> all = new Gee.ArrayList<Term>();
- private SnowBall.Stemmer stemmer;
+ private unowned SnowBall.Stemmer stemmer;
public async SearchQuery(Geary.Account owner,
ImapDB.Account local,
Gee.Collection<Geary.SearchQuery.Term> expression,
string raw,
+ SnowBall.Stemmer stemmer,
Geary.SearchQuery.Strategy strategy,
GLib.Cancellable? cancellable) {
base(expression, raw);
this.account = local;
- this.stemmer = new SnowBall.Stemmer(find_appropriate_search_stemmer());
+ this.stemmer = stemmer;
switch (strategy) {
case Strategy.EXACT:
@@ -674,49 +675,4 @@ private class Geary.ImapDB.SearchQuery : Geary.SearchQuery {
return stemmed;
}
- private string find_appropriate_search_stemmer() {
- // Unfortunately, the stemmer library only accepts the full language
- // name for the stemming algorithm. This translates between the user's
- // preferred language ISO 639-1 code and our available stemmers.
- // FIXME: the available list here is determined by what's included in
- // src/sqlite3-unicodesn/CMakeLists.txt. We should pass that list in
- // instead of hardcoding it here.
- foreach (string l in Intl.get_language_names()) {
- switch (l) {
- case "ar": return "arabic";
- case "eu": return "basque";
- case "ca": return "catalan";
- case "da": return "danish";
- case "nl": return "dutch";
- case "en": return "english";
- case "fi": return "finnish";
- case "fr": return "french";
- case "de": return "german";
- case "el": return "greek";
- case "hi": return "hindi";
- case "hu": return "hungarian";
- case "id": return "indonesian";
- case "ga": return "irish";
- case "it": return "italian";
- case "lt": return "lithuanian";
- case "ne": return "nepali";
- case "no": return "norwegian";
- case "pt": return "portuguese";
- case "ro": return "romanian";
- case "ru": return "russian";
- case "sr": return "serbian";
- case "es": return "spanish";
- case "sv": return "swedish";
- case "ta": return "tamil";
- case "tr": return "turkish";
- }
- }
-
- // Default to English because it seems to be on average the language
- // most likely to be present in emails, regardless of the user's
- // language setting. This is not an exact science, and search results
- // should be ok either way in most cases.
- return "english";
- }
-
}
diff --git a/src/engine/imap-engine/imap-engine-generic-account.vala
b/src/engine/imap-engine/imap-engine-generic-account.vala
index 070246586..4282ca046 100644
--- a/src/engine/imap-engine/imap-engine-generic-account.vala
+++ b/src/engine/imap-engine/imap-engine-generic-account.vala
@@ -60,6 +60,8 @@ private abstract class Geary.ImapEngine.GenericAccount : Geary.Account {
private Gee.Map<Folder.SpecialUse,Gee.List<string>> special_search_names =
new Gee.HashMap<Folder.SpecialUse,Gee.List<string>>();
+ private SnowBall.Stemmer stemmer;
+
protected GenericAccount(AccountInformation config,
ImapDB.Account local,
@@ -107,6 +109,7 @@ private abstract class Geary.ImapEngine.GenericAccount : Geary.Account {
this.db_vacuum_monitor = local.vacuum_monitor;
compile_special_search_names();
+ this.stemmer = new SnowBall.Stemmer(find_appropriate_search_stemmer());
}
/** {@inheritDoc} */
@@ -578,7 +581,7 @@ private abstract class Geary.ImapEngine.GenericAccount : Geary.Account {
GLib.Cancellable? cancellable
) throws GLib.Error {
return yield new ImapDB.SearchQuery(
- this, this.local, expression, text, EXACT, cancellable
+ this, this.local, expression, text, this.stemmer, EXACT, cancellable
);
}
@@ -1064,6 +1067,49 @@ private abstract class Geary.ImapEngine.GenericAccount : Geary.Account {
throw new EngineError.OPEN_REQUIRED("Account %s not opened", to_string());
}
+ private string find_appropriate_search_stemmer() {
+ // Unfortunately, the stemmer library only accepts the full
+ // language name for the stemming algorithm. This translates
+ // between the desktop sessions's preferred language ISO 639-1
+ // code and the available stemmers.
+ //
+ // FIXME: the available list here is determined by what's
+ // included in libstemmer. We should pass that list in instead
+ // of hardcoding it here.
+ foreach (string l in Intl.get_language_names()) {
+ switch (l) {
+ case "ar": return "arabic";
+ case "eu": return "basque";
+ case "ca": return "catalan";
+ case "da": return "danish";
+ case "nl": return "dutch";
+ case "en": return "english";
+ case "fi": return "finnish";
+ case "fr": return "french";
+ case "de": return "german";
+ case "el": return "greek";
+ case "hi": return "hindi";
+ case "hu": return "hungarian";
+ case "id": return "indonesian";
+ case "ga": return "irish";
+ case "it": return "italian";
+ case "lt": return "lithuanian";
+ case "ne": return "nepali";
+ case "no": return "norwegian";
+ case "pt": return "portuguese";
+ case "ro": return "romanian";
+ case "ru": return "russian";
+ case "sr": return "serbian";
+ case "es": return "spanish";
+ case "sv": return "swedish";
+ case "ta": return "tamil";
+ case "tr": return "turkish";
+ }
+ }
+
+ return "english";
+ }
+
private void on_operation_error(AccountOperation op, Error error) {
notify_service_problem(this.information.incoming, error);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]