mirror of
https://github.com/moparisthebest/k-9
synced 2024-11-30 13:12:25 -05:00
Don't fetch already downloaded messages found by a server-side search
This commit is contained in:
parent
38fe4d1990
commit
b108e7a539
@ -626,24 +626,28 @@ public class MessagingController implements Runnable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
List<Message> messages = remoteFolder.search(query, requiredFlags, forbiddenFlags);
|
List<Message> messages = remoteFolder.search(query, requiredFlags, forbiddenFlags);
|
||||||
if (listener != null) {
|
|
||||||
listener.remoteSearchServerQueryComplete(acct, folderName, messages.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (K9.DEBUG) {
|
if (K9.DEBUG) {
|
||||||
Log.i("Remote Search", "Remote search got " + messages.size() + " results");
|
Log.i("Remote Search", "Remote search got " + messages.size() + " results");
|
||||||
}
|
}
|
||||||
|
|
||||||
Collections.sort(messages, new UidReverseComparator());
|
// There's no need to fetch messages already completely downloaded
|
||||||
|
List<Message> remoteMessages = localFolder.extractNewMessages(messages);
|
||||||
|
messages.clear();
|
||||||
|
|
||||||
|
if (listener != null) {
|
||||||
int resultLimit = acct.getRemoteSearchNumResults();
|
listener.remoteSearchServerQueryComplete(acct, folderName, remoteMessages.size());
|
||||||
if (resultLimit > 0 && messages.size() > resultLimit) {
|
|
||||||
extraResults = messages.subList(resultLimit, messages.size());
|
|
||||||
messages = messages.subList(0, resultLimit);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
loadSearchResultsSynchronous(messages, localFolder, remoteFolder, listener);
|
Collections.sort(remoteMessages, new UidReverseComparator());
|
||||||
|
|
||||||
|
int resultLimit = acct.getRemoteSearchNumResults();
|
||||||
|
if (resultLimit > 0 && remoteMessages.size() > resultLimit) {
|
||||||
|
extraResults = remoteMessages.subList(resultLimit, remoteMessages.size());
|
||||||
|
remoteMessages = remoteMessages.subList(0, resultLimit);
|
||||||
|
}
|
||||||
|
|
||||||
|
loadSearchResultsSynchronous(remoteMessages, localFolder, remoteFolder, listener);
|
||||||
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -15,6 +15,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
@ -101,6 +102,14 @@ public class LocalStore extends Store implements Serializable {
|
|||||||
|
|
||||||
static private String GET_FOLDER_COLS = "id, name, unread_count, visible_limit, last_updated, status, push_state, last_pushed, flagged_count, integrate, top_group, poll_class, push_class, display_class";
|
static private String GET_FOLDER_COLS = "id, name, unread_count, visible_limit, last_updated, status, push_state, last_pushed, flagged_count, integrate, top_group, poll_class, push_class, display_class";
|
||||||
|
|
||||||
|
private static final String[] UID_CHECK_PROJECTION = { "uid" };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Number of UIDs to check for existence at once.
|
||||||
|
*
|
||||||
|
* @see LocalFolder#extractNewMessages(List)
|
||||||
|
*/
|
||||||
|
private static final int UID_CHECK_BATCH_SIZE = 500;
|
||||||
|
|
||||||
protected static final int DB_VERSION = 45;
|
protected static final int DB_VERSION = 45;
|
||||||
|
|
||||||
@ -3206,6 +3215,78 @@ public class LocalStore extends Store implements Serializable {
|
|||||||
|
|
||||||
return new ThreadInfo(id, messageId, rootId, parentId);
|
return new ThreadInfo(id, messageId, rootId, parentId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<Message> extractNewMessages(final List<Message> messages)
|
||||||
|
throws MessagingException {
|
||||||
|
|
||||||
|
try {
|
||||||
|
return database.execute(false, new DbCallback<List<Message>>() {
|
||||||
|
@Override
|
||||||
|
public List<Message> doDbWork(final SQLiteDatabase db) throws WrappedException {
|
||||||
|
try {
|
||||||
|
open(OpenMode.READ_WRITE);
|
||||||
|
} catch (MessagingException e) {
|
||||||
|
throw new WrappedException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Message> result = new ArrayList<Message>();
|
||||||
|
|
||||||
|
List<String> selectionArgs = new ArrayList<String>();
|
||||||
|
Set<String> existingMessages = new HashSet<String>();
|
||||||
|
int start = 0;
|
||||||
|
|
||||||
|
while (start < messages.size()) {
|
||||||
|
StringBuilder selection = new StringBuilder();
|
||||||
|
|
||||||
|
selection.append("folder_id = ? AND UID IN (");
|
||||||
|
selectionArgs.add(Long.toString(mFolderId));
|
||||||
|
|
||||||
|
int count = Math.min(messages.size() - start, UID_CHECK_BATCH_SIZE);
|
||||||
|
|
||||||
|
for (int i = start, end = start + count; i < end; i++) {
|
||||||
|
if (i > start) {
|
||||||
|
selection.append(",?");
|
||||||
|
} else {
|
||||||
|
selection.append("?");
|
||||||
|
}
|
||||||
|
|
||||||
|
selectionArgs.add(messages.get(i).getUid());
|
||||||
|
}
|
||||||
|
|
||||||
|
selection.append(")");
|
||||||
|
|
||||||
|
Cursor cursor = db.query("messages", UID_CHECK_PROJECTION,
|
||||||
|
selection.toString(), selectionArgs.toArray(EMPTY_STRING_ARRAY),
|
||||||
|
null, null, null);
|
||||||
|
|
||||||
|
try {
|
||||||
|
while (cursor.moveToNext()) {
|
||||||
|
String uid = cursor.getString(0);
|
||||||
|
existingMessages.add(uid);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
Utility.closeQuietly(cursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = start, end = start + count; i < end; i++) {
|
||||||
|
Message message = messages.get(i);
|
||||||
|
if (!existingMessages.contains(message.getUid())) {
|
||||||
|
result.add(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
existingMessages.clear();
|
||||||
|
selectionArgs.clear();
|
||||||
|
start += count;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (WrappedException e) {
|
||||||
|
throw(MessagingException) e.getCause();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class LocalTextBody extends TextBody {
|
public static class LocalTextBody extends TextBody {
|
||||||
|
Loading…
Reference in New Issue
Block a user