From 2992a12f9fac1a7bf93a7aece5f85285c3b927ff Mon Sep 17 00:00:00 2001 From: bobufa Date: Sat, 11 Aug 2018 13:19:58 +0200 Subject: fix non-adjacent messages being shown before/after hit --- libdino/src/service/database.vala | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) (limited to 'libdino') diff --git a/libdino/src/service/database.vala b/libdino/src/service/database.vala index bea07dda..4d8f0bd6 100644 --- a/libdino/src/service/database.vala +++ b/libdino/src/service/database.vala @@ -282,24 +282,21 @@ public class Database : Qlite.Database { } public Gee.List get_messages(Xmpp.Jid jid, Account account, Message.Type? type, int count, DateTime? before, DateTime? after, int id) { - QueryBuilder select = message.select() - .with(message.counterpart_id, "=", get_jid_id(jid)) - .with(message.account_id, "=", account.id) - .limit(count); - if (jid.resourcepart != null) { - select.with(message.counterpart_resource, "=", jid.resourcepart); - } - if (type != null) { - select.with(message.type_, "=", (int) type); - } + QueryBuilder select = message.select(); + if (before != null) { - select.with(message.local_time, "<", (long) before.to_unix()); if (id > 0) { + select.where(@"local_time < ? OR (local_time = ? AND id < ?)", { before.to_unix().to_string(), before.to_unix().to_string(), id.to_string() }); + } else { select.with(message.id, "<", id); } } if (after != null) { - select.with(message.local_time, ">", (long) after.to_unix()); + if (id > 0) { + select.where(@"local_time > ? OR (local_time = ? AND id > ?)", { after.to_unix().to_string(), after.to_unix().to_string(), id.to_string() }); + } else { + select.with(message.local_time, ">", (long) after.to_unix()); + } if (id > 0) { select.with(message.id, ">", id); } @@ -307,6 +304,16 @@ public class Database : Qlite.Database { select.order_by(message.id, "DESC"); } + select.with(message.counterpart_id, "=", get_jid_id(jid)) + .with(message.account_id, "=", account.id) + .limit(count); + if (jid.resourcepart != null) { + select.with(message.counterpart_resource, "=", jid.resourcepart); + } + if (type != null) { + select.with(message.type_, "=", (int) type); + } + LinkedList ret = new LinkedList(); foreach (Row row in select) { ret.insert(0, new Message.from_row(this, row)); -- cgit v1.2.3-70-g09d2