Batched search

pull/164/head
M66B 6 years ago
parent ee5e109a3c
commit 76f7897489

@ -77,6 +77,8 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback<TupleMe
private State state; private State state;
private static final int SEARCH_LIMIT = 1000;
interface IBoundaryCallbackMessages { interface IBoundaryCallbackMessages {
void onLoading(); void onLoading();
@ -163,7 +165,6 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback<TupleMe
Boolean seen = null; Boolean seen = null;
Boolean flagged = null; Boolean flagged = null;
Boolean snoozed = null; Boolean snoozed = null;
String find = (TextUtils.isEmpty(query) ? null : query.toLowerCase(Locale.ROOT)); String find = (TextUtils.isEmpty(query) ? null : query.toLowerCase(Locale.ROOT));
if (find != null && find.startsWith(context.getString(R.string.title_search_special_prefix) + ":")) { if (find != null && find.startsWith(context.getString(R.string.title_search_special_prefix) + ":")) {
String special = find.split(":")[1]; String special = find.split(":")[1];
@ -173,22 +174,27 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback<TupleMe
flagged = true; flagged = true;
else if (context.getString(R.string.title_search_special_snoozed).equals(special)) else if (context.getString(R.string.title_search_special_snoozed).equals(special))
snoozed = true; snoozed = true;
} }
if (state.matches == null) { int found = 0;
state.matches = db.message().matchMessages(folder, "%" + find + "%", seen, flagged, snoozed); try {
db.beginTransaction();
while (found < pageSize && !state.destroyed) {
state.matches = db.message().matchMessages(
folder,
"%" + find + "%",
seen, flagged, snoozed,
SEARCH_LIMIT, state.offset);
Log.i("Boundary device folder=" + folder + Log.i("Boundary device folder=" + folder +
" query=" + query + " query=" + query +
" seen=" + seen + " seen=" + seen +
" flagged=" + flagged + " flagged=" + flagged +
" snoozed=" + snoozed + " snoozed=" + snoozed +
" matches=" + state.matches.size()); " offset=" + state.offset +
} " size=" + state.matches.size());
if (state.matches.size() == 0)
int found = 0; break;
try {
db.beginTransaction();
for (int i = state.index; i < state.matches.size() && found < pageSize && !state.destroyed; i++) { for (int i = state.index; i < state.matches.size() && found < pageSize && !state.destroyed; i++) {
state.index = i + 1; state.index = i + 1;
@ -218,6 +224,9 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback<TupleMe
} }
} }
state.offset += SEARCH_LIMIT;
}
db.setTransactionSuccessful(); db.setTransactionSuccessful();
if (found == pageSize) if (found == pageSize)
@ -514,6 +523,7 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback<TupleMe
boolean destroyed = false; boolean destroyed = false;
boolean error = false; boolean error = false;
int index = 0; int index = 0;
int offset = 0;
List<TupleMatch> matches = null; List<TupleMatch> matches = null;
MailService iservice = null; MailService iservice = null;

@ -234,8 +234,9 @@ public interface DaoMessage {
" WHEN 0 THEN message.ui_snoozed IS NULL" + " WHEN 0 THEN message.ui_snoozed IS NULL" +
" WHEN 1 THEN message.ui_snoozed IS NOT NULL" + " WHEN 1 THEN message.ui_snoozed IS NOT NULL" +
" ELSE 1 END" + // NULL: true " ELSE 1 END" + // NULL: true
" ORDER BY message.received DESC") " ORDER BY message.received DESC" +
List<TupleMatch> matchMessages(Long folder, String find, Boolean seen, Boolean flagged, Boolean snoozed); " LIMIT :limit OFFSET :offset")
List<TupleMatch> matchMessages(Long folder, String find, Boolean seen, Boolean flagged, Boolean snoozed, int limit, int offset);
@Query("SELECT id" + @Query("SELECT id" +
" FROM message" + " FROM message" +

Loading…
Cancel
Save