Batch deletion

pull/161/head
Unpublished 6 years ago
parent b56d0dd546
commit a14cfa71e3

@ -82,6 +82,7 @@ import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.Semaphore; import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.IntStream;
import javax.mail.Address; import javax.mail.Address;
import javax.mail.FetchProfile; import javax.mail.FetchProfile;
@ -1209,9 +1210,11 @@ class Core {
// Delete local messages not at remote // Delete local messages not at remote
Log.i(folder.name + " delete=" + uids.size()); Log.i(folder.name + " delete=" + uids.size());
for (Long uid : uids) { for (int i = 0; i < uids.size(); i += SYNC_BATCH_SIZE) {
int count = db.message().deleteMessage(folder.id, uid); int to = Math.min(uids.size(), i + SYNC_BATCH_SIZE);
Log.i(folder.name + " delete local uid=" + uid + " count=" + count); long[] isub = IntStream.range(i, to).mapToLong(l -> uids.get(l)).toArray();
int count = db.message().deleteMessages(folder.id, isub);
Log.i(folder.name + " delete local uid=" + Arrays.toString(isub) + " count=" + count);
} }
List<EntityRule> rules = db.rule().getEnabledRules(folder.id); List<EntityRule> rules = db.rule().getEnabledRules(folder.id);

@ -483,6 +483,11 @@ public interface DaoMessage {
" AND uid = :uid") " AND uid = :uid")
int deleteMessage(long folder, long uid); int deleteMessage(long folder, long uid);
@Query("DELETE FROM message" +
" WHERE folder = :folder" +
" AND uid IN(:uids)")
int deleteMessages(long folder, long[] uids);
@Query("DELETE FROM message" + @Query("DELETE FROM message" +
" WHERE folder = :folder" + " WHERE folder = :folder" +
" AND NOT uid IS NULL") " AND NOT uid IS NULL")

Loading…
Cancel
Save