Introduce a displayIndex to keep insertion order when querying...

This commit is contained in:
ganfra 2018-11-15 19:00:15 +01:00
parent bb0a70f3c0
commit 40fa326771
6 changed files with 47 additions and 47 deletions

View File

@ -9,3 +9,10 @@ internal fun RoomEntity.deleteOnCascade(chunkEntity: ChunkEntity) {
chunkEntity.events.deleteAllFromRealm() chunkEntity.events.deleteAllFromRealm()
chunkEntity.deleteFromRealm() chunkEntity.deleteFromRealm()
} }

internal fun RoomEntity.addOrUpdate(chunkEntity: ChunkEntity) {
chunkEntity.events.forEachIndexed { index, eventEntity -> eventEntity.displayIndex = index }
if (!chunks.contains(chunkEntity)) {
chunks.add(chunkEntity)
}
}

View File

@ -13,7 +13,8 @@ internal open class EventEntity(var eventId: String = "",
var sender: String? = null, var sender: String? = null,
var age: Long? = 0, var age: Long? = 0,
var redacts: String? = null, var redacts: String? = null,
var stateIndex: Int = 0 var stateIndex: Int = 0,
var displayIndex: Int = 0
) : RealmObject() { ) : RealmObject() {


companion object { companion object {

View File

@ -5,12 +5,11 @@ import com.zhuinden.monarchy.Monarchy
import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.MatrixCallback
import im.vector.matrix.android.api.session.room.model.Membership import im.vector.matrix.android.api.session.room.model.Membership
import im.vector.matrix.android.api.util.Cancelable import im.vector.matrix.android.api.util.Cancelable
import im.vector.matrix.android.internal.database.model.EventEntity import im.vector.matrix.android.internal.database.helper.addOrUpdate
import im.vector.matrix.android.internal.database.model.RoomEntity import im.vector.matrix.android.internal.database.model.RoomEntity
import im.vector.matrix.android.internal.database.query.where import im.vector.matrix.android.internal.database.query.where
import im.vector.matrix.android.internal.network.executeRequest import im.vector.matrix.android.internal.network.executeRequest
import im.vector.matrix.android.internal.session.room.RoomAPI import im.vector.matrix.android.internal.session.room.RoomAPI
import im.vector.matrix.android.internal.session.room.timeline.PaginationDirection
import im.vector.matrix.android.internal.session.sync.StateEventsChunkHandler import im.vector.matrix.android.internal.session.sync.StateEventsChunkHandler
import im.vector.matrix.android.internal.util.CancelableCoroutine import im.vector.matrix.android.internal.util.CancelableCoroutine
import im.vector.matrix.android.internal.util.MatrixCoroutineDispatchers import im.vector.matrix.android.internal.util.MatrixCoroutineDispatchers
@ -59,9 +58,7 @@ internal class LoadRoomMembersRequest(private val roomAPI: RoomAPI,
val eventsToInsert = response.roomMemberEvents.filter { !roomMembers.containsKey(it.stateKey) } val eventsToInsert = response.roomMemberEvents.filter { !roomMembers.containsKey(it.stateKey) }


val chunk = stateEventsChunkHandler.handle(realm, roomId, eventsToInsert) val chunk = stateEventsChunkHandler.handle(realm, roomId, eventsToInsert)
if (!roomEntity.chunks.contains(chunk)) { roomEntity.addOrUpdate(chunk)
roomEntity.chunks.add(chunk)
}
roomEntity.areAllMembersLoaded = true roomEntity.areAllMembersLoaded = true
} }
.map { response } .map { response }

View File

@ -8,8 +8,10 @@ import im.vector.matrix.android.api.session.events.interceptor.EnrichedEventInte
import im.vector.matrix.android.api.session.events.model.EnrichedEvent import im.vector.matrix.android.api.session.events.model.EnrichedEvent
import im.vector.matrix.android.api.session.room.TimelineHolder import im.vector.matrix.android.api.session.room.TimelineHolder
import im.vector.matrix.android.internal.database.mapper.asDomain import im.vector.matrix.android.internal.database.mapper.asDomain
import im.vector.matrix.android.internal.database.model.ChunkEntity import im.vector.matrix.android.internal.database.model.ChunkEntityFields
import im.vector.matrix.android.internal.database.query.findLastLiveChunkFromRoom import im.vector.matrix.android.internal.database.model.EventEntity
import im.vector.matrix.android.internal.database.model.EventEntityFields
import im.vector.matrix.android.internal.database.query.where
import im.vector.matrix.android.internal.session.events.interceptor.MessageEventInterceptor import im.vector.matrix.android.internal.session.events.interceptor.MessageEventInterceptor


private const val PAGE_SIZE = 30 private const val PAGE_SIZE = 30
@ -28,9 +30,10 @@ internal class DefaultTimelineHolder(private val roomId: String,


override fun liveTimeline(): LiveData<PagedList<EnrichedEvent>> { override fun liveTimeline(): LiveData<PagedList<EnrichedEvent>> {
val realmDataSourceFactory = monarchy.createDataSourceFactory { realm -> val realmDataSourceFactory = monarchy.createDataSourceFactory { realm ->
ChunkEntity.findLastLiveChunkFromRoom(realm, roomId = roomId) EventEntity
?.events .where(realm, roomId = roomId)
?.where() .equalTo("${EventEntityFields.CHUNK}.${ChunkEntityFields.IS_LAST}", true)
.sort(EventEntityFields.DISPLAY_INDEX)
} }
val domainSourceFactory = realmDataSourceFactory val domainSourceFactory = realmDataSourceFactory
.map { it.asDomain() } .map { it.asDomain() }

View File

@ -6,6 +6,7 @@ import com.zhuinden.monarchy.Monarchy
import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.MatrixCallback
import im.vector.matrix.android.api.util.Cancelable import im.vector.matrix.android.api.util.Cancelable
import im.vector.matrix.android.internal.database.helper.addAll import im.vector.matrix.android.internal.database.helper.addAll
import im.vector.matrix.android.internal.database.helper.addOrUpdate
import im.vector.matrix.android.internal.database.helper.deleteOnCascade import im.vector.matrix.android.internal.database.helper.deleteOnCascade
import im.vector.matrix.android.internal.database.helper.merge import im.vector.matrix.android.internal.database.helper.merge
import im.vector.matrix.android.internal.database.model.ChunkEntity import im.vector.matrix.android.internal.database.model.ChunkEntity
@ -90,15 +91,11 @@ internal class PaginationRequest(private val roomAPI: RoomAPI,
} }
} }


if (!roomEntity.chunks.contains(currentChunk)) { roomEntity.addOrUpdate(currentChunk)
roomEntity.chunks.add(currentChunk)
}


// TODO : there is an issue with the pagination sending unwanted room member events // TODO : there is an issue with the pagination sending unwanted room member events
val stateEventsChunk = stateEventsChunkHandler.handle(realm, roomId, receivedChunk.stateEvents) val stateEventsChunk = stateEventsChunkHandler.handle(realm, roomId, receivedChunk.stateEvents)
if (!roomEntity.chunks.contains(stateEventsChunk)) { roomEntity.addOrUpdate(stateEventsChunk)
roomEntity.chunks.add(stateEventsChunk)
}
} }
.map { receivedChunk } .map { receivedChunk }
} }

View File

@ -5,6 +5,7 @@ import im.vector.matrix.android.api.session.events.model.Event
import im.vector.matrix.android.api.session.events.model.EventType import im.vector.matrix.android.api.session.events.model.EventType
import im.vector.matrix.android.api.session.room.model.MyMembership import im.vector.matrix.android.api.session.room.model.MyMembership
import im.vector.matrix.android.internal.database.helper.addAll import im.vector.matrix.android.internal.database.helper.addAll
import im.vector.matrix.android.internal.database.helper.addOrUpdate
import im.vector.matrix.android.internal.database.model.ChunkEntity import im.vector.matrix.android.internal.database.model.ChunkEntity
import im.vector.matrix.android.internal.database.model.RoomEntity import im.vector.matrix.android.internal.database.model.RoomEntity
import im.vector.matrix.android.internal.database.model.RoomSummaryEntity import im.vector.matrix.android.internal.database.model.RoomSummaryEntity
@ -65,16 +66,12 @@ internal class RoomSyncHandler(private val monarchy: Monarchy,


if (roomSync.state != null && roomSync.state.events.isNotEmpty()) { if (roomSync.state != null && roomSync.state.events.isNotEmpty()) {
val chunkEntity = stateEventsChunkHandler.handle(realm, roomId, roomSync.state.events) val chunkEntity = stateEventsChunkHandler.handle(realm, roomId, roomSync.state.events)
if (!roomEntity.chunks.contains(chunkEntity)) { roomEntity.addOrUpdate(chunkEntity)
roomEntity.chunks.add(chunkEntity)
}
} }


if (roomSync.timeline != null && roomSync.timeline.events.isNotEmpty()) { if (roomSync.timeline != null && roomSync.timeline.events.isNotEmpty()) {
val chunkEntity = handleTimelineEvents(realm, roomId, roomSync.timeline.events, roomSync.timeline.prevToken, isLimited = roomSync.timeline.limited) val chunkEntity = handleTimelineEvents(realm, roomId, roomSync.timeline.events, roomSync.timeline.prevToken, isLimited = roomSync.timeline.limited)
if (!roomEntity.chunks.contains(chunkEntity)) { roomEntity.addOrUpdate(chunkEntity)
roomEntity.chunks.add(chunkEntity)
}
} }


if (roomSync.summary != null) { if (roomSync.summary != null) {
@ -96,9 +93,7 @@ internal class RoomSyncHandler(private val monarchy: Monarchy,
roomEntity.membership = MyMembership.INVITED roomEntity.membership = MyMembership.INVITED
if (roomSync.inviteState != null && roomSync.inviteState.events.isNotEmpty()) { if (roomSync.inviteState != null && roomSync.inviteState.events.isNotEmpty()) {
val chunkEntity = handleTimelineEvents(realm, roomId, roomSync.inviteState.events) val chunkEntity = handleTimelineEvents(realm, roomId, roomSync.inviteState.events)
if (!roomEntity.chunks.contains(chunkEntity)) { roomEntity.addOrUpdate(chunkEntity)
roomEntity.chunks.add(chunkEntity)
}
} }
return roomEntity return roomEntity
} }
@ -112,26 +107,6 @@ internal class RoomSyncHandler(private val monarchy: Monarchy,
} }
} }


private fun handleRoomSummary(realm: Realm,
roomId: String,
roomSummary: RoomSyncSummary) {

val roomSummaryEntity = RoomSummaryEntity.where(realm, roomId).findFirst()
?: RoomSummaryEntity(roomId)

if (roomSummary.heroes.isNotEmpty()) {
roomSummaryEntity.heroes.clear()
roomSummaryEntity.heroes.addAll(roomSummary.heroes)
}
if (roomSummary.invitedMembersCount != null) {
roomSummaryEntity.invitedMembersCount = roomSummary.invitedMembersCount
}
if (roomSummary.joinedMembersCount != null) {
roomSummaryEntity.joinedMembersCount = roomSummary.joinedMembersCount
}
realm.insertOrUpdate(roomSummaryEntity)
}

private fun handleTimelineEvents(realm: Realm, private fun handleTimelineEvents(realm: Realm,
roomId: String, roomId: String,
eventList: List<Event>, eventList: List<Event>,
@ -155,6 +130,26 @@ internal class RoomSyncHandler(private val monarchy: Monarchy,
return chunkEntity return chunkEntity
} }


private fun handleRoomSummary(realm: Realm,
roomId: String,
roomSummary: RoomSyncSummary) {

val roomSummaryEntity = RoomSummaryEntity.where(realm, roomId).findFirst()
?: RoomSummaryEntity(roomId)

if (roomSummary.heroes.isNotEmpty()) {
roomSummaryEntity.heroes.clear()
roomSummaryEntity.heroes.addAll(roomSummary.heroes)
}
if (roomSummary.invitedMembersCount != null) {
roomSummaryEntity.invitedMembersCount = roomSummary.invitedMembersCount
}
if (roomSummary.joinedMembersCount != null) {
roomSummaryEntity.joinedMembersCount = roomSummary.joinedMembersCount
}
realm.insertOrUpdate(roomSummaryEntity)
}

private fun handleEphemeral(realm: Realm, private fun handleEphemeral(realm: Realm,
roomId: String, roomId: String,
ephemeral: RoomSyncEphemeral) { ephemeral: RoomSyncEphemeral) {