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>
This commit is contained in:
JRoberts
2022-12-23 18:37:02 +04:00
committed by GitHub
co-authored by Evgeny Poberezkin
parent de434b730e
commit 84d2c408ce
5 changed files with 31 additions and 6 deletions
+1
View File
@@ -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
@@ -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);
|]
@@ -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);
+12 -5
View File
@@ -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]
+5 -1
View File
@@ -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