Allow search in account

pull/172/head
M66B 5 years ago
parent d261a6fba4
commit 3a93c070de

File diff suppressed because it is too large Load Diff

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

@ -60,7 +60,7 @@ import io.requery.android.database.sqlite.SQLiteDatabase;
// https://developer.android.com/topic/libraries/architecture/room.html // https://developer.android.com/topic/libraries/architecture/room.html
@Database( @Database(
version = 138, version = 139,
entities = { entities = {
EntityIdentity.class, EntityIdentity.class,
EntityAccount.class, EntityAccount.class,
@ -1342,6 +1342,13 @@ public abstract class DB extends RoomDatabase {
Log.i("DB migration from version " + startVersion + " to " + endVersion); Log.i("DB migration from version " + startVersion + " to " + endVersion);
db.execSQL("ALTER TABLE `message` ADD COLUMN `importance` INTEGER"); 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");
}
}); });
} }

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

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

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

Loading…
Cancel
Save