Much more efficient loading of messages

Stephen Paul Weber created

Doing the cross-DB JOIN in the outer query murders performance, but if
we just look up against a single DB which rows we want, then do the full
load/join on only those rows, it is *much* faster.

Change summary

src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java | 14 
1 file changed, 10 insertions(+), 4 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java 🔗

@@ -1107,9 +1107,12 @@ public class DatabaseBackend extends SQLiteOpenHelper {
                 "SELECT * FROM " + Message.TABLENAME + " " +
                 "LEFT JOIN cheogram." + Message.TABLENAME +
                 "  USING (" + Message.UUID + ")" +
-                "WHERE " + Message.CONVERSATION + "=? " +
+                " WHERE " + Message.UUID + " IN (" +
+                "SELECT " + Message.UUID + " FROM " + Message.TABLENAME +
+                " WHERE " + Message.CONVERSATION + "=? " +
                 "ORDER BY " + Message.TIME_SENT + " DESC " +
-                "LIMIT " + String.valueOf(limit),
+                "LIMIT " + String.valueOf(limit) + ") " +
+                "ORDER BY " + Message.TIME_SENT + " DESC ",
                 selectionArgs
             );
         } else {
@@ -1119,10 +1122,13 @@ public class DatabaseBackend extends SQLiteOpenHelper {
                 "SELECT * FROM " + Message.TABLENAME + " " +
                 "LEFT JOIN cheogram." + Message.TABLENAME +
                 "  USING (" + Message.UUID + ")" +
-                "WHERE " + Message.CONVERSATION + "=? AND " +
+                " WHERE " + Message.UUID + " IN (" +
+                "SELECT " + Message.UUID + " FROM " + Message.TABLENAME +
+                " WHERE " + Message.CONVERSATION + "=? AND " +
                 Message.TIME_SENT + "<? " +
                 "ORDER BY " + Message.TIME_SENT + " DESC " +
-                "LIMIT " + String.valueOf(limit),
+                "LIMIT " + String.valueOf(limit) + ") " +
+                "ORDER BY " + Message.TIME_SENT + " DESC ",
                 selectionArgs
             );
         }