Merge pull request #3221 from k9mail/always_build_fts_table_last
Always build FTS table last
This commit is contained in:
commit
149603618b
3 changed files with 68 additions and 45 deletions
|
@ -0,0 +1,52 @@
|
|||
package com.fsck.k9.mailstore.migrations
|
||||
|
||||
|
||||
import android.content.ContentValues
|
||||
import android.database.sqlite.SQLiteDatabase
|
||||
import com.fsck.k9.mail.FetchProfile
|
||||
import com.fsck.k9.mail.MessagingException
|
||||
import com.fsck.k9.mailstore.LocalFolder
|
||||
import com.fsck.k9.mailstore.LocalStore
|
||||
import timber.log.Timber
|
||||
|
||||
|
||||
internal class FullTextIndexer(val localStore: LocalStore, val database: SQLiteDatabase) {
|
||||
private val fulltextCreator = localStore.messageFulltextCreator
|
||||
private val fetchProfile = FetchProfile().apply { add(FetchProfile.Item.BODY) }
|
||||
|
||||
fun indexAllMessages() {
|
||||
try {
|
||||
val folders = localStore.getPersonalNamespaces(true)
|
||||
for (folder in folders) {
|
||||
indexFolder(folder)
|
||||
}
|
||||
} catch (e: MessagingException) {
|
||||
Timber.e(e, "error indexing fulltext - skipping rest, fts index is incomplete!")
|
||||
}
|
||||
}
|
||||
|
||||
private fun indexFolder(folder: LocalFolder) {
|
||||
val messageUids = folder.allMessageUids
|
||||
for (messageUid in messageUids) {
|
||||
indexMessage(folder, messageUid)
|
||||
}
|
||||
}
|
||||
|
||||
private fun indexMessage(folder: LocalFolder, messageUid: String?) {
|
||||
val localMessage = folder.getMessage(messageUid)
|
||||
folder.fetch(listOf(localMessage), fetchProfile, null)
|
||||
|
||||
val fulltext = fulltextCreator.createFulltext(localMessage)
|
||||
if (fulltext.isNullOrEmpty()) {
|
||||
Timber.d("no fulltext for msg id %d :(", localMessage.databaseId)
|
||||
} else {
|
||||
Timber.d("fulltext for msg id %d is %d chars long", localMessage.databaseId, fulltext.length)
|
||||
|
||||
val values = ContentValues().apply {
|
||||
put("docid", localMessage.databaseId)
|
||||
put("fulltext", fulltext)
|
||||
}
|
||||
database.insert("messages_fulltext", null, values)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,54 +1,11 @@
|
|||
package com.fsck.k9.mailstore.migrations;
|
||||
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import android.content.ContentValues;
|
||||
import android.database.sqlite.SQLiteDatabase;
|
||||
import android.text.TextUtils;
|
||||
import timber.log.Timber;
|
||||
|
||||
import com.fsck.k9.mail.FetchProfile;
|
||||
import com.fsck.k9.mail.MessagingException;
|
||||
import com.fsck.k9.mailstore.LocalFolder;
|
||||
import com.fsck.k9.mailstore.LocalMessage;
|
||||
import com.fsck.k9.mailstore.LocalStore;
|
||||
import com.fsck.k9.message.extractors.MessageFulltextCreator;
|
||||
|
||||
|
||||
class MigrationTo55 {
|
||||
static void createFtsSearchTable(SQLiteDatabase db, MigrationsHelper migrationsHelper) {
|
||||
static void createFtsSearchTable(SQLiteDatabase db) {
|
||||
db.execSQL("CREATE VIRTUAL TABLE messages_fulltext USING fts4 (fulltext)");
|
||||
|
||||
LocalStore localStore = migrationsHelper.getLocalStore();
|
||||
MessageFulltextCreator fulltextCreator = localStore.getMessageFulltextCreator();
|
||||
|
||||
try {
|
||||
List<LocalFolder> folders = localStore.getPersonalNamespaces(true);
|
||||
ContentValues cv = new ContentValues();
|
||||
FetchProfile fp = new FetchProfile();
|
||||
fp.add(FetchProfile.Item.BODY);
|
||||
for (LocalFolder folder : folders) {
|
||||
List<String> messageUids = folder.getAllMessageUids();
|
||||
for (String messageUid : messageUids) {
|
||||
LocalMessage localMessage = folder.getMessage(messageUid);
|
||||
folder.fetch(Collections.singletonList(localMessage), fp, null);
|
||||
|
||||
String fulltext = fulltextCreator.createFulltext(localMessage);
|
||||
if (!TextUtils.isEmpty(fulltext)) {
|
||||
Timber.d("fulltext for msg id %d is %d chars long", localMessage.getDatabaseId(), fulltext.length());
|
||||
cv.clear();
|
||||
cv.put("docid", localMessage.getDatabaseId());
|
||||
cv.put("fulltext", fulltext);
|
||||
db.insert("messages_fulltext", null, cv);
|
||||
} else {
|
||||
Timber.d("no fulltext for msg id %d :(", localMessage.getDatabaseId());
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (MessagingException e) {
|
||||
Timber.e(e, "error indexing fulltext - skipping rest, fts index is incomplete!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,10 +3,13 @@ package com.fsck.k9.mailstore.migrations;
|
|||
|
||||
import android.database.sqlite.SQLiteDatabase;
|
||||
|
||||
import com.fsck.k9.mailstore.LocalStore;
|
||||
|
||||
|
||||
public class Migrations {
|
||||
@SuppressWarnings("fallthrough")
|
||||
public static void upgradeDatabase(SQLiteDatabase db, MigrationsHelper migrationsHelper) {
|
||||
boolean shouldBuildFtsTable = false;
|
||||
switch (db.getVersion()) {
|
||||
case 29:
|
||||
MigrationTo30.addDeletedColumn(db);
|
||||
|
@ -63,7 +66,8 @@ public class Migrations {
|
|||
case 53:
|
||||
MigrationTo54.addPreviewTypeColumn(db);
|
||||
case 54:
|
||||
MigrationTo55.createFtsSearchTable(db, migrationsHelper);
|
||||
MigrationTo55.createFtsSearchTable(db);
|
||||
shouldBuildFtsTable = true;
|
||||
case 55:
|
||||
MigrationTo56.cleanUpFtsTable(db);
|
||||
case 56:
|
||||
|
@ -78,5 +82,15 @@ public class Migrations {
|
|||
case 60:
|
||||
MigrationTo61.removeErrorsFolder(db);
|
||||
}
|
||||
|
||||
if (shouldBuildFtsTable) {
|
||||
buildFtsTable(db, migrationsHelper);
|
||||
}
|
||||
}
|
||||
|
||||
private static void buildFtsTable(SQLiteDatabase db, MigrationsHelper migrationsHelper) {
|
||||
LocalStore localStore = migrationsHelper.getLocalStore();
|
||||
FullTextIndexer fullTextIndexer = new FullTextIndexer(localStore, db);
|
||||
fullTextIndexer.indexAllMessages();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue