From edc47247f9bfba77496cd84f770329bf68e360c9 Mon Sep 17 00:00:00 2001 From: Jake McGinty Date: Tue, 4 Aug 2015 13:37:22 -0700 Subject: [PATCH] add thread/date multi-col SQLite indices Closes #3880 // FREEBIE --- .../securesms/database/DatabaseFactory.java | 9 +++++++- .../securesms/database/MmsDatabase.java | 21 ++++++++++++------- .../securesms/database/MmsSmsDatabase.java | 8 +++---- .../securesms/database/PartDatabase.java | 2 +- .../securesms/database/SmsDatabase.java | 3 ++- 5 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/org/thoughtcrime/securesms/database/DatabaseFactory.java b/src/org/thoughtcrime/securesms/database/DatabaseFactory.java index 1fbaa0269d..eec89aeb7c 100644 --- a/src/org/thoughtcrime/securesms/database/DatabaseFactory.java +++ b/src/org/thoughtcrime/securesms/database/DatabaseFactory.java @@ -65,7 +65,8 @@ public class DatabaseFactory { private static final int INTRODUCED_RECIPIENT_PREFS_DB = 18; private static final int INTRODUCED_ENVELOPE_CONTENT_VERSION = 19; private static final int INTRODUCED_COLOR_PREFERENCE_VERSION = 20; - private static final int DATABASE_VERSION = 20; + private static final int INTRODUCED_DB_OPTIMIZATIONS_VERSION = 21; + private static final int DATABASE_VERSION = 21; private static final String DATABASE_NAME = "messages.db"; private static final Object lock = new Object(); @@ -754,6 +755,12 @@ public class DatabaseFactory { db.execSQL("ALTER TABLE recipient_preferences ADD COLUMN color TEXT DEFAULT NULL"); } + if (oldVersion < INTRODUCED_DB_OPTIMIZATIONS_VERSION) { + db.execSQL("UPDATE mms SET date_received = (date_received * 1000), date = (date * 1000);"); + db.execSQL("CREATE INDEX IF NOT EXISTS sms_thread_date_index ON sms (thread_id, date);"); + db.execSQL("CREATE INDEX IF NOT EXISTS mms_thread_date_index ON mms (thread_id, date_received);"); + } + db.setTransactionSuccessful(); db.endTransaction(); } diff --git a/src/org/thoughtcrime/securesms/database/MmsDatabase.java b/src/org/thoughtcrime/securesms/database/MmsDatabase.java index 0ac06fa02e..8a269b86f5 100644 --- a/src/org/thoughtcrime/securesms/database/MmsDatabase.java +++ b/src/org/thoughtcrime/securesms/database/MmsDatabase.java @@ -152,12 +152,13 @@ public class MmsDatabase extends MessagingDatabase { "CREATE INDEX IF NOT EXISTS mms_read_index ON " + TABLE_NAME + " (" + READ + ");", "CREATE INDEX IF NOT EXISTS mms_read_and_thread_id_index ON " + TABLE_NAME + "(" + READ + "," + THREAD_ID + ");", "CREATE INDEX IF NOT EXISTS mms_message_box_index ON " + TABLE_NAME + " (" + MESSAGE_BOX + ");", - "CREATE INDEX IF NOT EXISTS mms_date_sent_index ON " + TABLE_NAME + " (" + DATE_SENT + ");" + "CREATE INDEX IF NOT EXISTS mms_date_sent_index ON " + TABLE_NAME + " (" + DATE_SENT + ");", + "CREATE INDEX IF NOT EXISTS mms_thread_date_index ON " + TABLE_NAME + " (" + THREAD_ID + ", " + DATE_RECEIVED + ");" }; private static final String[] MMS_PROJECTION = new String[] { - ID, THREAD_ID, DATE_SENT + " * 1000 AS " + NORMALIZED_DATE_SENT, - DATE_RECEIVED + " * 1000 AS " + NORMALIZED_DATE_RECEIVED, + ID, THREAD_ID, DATE_SENT + " AS " + NORMALIZED_DATE_SENT, + DATE_RECEIVED + " AS " + NORMALIZED_DATE_RECEIVED, MESSAGE_BOX, READ, MESSAGE_ID, SUBJECT, SUBJECT_CHARSET, CONTENT_TYPE, CONTENT_LOCATION, EXPIRY, MESSAGE_CLASS, MESSAGE_TYPE, MMS_VERSION, MESSAGE_SIZE, PRIORITY, REPORT_ALLOWED, STATUS, TRANSACTION_ID, RETRIEVE_STATUS, @@ -221,7 +222,7 @@ public class MmsDatabase extends MessagingDatabase { Cursor cursor = null; try { - cursor = database.query(TABLE_NAME, new String[] {ID, THREAD_ID, MESSAGE_BOX}, DATE_SENT + " = ?", new String[] {String.valueOf(timestamp / 1000)}, null, null, null, null); + cursor = database.query(TABLE_NAME, new String[] {ID, THREAD_ID, MESSAGE_BOX}, DATE_SENT + " = ?", new String[] {String.valueOf(timestamp)}, null, null, null, null); while (cursor.moveToNext()) { if (Types.isOutgoingMessageType(cursor.getLong(cursor.getColumnIndexOrThrow(MESSAGE_BOX)))) { @@ -608,7 +609,7 @@ public class MmsDatabase extends MessagingDatabase { contentValues.put(THREAD_ID, threadId); contentValues.put(CONTENT_LOCATION, contentLocation); contentValues.put(STATUS, Status.DOWNLOAD_INITIALIZED); - contentValues.put(DATE_RECEIVED, System.currentTimeMillis() / 1000); + contentValues.put(DATE_RECEIVED, generatePduCompatTimestamp()); contentValues.put(READ, unread ? 0 : 1); if (!contentValues.containsKey(DATE_SENT)) { @@ -681,7 +682,7 @@ public class MmsDatabase extends MessagingDatabase { contentValues.put(MESSAGE_BOX, Types.BASE_INBOX_TYPE); contentValues.put(THREAD_ID, threadId); contentValues.put(STATUS, Status.DOWNLOAD_INITIALIZED); - contentValues.put(DATE_RECEIVED, System.currentTimeMillis() / 1000); + contentValues.put(DATE_RECEIVED, generatePduCompatTimestamp()); contentValues.put(READ, Util.isDefaultSmsProvider(context) ? 0 : 1); if (!contentValues.containsKey(DATE_SENT)) @@ -856,7 +857,6 @@ public class MmsDatabase extends MessagingDatabase { } /*package*/void deleteMessagesInThreadBeforeDate(long threadId, long date) { - date = date / 1000; Cursor cursor = null; try { @@ -960,7 +960,7 @@ public class MmsDatabase extends MessagingDatabase { cvb.add(REPORT_ALLOWED, headers.getOctet(PduHeaders.REPORT_ALLOWED)); cvb.add(RETRIEVE_STATUS, headers.getOctet(PduHeaders.RETRIEVE_STATUS)); cvb.add(STATUS, headers.getOctet(PduHeaders.STATUS)); - cvb.add(DATE_SENT, headers.getLongInteger(PduHeaders.DATE)); + cvb.add(DATE_SENT, headers.getLongInteger(PduHeaders.DATE) * 1000L); cvb.add(DELIVERY_TIME, headers.getLongInteger(PduHeaders.DELIVERY_TIME)); cvb.add(EXPIRY, headers.getLongInteger(PduHeaders.EXPIRY)); cvb.add(MESSAGE_SIZE, headers.getLongInteger(PduHeaders.MESSAGE_SIZE)); @@ -1218,6 +1218,11 @@ public class MmsDatabase extends MessagingDatabase { } } + private long generatePduCompatTimestamp() { + final long time = System.currentTimeMillis(); + return time - (time % 1000); + } + private PduBody getPartsAsBody(List parts) { PduBody body = new PduBody(); diff --git a/src/org/thoughtcrime/securesms/database/MmsSmsDatabase.java b/src/org/thoughtcrime/securesms/database/MmsSmsDatabase.java index af2fbdea05..837621fc51 100644 --- a/src/org/thoughtcrime/securesms/database/MmsSmsDatabase.java +++ b/src/org/thoughtcrime/securesms/database/MmsSmsDatabase.java @@ -143,8 +143,8 @@ public class MmsSmsDatabase extends Database { } private Cursor queryTables(String[] projection, String smsSelection, String mmsSelection, String order, String groupBy, String limit) { - String[] mmsProjection = {MmsDatabase.DATE_SENT + " * 1000 AS " + MmsSmsColumns.NORMALIZED_DATE_SENT, - MmsDatabase.DATE_RECEIVED + " * 1000 AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED, + String[] mmsProjection = {MmsDatabase.DATE_SENT + " AS " + MmsSmsColumns.NORMALIZED_DATE_SENT, + MmsDatabase.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED, MmsSmsColumns.ID, SmsDatabase.BODY, MmsSmsColumns.READ, MmsSmsColumns.THREAD_ID, SmsDatabase.TYPE, SmsDatabase.ADDRESS, SmsDatabase.ADDRESS_DEVICE_ID, SmsDatabase.SUBJECT, MmsDatabase.MESSAGE_TYPE, MmsDatabase.MESSAGE_BOX, SmsDatabase.STATUS, MmsDatabase.PART_COUNT, @@ -153,8 +153,8 @@ public class MmsSmsDatabase extends Database { MmsSmsColumns.RECEIPT_COUNT, MmsSmsColumns.MISMATCHED_IDENTITIES, MmsDatabase.NETWORK_FAILURE, TRANSPORT}; - String[] smsProjection = {SmsDatabase.DATE_SENT + " * 1 AS " + MmsSmsColumns.NORMALIZED_DATE_SENT, - SmsDatabase.DATE_RECEIVED + " * 1 AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED, + String[] smsProjection = {SmsDatabase.DATE_SENT + " AS " + MmsSmsColumns.NORMALIZED_DATE_SENT, + SmsDatabase.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED, MmsSmsColumns.ID, SmsDatabase.BODY, MmsSmsColumns.READ, MmsSmsColumns.THREAD_ID, SmsDatabase.TYPE, SmsDatabase.ADDRESS, SmsDatabase.ADDRESS_DEVICE_ID, SmsDatabase.SUBJECT, MmsDatabase.MESSAGE_TYPE, MmsDatabase.MESSAGE_BOX, SmsDatabase.STATUS, MmsDatabase.PART_COUNT, diff --git a/src/org/thoughtcrime/securesms/database/PartDatabase.java b/src/org/thoughtcrime/securesms/database/PartDatabase.java index f87fb6cec0..e8cb0a32f4 100644 --- a/src/org/thoughtcrime/securesms/database/PartDatabase.java +++ b/src/org/thoughtcrime/securesms/database/PartDatabase.java @@ -568,7 +568,7 @@ public class PartDatabase extends Database { return new ImageRecord(partId, cursor.getString(cursor.getColumnIndexOrThrow(CONTENT_TYPE)), cursor.getString(cursor.getColumnIndexOrThrow(MmsDatabase.ADDRESS)), - cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.NORMALIZED_DATE_RECEIVED)) * 1000); + cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.NORMALIZED_DATE_RECEIVED))); } public PartId getPartId() { diff --git a/src/org/thoughtcrime/securesms/database/SmsDatabase.java b/src/org/thoughtcrime/securesms/database/SmsDatabase.java index 2295ab865f..a5d4175859 100644 --- a/src/org/thoughtcrime/securesms/database/SmsDatabase.java +++ b/src/org/thoughtcrime/securesms/database/SmsDatabase.java @@ -83,7 +83,8 @@ public class SmsDatabase extends MessagingDatabase { "CREATE INDEX IF NOT EXISTS sms_read_index ON " + TABLE_NAME + " (" + READ + ");", "CREATE INDEX IF NOT EXISTS sms_read_and_thread_id_index ON " + TABLE_NAME + "(" + READ + "," + THREAD_ID + ");", "CREATE INDEX IF NOT EXISTS sms_type_index ON " + TABLE_NAME + " (" + TYPE + ");", - "CREATE INDEX IF NOT EXISTS sms_date_sent_index ON " + TABLE_NAME + " (" + DATE_SENT + ");" + "CREATE INDEX IF NOT EXISTS sms_date_sent_index ON " + TABLE_NAME + " (" + DATE_SENT + ");", + "CREATE INDEX IF NOT EXISTS sms_thread_date_index ON " + TABLE_NAME + " (" + THREAD_ID + ", " + DATE_RECEIVED + ");" }; private static final String[] MESSAGE_PROJECTION = new String[] {