From 1772530ae6093ad2071ba10ae86600fb7729093f Mon Sep 17 00:00:00 2001 From: M66B Date: Wed, 23 Oct 2019 20:01:43 +0200 Subject: [PATCH] Improved search performance --- .../java/eu/faircode/email/AdapterRule.java | 2 +- .../email/BoundaryCallbackMessages.java | 26 +++++++-------- .../java/eu/faircode/email/DaoMessage.java | 25 ++++++++------- .../java/eu/faircode/email/FragmentRule.java | 4 +-- .../java/eu/faircode/email/TupleMatch.java | 32 +++++++++++++++++++ 5 files changed, 61 insertions(+), 28 deletions(-) create mode 100644 app/src/main/java/eu/faircode/email/TupleMatch.java diff --git a/app/src/main/java/eu/faircode/email/AdapterRule.java b/app/src/main/java/eu/faircode/email/AdapterRule.java index 2838d2b9ab..27bfd433ab 100644 --- a/app/src/main/java/eu/faircode/email/AdapterRule.java +++ b/app/src/main/java/eu/faircode/email/AdapterRule.java @@ -281,7 +281,7 @@ public class AdapterRule extends RecyclerView.Adapter { int applied = 0; List ids = - db.message().getMessageIdsByFolder(rule.folder, null, null, null); + db.message().getMessageIdsByFolder(rule.folder); for (long mid : ids) try { db.beginTransaction(); diff --git a/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java b/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java index fed805ed22..61256d366d 100644 --- a/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java +++ b/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java @@ -176,46 +176,44 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback messages = null; + List matches = null; MailService iservice = null; IMAPFolder ifolder = null; diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index 975fc9818c..8ed0e383fd 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -212,6 +212,19 @@ public interface DaoMessage { List getMessageByFolder(long folder); @Query("SELECT id" + + " FROM message" + + " WHERE (:folder IS NULL OR folder = :folder)" + + " AND NOT ui_hide" + + " ORDER BY message.received DESC") + List getMessageIdsByFolder(Long folder); + + @Query("SELECT id, account, thread, (:find IS NULL" + + " OR `from` LIKE :find COLLATE NOCASE" + + " OR `to` LIKE :find COLLATE NOCASE" + + " OR `cc` LIKE :find COLLATE NOCASE" + + " OR `subject` LIKE :find COLLATE NOCASE" + + " OR `keywords` LIKE :find COLLATE NOCASE" + + " OR `preview` LIKE :find COLLATE NOCASE) AS matched" + " FROM message" + " WHERE (:folder IS NULL OR folder = :folder)" + " AND NOT ui_hide" + @@ -222,7 +235,7 @@ public interface DaoMessage { " WHEN 1 THEN message.ui_snoozed IS NOT NULL" + " ELSE 1 END" + // NULL: true " ORDER BY message.received DESC") - List getMessageIdsByFolder(Long folder, Boolean seen, Boolean flagged, Boolean snoozed); + List matchMessages(Long folder, String find, Boolean seen, Boolean flagged, Boolean snoozed); @Query("SELECT id" + " FROM message" + @@ -364,16 +377,6 @@ public interface DaoMessage { " ORDER BY sender, subject") Cursor getSuggestions(String query); - @Query("SELECT * FROM message" + - " WHERE id = :id" + - " AND (`from` LIKE :find COLLATE NOCASE" + - " OR `to` LIKE :find COLLATE NOCASE" + - " OR `cc` LIKE :find COLLATE NOCASE" + - " OR `subject` LIKE :find COLLATE NOCASE" + - " OR `keywords` LIKE :find COLLATE NOCASE" + - " OR `preview` LIKE :find COLLATE NOCASE)") - EntityMessage match(long id, String find); - @Insert long insertMessage(EntityMessage message); diff --git a/app/src/main/java/eu/faircode/email/FragmentRule.java b/app/src/main/java/eu/faircode/email/FragmentRule.java index 62679ddbd1..54742e40ba 100644 --- a/app/src/main/java/eu/faircode/email/FragmentRule.java +++ b/app/src/main/java/eu/faircode/email/FragmentRule.java @@ -1111,7 +1111,7 @@ public class FragmentRule extends FragmentBase { DB db = DB.getInstance(context); List ids = - db.message().getMessageIdsByFolder(rule.folder, null, null, null); + db.message().getMessageIdsByFolder(rule.folder); for (long mid : ids) try { db.beginTransaction(); @@ -1157,7 +1157,7 @@ public class FragmentRule extends FragmentBase { DB db = DB.getInstance(context); List ids = - db.message().getMessageIdsByFolder(rule.folder, null, null, null); + db.message().getMessageIdsByFolder(rule.folder); for (long id : ids) { EntityMessage message = db.message().getMessage(id); if (message == null) diff --git a/app/src/main/java/eu/faircode/email/TupleMatch.java b/app/src/main/java/eu/faircode/email/TupleMatch.java new file mode 100644 index 0000000000..030facdb1f --- /dev/null +++ b/app/src/main/java/eu/faircode/email/TupleMatch.java @@ -0,0 +1,32 @@ +package eu.faircode.email; + +/* + This file is part of FairEmail. + + FairEmail is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + FairEmail is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FairEmail. If not, see . + + Copyright 2018-2019 by Marcel Bokhorst (M66B) +*/ + +import androidx.annotation.NonNull; + +public class TupleMatch { + @NonNull + public Long id; + @NonNull + public Long account; + @NonNull + public String thread; + public Boolean matched; +}