Fix to allow combine search specifiers, bug 749938
This commit is contained in:
parent
6c311e5cbf
commit
ab6aa5988d
1 changed files with 27 additions and 6 deletions
|
|
@ -996,9 +996,23 @@ private class Geary.ImapDB.Account : BaseObject {
|
|||
return phrases;
|
||||
}
|
||||
|
||||
private void sql_add_query_phrases(StringBuilder sql, Gee.HashMap<string, string> query_phrases) {
|
||||
foreach (string field in query_phrases.keys)
|
||||
sql.append(" AND %s MATCH ?".printf(field));
|
||||
private void sql_add_query_phrases(StringBuilder sql, Gee.HashMap<string, string> query_phrases,
|
||||
string operator, string columns, string condition) {
|
||||
bool is_first_field = true;
|
||||
foreach (string field in query_phrases.keys) {
|
||||
if (!is_first_field)
|
||||
sql.append_printf("""
|
||||
%s
|
||||
SELECT %s
|
||||
FROM MessageSearchTable
|
||||
WHERE %s
|
||||
MATCH ?
|
||||
%s
|
||||
""", operator, columns, field, condition);
|
||||
else
|
||||
sql.append_printf(" AND %s MATCH ?", field);
|
||||
is_first_field = false;
|
||||
}
|
||||
}
|
||||
|
||||
private int sql_bind_query_phrases(Db.Statement stmt, int start_index,
|
||||
|
|
@ -1102,7 +1116,7 @@ private class Geary.ImapDB.Account : BaseObject {
|
|||
FROM MessageSearchTable
|
||||
WHERE 1=1
|
||||
""");
|
||||
sql_add_query_phrases(sql, query_phrases);
|
||||
sql_add_query_phrases(sql, query_phrases, "INTERSECT", "docid", "");
|
||||
sql.append(")");
|
||||
|
||||
if (blacklisted_ids_sql != "")
|
||||
|
|
@ -1805,7 +1819,12 @@ private class Geary.ImapDB.Account : BaseObject {
|
|||
""");
|
||||
sql_append_ids(sql, id_map.keys);
|
||||
sql.append(")");
|
||||
sql_add_query_phrases(sql, query_phrases);
|
||||
|
||||
StringBuilder condition = new StringBuilder("AND docid IN (");
|
||||
sql_append_ids(condition, id_map.keys);
|
||||
condition.append(")");
|
||||
sql_add_query_phrases(sql, query_phrases, "UNION", "docid, offsets(MessageSearchTable), *",
|
||||
condition.str);
|
||||
|
||||
Db.Statement stmt = cx.prepare(sql.str);
|
||||
sql_bind_query_phrases(stmt, 0, query_phrases);
|
||||
|
|
@ -1816,7 +1835,7 @@ private class Geary.ImapDB.Account : BaseObject {
|
|||
Db.Result result = stmt.exec(cancellable);
|
||||
while (!result.finished) {
|
||||
int64 docid = result.rowid_at(0);
|
||||
assert(id_map.contains(docid));
|
||||
assert(id_map.has_key(docid));
|
||||
ImapDB.EmailIdentifier id = id_map.get(docid);
|
||||
|
||||
// offsets() function returns a list of 4 strings that are ints indicating position
|
||||
|
|
@ -1841,6 +1860,8 @@ private class Geary.ImapDB.Account : BaseObject {
|
|||
break;
|
||||
}
|
||||
|
||||
if (search_matches.has_key(id))
|
||||
matches.add_all(search_matches.get(id));
|
||||
search_matches.set(id, matches);
|
||||
|
||||
result.next(cancellable);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue