1
0
mirror of https://github.com/moparisthebest/k-9 synced 2024-11-30 13:12:25 -05:00

Don't load unread/flagged count when creating LocalFolder instances

This avoids a potentially expensive LEFT JOIN when querying the database.
This commit is contained in:
cketti 2013-07-07 02:40:04 +02:00
parent 422ba279b5
commit 5d07b6691b
2 changed files with 43 additions and 31 deletions

View File

@ -2899,8 +2899,9 @@ public class MessagingController implements Runnable {
// Update the messages in the local store
localFolder.setFlags(messages, new Flag[] {flag}, newState);
int unreadMessageCount = localFolder.getUnreadMessageCount();
for (MessagingListener l : getListeners()) {
l.folderStatusChanged(account, folderName, localFolder.getUnreadMessageCount());
l.folderStatusChanged(account, folderName, unreadMessageCount);
}

View File

@ -102,23 +102,21 @@ public class LocalStore extends Store implements Serializable {
"forwarded ";
private static final String GET_FOLDER_COLS =
"folders.id, name, SUM(read=0), visible_limit, last_updated, status, push_state, " +
"last_pushed, SUM(flagged), integrate, top_group, poll_class, push_class, display_class";
"folders.id, name, visible_limit, last_updated, status, push_state, last_pushed, " +
"integrate, top_group, poll_class, push_class, display_class";
private static final int FOLDER_ID_INDEX = 0;
private static final int FOLDER_NAME_INDEX = 1;
private static final int FOLDER_UNREAD_COUNT_INDEX = 2;
private static final int FOLDER_VISIBLE_LIMIT_INDEX = 3;
private static final int FOLDER_LAST_CHECKED_INDEX = 4;
private static final int FOLDER_STATUS_INDEX = 5;
private static final int FOLDER_PUSH_STATE_INDEX = 6;
private static final int FOLDER_LAST_PUSHED_INDEX = 7;
private static final int FOLDER_FLAGGED_COUNT_INDEX = 8;
private static final int FOLDER_INTEGRATE_INDEX = 9;
private static final int FOLDER_TOP_GROUP_INDEX = 10;
private static final int FOLDER_SYNC_CLASS_INDEX = 11;
private static final int FOLDER_PUSH_CLASS_INDEX = 12;
private static final int FOLDER_DISPLAY_CLASS_INDEX = 13;
private static final int FOLDER_VISIBLE_LIMIT_INDEX = 2;
private static final int FOLDER_LAST_CHECKED_INDEX = 3;
private static final int FOLDER_STATUS_INDEX = 4;
private static final int FOLDER_PUSH_STATE_INDEX = 5;
private static final int FOLDER_LAST_PUSHED_INDEX = 6;
private static final int FOLDER_INTEGRATE_INDEX = 7;
private static final int FOLDER_TOP_GROUP_INDEX = 8;
private static final int FOLDER_SYNC_CLASS_INDEX = 9;
private static final int FOLDER_PUSH_CLASS_INDEX = 10;
private static final int FOLDER_DISPLAY_CLASS_INDEX = 11;
private static final String[] UID_CHECK_PROJECTION = { "uid" };
@ -885,9 +883,7 @@ public class LocalStore extends Store implements Serializable {
try {
cursor = db.rawQuery("SELECT " + GET_FOLDER_COLS + " FROM folders " +
"LEFT JOIN messages ON (folder_id = folders.id AND" +
" (empty IS NULL OR empty != 1) AND deleted = 0) " +
"GROUP BY folders.id ORDER BY name ASC", null);
"ORDER BY name ASC", null);
while (cursor.moveToNext()) {
if (cursor.isNull(FOLDER_ID_INDEX)) {
continue;
@ -1321,8 +1317,6 @@ public class LocalStore extends Store implements Serializable {
private static final long serialVersionUID = -1973296520918624767L;
private String mName = null;
private long mFolderId = -1;
private int mUnreadMessageCount = -1;
private int mFlaggedMessageCount = -1;
private int mVisibleLimit = -1;
private String prefId = null;
private FolderClass mDisplayClass = FolderClass.NO_CLASS;
@ -1375,9 +1369,7 @@ public class LocalStore extends Store implements Serializable {
public Void doDbWork(final SQLiteDatabase db) throws WrappedException {
Cursor cursor = null;
try {
String baseQuery = "SELECT " + GET_FOLDER_COLS + " FROM folders " +
"LEFT JOIN messages ON (folder_id = folders.id AND" +
" (empty IS NULL OR empty != 1) AND deleted = 0) ";
String baseQuery = "SELECT " + GET_FOLDER_COLS + " FROM folders ";
if (mName != null) {
cursor = db.rawQuery(baseQuery + "where folders.name = ?", new String[] { mName });
@ -1411,10 +1403,8 @@ public class LocalStore extends Store implements Serializable {
private void open(Cursor cursor) throws MessagingException {
mFolderId = cursor.getInt(FOLDER_ID_INDEX);
mName = cursor.getString(FOLDER_NAME_INDEX);
mUnreadMessageCount = cursor.getInt(FOLDER_UNREAD_COUNT_INDEX);
mVisibleLimit = cursor.getInt(FOLDER_VISIBLE_LIMIT_INDEX);
mPushState = cursor.getString(FOLDER_PUSH_STATE_INDEX);
mFlaggedMessageCount = cursor.getInt(FOLDER_FLAGGED_COUNT_INDEX);
super.setStatus(cursor.getString(FOLDER_STATUS_INDEX));
// Only want to set the local variable stored in the super class. This class
// does a DB update on setLastChecked
@ -1429,7 +1419,6 @@ public class LocalStore extends Store implements Serializable {
mPushClass = Folder.FolderClass.valueOf((pushClass == null) ? noClass : pushClass);
String syncClass = cursor.getString(FOLDER_SYNC_CLASS_INDEX);
mSyncClass = Folder.FolderClass.valueOf((syncClass == null) ? noClass : syncClass);
}
@Override
@ -1533,12 +1522,9 @@ public class LocalStore extends Store implements Serializable {
@Override
public int getUnreadMessageCount() throws MessagingException {
if (!isOpen()) {
// open() sums up the number of unread messages in the database
open(OpenMode.READ_WRITE);
return mUnreadMessageCount;
}
// Folder was already opened. Unread count might be outdated so query the database now.
try {
return database.execute(false, new DbCallback<Integer>() {
@Override
@ -1566,8 +1552,33 @@ public class LocalStore extends Store implements Serializable {
@Override
public int getFlaggedMessageCount() throws MessagingException {
open(OpenMode.READ_WRITE);
return mFlaggedMessageCount;
if (!isOpen()) {
open(OpenMode.READ_WRITE);
}
try {
return database.execute(false, new DbCallback<Integer>() {
@Override
public Integer doDbWork(final SQLiteDatabase db) throws WrappedException {
int flaggedMessageCount = 0;
Cursor cursor = db.query("messages", new String[] { "SUM(flagged)" },
"folder_id = ? AND (empty IS NULL OR empty != 1) AND deleted = 0",
new String[] { Long.toString(mFolderId) }, null, null, null);
try {
if (cursor.moveToFirst()) {
flaggedMessageCount = cursor.getInt(0);
}
} finally {
cursor.close();
}
return flaggedMessageCount;
}
});
} catch (WrappedException e) {
throw(MessagingException) e.getCause();
}
}
@Override