Allow search in account

This commit is contained in:
M66B 2020-02-02 17:17:58 +01:00
parent d261a6fba4
commit 3a93c070de
6 changed files with 2155 additions and 14 deletions

File diff suppressed because it is too large Load Diff

View File

@ -69,6 +69,7 @@ import io.requery.android.database.sqlite.SQLiteDatabase;
public class BoundaryCallbackMessages extends PagedList.BoundaryCallback<TupleMessageEx> {
private Context context;
private Long account;
private Long folder;
private boolean server;
private String query;
@ -91,8 +92,9 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback<TupleMe
void onException(@NonNull Throwable ex);
}
BoundaryCallbackMessages(Context context, long folder, boolean server, String query, int pageSize) {
BoundaryCallbackMessages(Context context, long account, long folder, boolean server, String query, int pageSize) {
this.context = context.getApplicationContext();
this.account = (account < 0 ? null : account);
this.folder = (folder < 0 ? null : folder);
this.server = server;
this.query = query;
@ -191,7 +193,7 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback<TupleMe
if (fts && pro && seen == null && flagged == null && snoozed == null && encrypted == null) {
if (state.ids == null) {
SQLiteDatabase sdb = FtsDbHelper.getInstance(context);
state.ids = FtsDbHelper.match(sdb, folder, query);
state.ids = FtsDbHelper.match(sdb, account, folder, query);
}
try {
@ -217,7 +219,7 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback<TupleMe
if (state.matches == null ||
(state.matches.size() > 0 && state.index >= state.matches.size())) {
state.matches = db.message().matchMessages(
folder,
account, folder,
"%" + find + "%",
seen, flagged, snoozed, encrypted,
SEARCH_LIMIT, state.offset);

View File

@ -60,7 +60,7 @@ import io.requery.android.database.sqlite.SQLiteDatabase;
// https://developer.android.com/topic/libraries/architecture/room.html
@Database(
version = 138,
version = 139,
entities = {
EntityIdentity.class,
EntityAccount.class,
@ -1342,6 +1342,13 @@ public abstract class DB extends RoomDatabase {
Log.i("DB migration from version " + startVersion + " to " + endVersion);
db.execSQL("ALTER TABLE `message` ADD COLUMN `importance` INTEGER");
}
})
.addMigrations(new Migration(138, 139) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase db) {
Log.i("DB migration from version " + startVersion + " to " + endVersion);
db.execSQL("UPDATE `message` SET fts = 0");
}
});
}

View File

@ -264,6 +264,7 @@ public interface DaoMessage {
" OR `preview` LIKE :find COLLATE NOCASE) AS matched" +
" FROM message" +
" WHERE NOT ui_hide" +
" AND (:account IS NULL OR account = :account)" +
" AND (:folder IS NULL OR folder = :folder)" +
" AND (:seen IS NULL OR ui_seen = :seen)" +
" AND (:flagged IS NULL OR ui_flagged = :flagged)" +
@ -272,7 +273,7 @@ public interface DaoMessage {
" ORDER BY received DESC" +
" LIMIT :limit OFFSET :offset")
List<TupleMatch> matchMessages(
Long folder, String find,
Long account, Long folder, String find,
Boolean seen, Boolean flagged, Boolean hidden, Boolean encrypted,
int limit, int offset);

View File

@ -37,7 +37,7 @@ import io.requery.android.database.sqlite.SQLiteOpenHelper;
public class FtsDbHelper extends SQLiteOpenHelper {
private static FtsDbHelper instance = null;
private static final int DATABASE_VERSION = 1;
private static final int DATABASE_VERSION = 2;
private static final String DATABASE_NAME = "fts.db";
private FtsDbHelper(Context context) {
@ -54,12 +54,14 @@ public class FtsDbHelper extends SQLiteOpenHelper {
public void onCreate(SQLiteDatabase db) {
Log.i("FTS create");
db.execSQL("CREATE VIRTUAL TABLE `message`" +
" USING fts5 (`folder` UNINDEXED, `time` UNINDEXED, `address`, `subject`, `keyword`, `text`)");
" USING fts5 (`account` UNINDEXED, `folder` UNINDEXED, `time` UNINDEXED, `address`, `subject`, `keyword`, `text`)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Do nothing
Log.i("FTS upgrade from " + oldVersion + " to " + newVersion);
db.execSQL("DROP TABLE `message`");
onCreate(db);
}
static void insert(SQLiteDatabase db, EntityMessage message, String text) {
@ -76,6 +78,7 @@ public class FtsDbHelper extends SQLiteOpenHelper {
ContentValues cv = new ContentValues();
cv.put("rowid", message.id);
cv.put("account", message.account);
cv.put("folder", message.folder);
cv.put("time", message.received);
cv.put("address", MessageHelper.formatAddresses(address.toArray(new Address[0]), true, false));
@ -93,7 +96,7 @@ public class FtsDbHelper extends SQLiteOpenHelper {
db.delete("message", "rowid = ?", new Object[]{id});
}
static List<Long> match(SQLiteDatabase db, Long folder, String query) {
static List<Long> match(SQLiteDatabase db, Long account, Long folder, String query) {
StringBuilder sb = new StringBuilder();
for (String or : query.split(",")) {
if (sb.length() > 0)
@ -117,12 +120,19 @@ public class FtsDbHelper extends SQLiteOpenHelper {
}
String search = sb.toString();
Log.i("FTS folder=" + folder + " search=" + search);
String select = "";
if (account != null)
select += "account = " + account + " AND ";
if (folder != null)
select += "folder = " + folder + " AND ";
Log.i("FTS select=" + select + " search=" + search);
List<Long> result = new ArrayList<>();
try (Cursor cursor = db.query(
"message", new String[]{"rowid"},
folder == null ? "message MATCH ?" : "folder = ? AND message MATCH ?",
folder == null ? new Object[]{search} : new Object[]{folder, search},
select + "message MATCH ?",
new Object[]{search},
null, null, "time DESC", null)) {
while (cursor != null && cursor.moveToNext())
result.add(cursor.getLong(0));

View File

@ -79,10 +79,10 @@ public class ViewModelMessages extends ViewModel {
BoundaryCallbackMessages boundary = null;
if (viewType == AdapterMessage.ViewType.FOLDER)
boundary = new BoundaryCallbackMessages(context,
args.folder, true, args.query, REMOTE_PAGE_SIZE);
args.account, args.folder, true, args.query, REMOTE_PAGE_SIZE);
else if (viewType == AdapterMessage.ViewType.SEARCH)
boundary = new BoundaryCallbackMessages(context,
args.folder, args.server, args.query,
args.account, args.folder, args.server, args.query,
args.server ? REMOTE_PAGE_SIZE : SEARCH_PAGE_SIZE);
LivePagedListBuilder<Integer, TupleMessageEx> builder = null;