From 84d2c408ce6fee9460b4a69381e8814a49f988d3 Mon Sep 17 00:00:00 2001 From: JRoberts <8711996+jr-simplex@users.noreply.github.com> Date: Fri, 23 Dec 2022 18:37:02 +0400 Subject: [PATCH] core: optimize chat loading time - faster chat previews queries (item_status index for chat stats), fix live file transfers queries (#1630) * core: optimize get chat previews queries (item_status index for chat stats) * cleanup * optimize chat loading time * cleanup * schema Co-authored-by: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> --- simplex-chat.cabal | 1 + .../M20221223_idx_chat_items_item_status.hs | 12 ++++++++++++ src/Simplex/Chat/Migrations/chat_schema.sql | 1 + src/Simplex/Chat/Store.hs | 17 ++++++++++++----- src/Simplex/Chat/Util.hs | 6 +++++- 5 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 src/Simplex/Chat/Migrations/M20221223_idx_chat_items_item_status.hs diff --git a/simplex-chat.cabal b/simplex-chat.cabal index 6fa6c19df0..8d1b05cb1e 100644 --- a/simplex-chat.cabal +++ b/simplex-chat.cabal @@ -71,6 +71,7 @@ library Simplex.Chat.Migrations.M20221212_chat_items_timed Simplex.Chat.Migrations.M20221214_live_message Simplex.Chat.Migrations.M20221222_chat_ts + Simplex.Chat.Migrations.M20221223_idx_chat_items_item_status Simplex.Chat.Mobile Simplex.Chat.Options Simplex.Chat.ProfileGenerator diff --git a/src/Simplex/Chat/Migrations/M20221223_idx_chat_items_item_status.hs b/src/Simplex/Chat/Migrations/M20221223_idx_chat_items_item_status.hs new file mode 100644 index 0000000000..f29b4a9d5c --- /dev/null +++ b/src/Simplex/Chat/Migrations/M20221223_idx_chat_items_item_status.hs @@ -0,0 +1,12 @@ +{-# LANGUAGE QuasiQuotes #-} + +module Simplex.Chat.Migrations.M20221223_idx_chat_items_item_status where + +import Database.SQLite.Simple (Query) +import Database.SQLite.Simple.QQ (sql) + +m20221223_idx_chat_items_item_status :: Query +m20221223_idx_chat_items_item_status = + [sql| +CREATE INDEX idx_chat_items_item_status ON chat_items(item_status); +|] diff --git a/src/Simplex/Chat/Migrations/chat_schema.sql b/src/Simplex/Chat/Migrations/chat_schema.sql index feed1c6484..233ec8627a 100644 --- a/src/Simplex/Chat/Migrations/chat_schema.sql +++ b/src/Simplex/Chat/Migrations/chat_schema.sql @@ -462,3 +462,4 @@ CREATE INDEX idx_messages_connection_id ON messages(connection_id); CREATE INDEX idx_chat_items_group_member_id ON chat_items(group_member_id); CREATE INDEX idx_chat_items_contact_id ON chat_items(contact_id); CREATE INDEX idx_chat_items_timed_delete_at ON chat_items(timed_delete_at); +CREATE INDEX idx_chat_items_item_status ON chat_items(item_status); diff --git a/src/Simplex/Chat/Store.hs b/src/Simplex/Chat/Store.hs index 95b7b942ea..d2889174e6 100644 --- a/src/Simplex/Chat/Store.hs +++ b/src/Simplex/Chat/Store.hs @@ -322,8 +322,10 @@ import Simplex.Chat.Migrations.M20221211_group_description import Simplex.Chat.Migrations.M20221212_chat_items_timed import Simplex.Chat.Migrations.M20221214_live_message import Simplex.Chat.Migrations.M20221222_chat_ts +import Simplex.Chat.Migrations.M20221223_idx_chat_items_item_status import Simplex.Chat.Protocol import Simplex.Chat.Types +import Simplex.Chat.Util (week) import Simplex.Messaging.Agent.Protocol (ACorrId, AgentMsgId, ConnId, InvitationId, MsgMeta (..)) import Simplex.Messaging.Agent.Store.SQLite (SQLiteStore (..), createSQLiteStore, firstRow, firstRow', maybeFirstRow, withTransaction) import Simplex.Messaging.Agent.Store.SQLite.Migrations (Migration (..)) @@ -378,7 +380,8 @@ schemaMigrations = ("20221211_group_description", m20221211_group_description), ("20221212_chat_items_timed", m20221212_chat_items_timed), ("20221214_live_message", m20221214_live_message), - ("20221222_chat_ts", m20221222_chat_ts) + ("20221222_chat_ts", m20221222_chat_ts), + ("20221223_idx_chat_items_item_status", m20221223_idx_chat_items_item_status) ] -- | The list of migrations in ascending order by date @@ -1235,6 +1238,7 @@ createAcceptedContact db user@User {userId, profile = LocalProfile {preferences} getLiveSndFileTransfers :: DB.Connection -> User -> IO [SndFileTransfer] getLiveSndFileTransfers db User {userId} = do + cutoffTs <- addUTCTime (- week) <$> getCurrentTime fileIds :: [Int64] <- map fromOnly <$> DB.query @@ -1242,10 +1246,11 @@ getLiveSndFileTransfers db User {userId} = do [sql| SELECT DISTINCT f.file_id FROM files f - JOIN snd_files s + JOIN snd_files s USING (file_id) WHERE f.user_id = ? AND s.file_status IN (?, ?, ?) AND s.file_inline IS NULL + AND created_at > ? |] - (userId, FSNew, FSAccepted, FSConnected) + (userId, FSNew, FSAccepted, FSConnected, cutoffTs) concatMap (filter liveTransfer) . rights <$> mapM (getSndFileTransfers_ db userId) fileIds where liveTransfer :: SndFileTransfer -> Bool @@ -1253,6 +1258,7 @@ getLiveSndFileTransfers db User {userId} = do getLiveRcvFileTransfers :: DB.Connection -> User -> IO [RcvFileTransfer] getLiveRcvFileTransfers db user@User {userId} = do + cutoffTs <- addUTCTime (- week) <$> getCurrentTime fileIds :: [Int64] <- map fromOnly <$> DB.query @@ -1260,10 +1266,11 @@ getLiveRcvFileTransfers db user@User {userId} = do [sql| SELECT f.file_id FROM files f - JOIN rcv_files r + JOIN rcv_files r USING (file_id) WHERE f.user_id = ? AND r.file_status IN (?, ?) AND r.rcv_file_inline IS NULL + AND created_at > ? |] - (userId, FSAccepted, FSConnected) + (userId, FSAccepted, FSConnected, cutoffTs) rights <$> mapM (runExceptT . getRcvFileTransfer db user) fileIds getPendingSndChunks :: DB.Connection -> Int64 -> Int64 -> IO [Integer] diff --git a/src/Simplex/Chat/Util.hs b/src/Simplex/Chat/Util.hs index 1354bd8d50..b5c3c8277a 100644 --- a/src/Simplex/Chat/Util.hs +++ b/src/Simplex/Chat/Util.hs @@ -3,11 +3,12 @@ module Simplex.Chat.Util ( diffInMicros, diffInSeconds, + week, ) where import Data.Fixed (Fixed (MkFixed), Pico) -import Data.Time (nominalDiffTimeToSeconds) +import Data.Time (NominalDiffTime, nominalDiffTimeToSeconds) import Data.Time.Clock (UTCTime, diffUTCTime) diffInSeconds :: UTCTime -> UTCTime -> Int @@ -21,3 +22,6 @@ diffInPicos a b = fromInteger . fromPico . nominalDiffTimeToSeconds $ diffUTCTim fromPico :: Pico -> Integer fromPico (MkFixed i) = i + +week :: NominalDiffTime +week = 7 * 86400