Improved search performance

This commit is contained in:
M66B
2019-10-02 21:13:10 +02:00
parent ebc40787ac
commit 822e4e3af7
5 changed files with 69 additions and 61 deletions

View File

@@ -35,6 +35,7 @@ import com.sun.mail.imap.IMAPMessage;
import com.sun.mail.imap.protocol.IMAPProtocol;
import com.sun.mail.imap.protocol.IMAPResponse;
import java.io.File;
import java.io.IOException;
import java.text.Normalizer;
import java.util.ArrayList;
@@ -46,7 +47,6 @@ import java.util.Locale;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.mail.Address;
import javax.mail.FetchProfile;
import javax.mail.Flags;
import javax.mail.Folder;
@@ -55,7 +55,6 @@ import javax.mail.Message;
import javax.mail.MessageRemovedException;
import javax.mail.MessagingException;
import javax.mail.UIDFolder;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.search.AndTerm;
import javax.mail.search.BodyTerm;
@@ -165,74 +164,60 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback<TupleMe
private int load_device(State state) {
DB db = DB.getInstance(context);
Boolean seen = null;
Boolean flagged = null;
Boolean snoozed = null;
String find = (TextUtils.isEmpty(query) ? null : query.toLowerCase(Locale.ROOT));
if (find != null && find.startsWith(context.getString(R.string.title_search_special_prefix) + ":")) {
String special = find.split(":")[1];
if (context.getString(R.string.title_search_special_unseen).equals(special))
seen = false;
else if (context.getString(R.string.title_search_special_flagged).equals(special))
flagged = true;
else if (context.getString(R.string.title_search_special_snoozed).equals(special))
snoozed = true;
}
if (state.messages == null) {
state.messages = db.message().getMessageIdsByFolder(folder);
Log.i("Boundary device folder=" + folder + " query=" + query + " messages=" + state.messages.size());
state.messages = db.message().getMessageIdsByFolder(folder, seen, flagged, snoozed);
Log.i("Boundary device folder=" + folder +
" query=" + query +
" seen=" + seen +
" flagged=" + flagged +
" snoozed=" + snoozed +
" messages=" + state.messages.size());
}
int found = 0;
try {
db.beginTransaction();
String find = (TextUtils.isEmpty(query) ? null : query.toLowerCase(Locale.ROOT));
for (int i = state.index; i < state.messages.size() && found < pageSize && !state.destroyed; i++) {
state.index = i + 1;
EntityMessage message = db.message().getMessage(state.messages.get(i));
if (message == null)
continue;
long id = state.messages.get(i);
EntityMessage message = null;
boolean match = false;
if (find == null)
match = true;
if (find == null || seen != null || flagged != null || snoozed != null)
message = db.message().getMessage(id);
else {
if (find.startsWith(context.getString(R.string.title_search_special_prefix) + ":")) {
String special = find.split(":")[1];
if (context.getString(R.string.title_search_special_unseen).equals(special))
match = !message.ui_seen;
else if (context.getString(R.string.title_search_special_flagged).equals(special))
match = message.ui_flagged;
else if (context.getString(R.string.title_search_special_snoozed).equals(special))
match = (message.ui_snoozed != null);
} else {
List<Address> addresses = new ArrayList<>();
if (message.from != null)
addresses.addAll(Arrays.asList(message.from));
if (message.to != null)
addresses.addAll(Arrays.asList(message.to));
if (message.cc != null)
addresses.addAll(Arrays.asList(message.cc));
for (Address address : addresses) {
String email = ((InternetAddress) address).getAddress();
String name = ((InternetAddress) address).getPersonal();
if (email != null && email.toLowerCase(Locale.ROOT).contains(find) ||
name != null && name.toLowerCase(Locale.ROOT).contains(find))
match = true;
}
if (!match && message.subject != null)
match = message.subject.toLowerCase(Locale.ROOT).contains(find);
if (!match && message.keywords != null && message.keywords.length > 0)
for (String keyword : message.keywords)
if (keyword.toLowerCase(Locale.ROOT).contains(find)) {
match = true;
break;
}
if (!match && message.content) {
try {
String body = Helper.readText(message.getFile(context));
match = body.toLowerCase(Locale.ROOT).contains(find);
} catch (IOException ex) {
Log.e(ex);
message = db.message().match(id, find);
if (message == null)
try {
File file = EntityMessage.getFile(context, id);
if (file.exists()) {
String body = Helper.readText(file);
if (body.toLowerCase(Locale.ROOT).contains(find))
message = db.message().getMessage(id);
}
} catch (IOException ex) {
Log.e(ex);
}
}
}
if (match) {
if (message != null) {
found++;
db.message().setMessageFound(message.account, message.thread);
}