mirror of https://github.com/M66B/FairEmail.git
Added FTS expressions
This commit is contained in:
parent
f0b792f9e1
commit
a540c33397
|
@ -194,8 +194,6 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback<TupleMe
|
|||
DB db = DB.getInstance(context);
|
||||
|
||||
int found = 0;
|
||||
if (criteria.isExpression())
|
||||
return found;
|
||||
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
boolean fts = prefs.getBoolean("fts", false);
|
||||
|
@ -227,6 +225,9 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback<TupleMe
|
|||
return found;
|
||||
}
|
||||
|
||||
if (criteria.isExpression())
|
||||
return found;
|
||||
|
||||
try {
|
||||
db.beginTransaction();
|
||||
|
||||
|
@ -708,34 +709,28 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback<TupleMe
|
|||
List<String> plus = new ArrayList<>();
|
||||
List<String> minus = new ArrayList<>();
|
||||
List<String> opt = new ArrayList<>();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
StringBuilder all = new StringBuilder();
|
||||
for (String w : search.trim().split("\\s+")) {
|
||||
if (sb.length() > 0)
|
||||
sb.append(' ');
|
||||
if (all.length() > 0)
|
||||
all.append(' ');
|
||||
|
||||
if (w.length() > 1 && w.startsWith("+")) {
|
||||
plus.add(w.substring(1));
|
||||
sb.append(w.substring(1));
|
||||
all.append(w.substring(1));
|
||||
} else if (w.length() > 1 && w.startsWith("-")) {
|
||||
minus.add(w.substring(1));
|
||||
sb.append(w.substring(1));
|
||||
all.append(w.substring(1));
|
||||
} else if (w.length() > 1 && w.startsWith("?")) {
|
||||
opt.add(w.substring(1));
|
||||
sb.append(w.substring(1));
|
||||
all.append(w.substring(1));
|
||||
} else {
|
||||
word.add(w);
|
||||
sb.append(w);
|
||||
all.append(w);
|
||||
}
|
||||
}
|
||||
|
||||
if (plus.size() + minus.size() + opt.size() > 0) {
|
||||
search = sb.toString();
|
||||
Log.i("SEARCH word=" + TextUtils.join(",", word));
|
||||
Log.i("SEARCH plus=" + TextUtils.join(",", plus));
|
||||
Log.i("SEARCH minus=" + TextUtils.join(",", minus));
|
||||
Log.i("SEARCH opt=" + TextUtils.join(",", opt));
|
||||
Log.i("SEARCH full=" + search);
|
||||
}
|
||||
if (plus.size() + minus.size() + opt.size() > 0)
|
||||
search = all.toString();
|
||||
|
||||
// Yahoo! does not support keyword search, but uses the flags $Forwarded $Junk $NotJunk
|
||||
boolean hasKeywords = false;
|
||||
|
|
|
@ -334,10 +334,6 @@ public class FragmentDialogSearch extends FragmentDialogBase {
|
|||
Log.unexpectedError(getParentFragmentManager(), ex);
|
||||
}
|
||||
}.execute(getContext(), getViewLifecycleOwner(), getArguments(), "search:raw");
|
||||
else if (criteria.isExpression() && folder > 0)
|
||||
FragmentMessages.search(
|
||||
getContext(), getViewLifecycleOwner(), getParentFragmentManager(),
|
||||
account, folder, true, criteria);
|
||||
else
|
||||
FragmentMessages.search(
|
||||
getContext(), getViewLifecycleOwner(), getParentFragmentManager(),
|
||||
|
|
|
@ -111,29 +111,61 @@ public class FtsDbHelper extends SQLiteOpenHelper {
|
|||
SQLiteDatabase db,
|
||||
Long account, Long folder,
|
||||
BoundaryCallbackMessages.SearchCriteria criteria) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (String or : criteria.query.split(",")) {
|
||||
if (sb.length() > 0)
|
||||
sb.append(" OR ");
|
||||
|
||||
boolean first = true;
|
||||
sb.append("(");
|
||||
for (String and : or.trim().split("\\s+")) {
|
||||
if (first)
|
||||
first = false;
|
||||
else
|
||||
sb.append(" AND ");
|
||||
List<String> word = new ArrayList<>();
|
||||
List<String> plus = new ArrayList<>();
|
||||
List<String> minus = new ArrayList<>();
|
||||
List<String> opt = new ArrayList<>();
|
||||
StringBuilder all = new StringBuilder();
|
||||
for (String w : criteria.query.trim().split("\\s+")) {
|
||||
if (all.length() > 0)
|
||||
all.append(' ');
|
||||
|
||||
// Escape quotes
|
||||
String term = and.replaceAll("\"", "\"\"");
|
||||
|
||||
// Quote search term
|
||||
sb.append("\"").append(term).append("\"");
|
||||
if (w.length() > 1 && w.startsWith("+")) {
|
||||
plus.add(w.substring(1));
|
||||
all.append(w.substring(1));
|
||||
} else if (w.length() > 1 && w.startsWith("-")) {
|
||||
minus.add(w.substring(1));
|
||||
all.append(w.substring(1));
|
||||
} else if (w.length() > 1 && w.startsWith("?")) {
|
||||
opt.add(w.substring(1));
|
||||
all.append(w.substring(1));
|
||||
} else {
|
||||
word.add(w);
|
||||
all.append(w);
|
||||
}
|
||||
sb.append(")");
|
||||
}
|
||||
|
||||
String search = sb.toString();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
if (plus.size() + minus.size() + opt.size() > 0) {
|
||||
if (word.size() > 0)
|
||||
sb.append(escape(TextUtils.join(" ", word)));
|
||||
|
||||
for (String p : plus) {
|
||||
if (sb.length() > 0)
|
||||
sb.append(" AND ");
|
||||
sb.append(escape(p));
|
||||
}
|
||||
|
||||
for (String m : minus) {
|
||||
if (sb.length() > 0)
|
||||
sb.append(" NOT ");
|
||||
sb.append(escape(m));
|
||||
}
|
||||
|
||||
if (sb.length() > 0) {
|
||||
sb.insert(0, '(');
|
||||
sb.append(')');
|
||||
}
|
||||
|
||||
for (String o : opt) {
|
||||
if (sb.length() > 0)
|
||||
sb.append(" OR ");
|
||||
sb.append(escape(o));
|
||||
}
|
||||
}
|
||||
|
||||
String search = (sb.length() > 0 ? sb.toString() : escape(criteria.query));
|
||||
|
||||
String select = "";
|
||||
if (account != null)
|
||||
|
@ -159,6 +191,10 @@ public class FtsDbHelper extends SQLiteOpenHelper {
|
|||
return result;
|
||||
}
|
||||
|
||||
private static String escape(String word) {
|
||||
return "\"" + word.replaceAll("\"", "\"\"") + "\"";
|
||||
}
|
||||
|
||||
static Cursor getIds(SQLiteDatabase db) {
|
||||
return db.query(
|
||||
"message", new String[]{"rowid"},
|
||||
|
|
Loading…
Reference in New Issue