aboutsummaryrefslogtreecommitdiff
path: root/libdino
diff options
context:
space:
mode:
authorbobufa <bobufa@users.noreply.github.com>2018-07-22 16:58:51 +0200
committerbobufa <bobufa@users.noreply.github.com>2018-08-13 22:39:18 +0200
commit4901b096708ff5ca54c3e5393de74f2a8be55894 (patch)
treed92993706cb1527228508971898e6be57da3a979 /libdino
parent2e2a9a239000509488f1a369ea4eaf4cdda9c0b1 (diff)
downloaddino-4901b096708ff5ca54c3e5393de74f2a8be55894.tar.gz
dino-4901b096708ff5ca54c3e5393de74f2a8be55894.zip
add search filter expressions
Diffstat (limited to 'libdino')
-rw-r--r--libdino/src/service/search_processor.vala85
1 files changed, 68 insertions, 17 deletions
diff --git a/libdino/src/service/search_processor.vala b/libdino/src/service/search_processor.vala
index 3c1057ae..6962a7c1 100644
--- a/libdino/src/service/search_processor.vala
+++ b/libdino/src/service/search_processor.vala
@@ -23,31 +23,82 @@ public class SearchProcessor : StreamInteractionModule, Object {
this.db = db;
}
- public Gee.List<Message> match_messages(string match, int offset = -1) {
- Gee.List<Message> ret = new ArrayList<Message>(Message.equals_func);
- var query = db.message
- .match(db.message.body, parse_search(match))
+ private QueryBuilder prepare_search(string query) {
+ string words = "";
+ string? with = null;
+ string? in_ = null;
+ string? from = null;
+ foreach(string word in query.split(" ")) {
+ if (word.has_prefix("with:")) {
+ if (with == null) {
+ with = word.substring(5) + "%";
+ } else {
+ return db.message.select().where("0");
+ }
+ } else if (word.has_prefix("in:")) {
+ if (in_ == null) {
+ in_ = word.substring(3) + "%";
+ } else {
+ return db.message.select().where("0");
+ }
+ } else if (word.has_prefix("from:")) {
+ if (from == null) {
+ from = word.substring(5) + "%";
+ } else {
+ return db.message.select().where("0");
+ }
+ } else {
+ words += word + "* ";
+ }
+ }
+ if (in_ != null && with != null) {
+ return db.message.select().where("0");
+ }
+
+ QueryBuilder rows = db.message
+ .match(db.message.body, words)
.order_by(db.message.id, "DESC")
- .limit(10);
+ .join_with(db.jid, db.jid.id, db.message.counterpart_id)
+ .join_with(db.account, db.account.id, db.message.account_id)
+ .outer_join_with(db.real_jid, db.real_jid.message_id, db.message.id);
+ if (with != null) {
+ if (with.index_of("/") > 0) {
+ rows.with(db.message.type_, "=", Message.Type.GROUPCHAT_PM)
+ .with(db.jid.bare_jid, "LIKE", with.substring(0, with.index_of("/")))
+ .with(db.message.counterpart_resource, "LIKE", with.substring(with.index_of("/") + 1));
+ } else {
+ rows.where(@"($(db.message.type_) = $((int)Message.Type.CHAT) AND $(db.jid.bare_jid) LIKE ?)"
+ + @" OR ($(db.message.type_) = $((int)Message.Type.GROUPCHAT_PM) AND $(db.real_jid.real_jid) LIKE ?)"
+ + @" OR ($(db.message.type_) = $((int)Message.Type.GROUPCHAT_PM) AND $(db.message.counterpart_resource) LIKE ?)", {with, with, with});
+ }
+ } else if (in_ != null) {
+ rows.with(db.jid.bare_jid, "LIKE", in_)
+ .with(db.message.type_, "=", Message.Type.GROUPCHAT);
+ }
+ if (from != null) {
+ rows.where(@"($(db.message.direction) = 1 AND $(db.account.bare_jid) LIKE ?)"
+ + @" OR ($(db.message.direction) = 1 AND $(db.message.type_) IN ($((int)Message.Type.GROUPCHAT), $((int)Message.Type.GROUPCHAT_PM)) AND $(db.message.our_resource) LIKE ?)"
+ + @" OR ($(db.message.direction) = 0 AND $(db.message.type_) = $((int)Message.Type.CHAT) AND $(db.jid.bare_jid) LIKE ?)"
+ + @" OR ($(db.message.direction) = 0 AND $(db.message.type_) IN ($((int)Message.Type.GROUPCHAT), $((int)Message.Type.GROUPCHAT_PM)) AND $(db.real_jid.real_jid) LIKE ?)"
+ + @" OR ($(db.message.direction) = 0 AND $(db.message.type_) IN ($((int)Message.Type.GROUPCHAT), $((int)Message.Type.GROUPCHAT_PM)) AND $(db.message.counterpart_resource) LIKE ?)", {from, from, from, from, from});
+ }
+ return rows;
+ }
+
+ public Gee.List<Message> match_messages(string query, int offset = -1) {
+ Gee.List<Message> ret = new ArrayList<Message>(Message.equals_func);
+ var rows = prepare_search(query).limit(10);
if (offset > 0) {
- query.offset(offset);
+ rows.offset(offset);
}
- foreach (Row row in query) {
+ foreach (Row row in rows) {
ret.add(new Message.from_row(db, row));
}
return ret;
}
- public int count_match_messages(string match) {
- return (int)db.message.match(db.message.body, parse_search(match)).count();
- }
-
- private string parse_search(string search) {
- string ret = "";
- foreach(string word in search.split(" ")) {
- ret += word + "* ";
- }
- return ret;
+ public int count_match_messages(string query) {
+ return (int)prepare_search(query).select({db.message.id}).count();
}
}