Skip to content
Snippets Groups Projects
Commit ccec19e8 authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Attempt at improving message loading performance

parent cecdfc83
No related branches found
No related tags found
No related merge requests found
......@@ -231,6 +231,21 @@ class MessageListFragment : ServiceBoundFragment() {
}
})
fun processMessages(list: List<QuasselDatabase.DatabaseMessage>, selected: Set<MsgId>,
expanded: Set<MsgId>, markerLine: MsgId?): List<DisplayMessage> {
var previous: QuasselDatabase.DatabaseMessage? = null
return list.asReversed().map {
it.followUp = previous?.sender == it.sender
previous = it
DisplayMessage(
content = it,
isSelected = selected.contains(it.messageId),
isExpanded = expanded.contains(it.messageId),
isMarkerLine = markerLine == it.messageId
)
}.asReversed()
}
val data = combineLatest(viewModel.buffer,
viewModel.selectedMessages,
viewModel.expandedMessages,
......@@ -238,13 +253,8 @@ class MessageListFragment : ServiceBoundFragment() {
.toLiveData().switchMapNotNull { (buffer, selected, expanded, markerLine) ->
database.filtered().listen(accountId, buffer).switchMapNotNull { filtered ->
LivePagedListBuilder(
database.message().findByBufferIdPagedWithDayChange(buffer, filtered).map {
DisplayMessage(
content = it,
isSelected = selected.contains(it.messageId),
isExpanded = expanded.contains(it.messageId),
isMarkerLine = markerLine.orNull() == it.messageId
)
database.message().findByBufferIdPagedWithDayChange(buffer, filtered).mapByPage {
processMessages(it, selected.keys, expanded, markerLine.orNull())
},
PagedList.Config.Builder()
.setPageSize(backlogSettings.pageSize)
......
......@@ -201,6 +201,44 @@ fun QuasselDatabase.MessageDao.clearMessages(
fun QuasselDatabase.MessageDao.findByBufferIdPagedWithDayChange(bufferId: Int, type: Int) =
this.findMessagesRawPaged(SimpleSQLiteQuery("""
SELECT t.*
FROM
(
SELECT
messageId,
time,
type,
flag,
bufferId,
sender,
senderPrefixes,
content,
followUp
FROM message
WHERE bufferId = ?
AND type & ~? > 0
UNION ALL
SELECT DISTINCT
strftime('%s', date(datetime(time / 1000, 'unixepoch', 'localtime')), 'utc') * -1000 AS messageId,
strftime('%s', date(datetime(time / 1000, 'unixepoch', 'localtime')), 'utc') * 1000 AS time,
8192 AS type,
0 AS flag,
? AS bufferId,
'' AS sender,
'' AS senderPrefixes,
'' AS content,
0 AS followUp
FROM message
WHERE bufferId = ?
AND type & ~? > 0
) t
ORDER BY TIME
DESC, messageId
DESC
""", arrayOf(bufferId, type, bufferId, bufferId, type)))
fun QuasselDatabase.MessageDao.findByBufferIdPagedWithDayChangeSlow(bufferId: Int, type: Int) =
this.findMessagesRawPaged(SimpleSQLiteQuery("""
SELECT t.*
FROM
(
SELECT
......
......@@ -37,7 +37,7 @@ class QuasselViewModel : ViewModel() {
return result.isNotEmpty()
}
val expandedMessages = BehaviorSubject.createDefault(emptyList<MsgId>())
val expandedMessages = BehaviorSubject.createDefault(emptySet<MsgId>())
val buffer = BehaviorSubject.createDefault(-1)
val buffer_liveData = buffer.toLiveData()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment