Skip to content

Commit 276971b

Browse files
committed
unreads [nfc]: Introduce _reverseStreamsLookup data structure
This one is needed for enhancing performance in _removeAllInStreams, _isPresentInStreams which will be done in the upcoming commits. Additionally this will be helpful for efficiently checking for @-mention in subscription_list
1 parent f0b3596 commit 276971b

File tree

1 file changed

+21
-1
lines changed

1 file changed

+21
-1
lines changed

lib/model/unreads.dart

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,17 @@ class Unreads extends ChangeNotifier {
4242
required ChannelStore channelStore,
4343
}) {
4444
final streams = <int, Map<String, QueueList<int>>>{};
45+
final reverseStreamsLookup = <int, ({int streamId, String topic})>{};
4546
final dms = <DmNarrow, QueueList<int>>{};
4647
final mentions = Set.of(initial.mentions);
4748

4849
for (final unreadChannelSnapshot in initial.channels) {
4950
final streamId = unreadChannelSnapshot.streamId;
5051
final topic = unreadChannelSnapshot.topic;
5152
(streams[streamId] ??= {})[topic] = QueueList.from(unreadChannelSnapshot.unreadMessageIds);
53+
final messageInfo = (streamId: streamId, topic: topic);
54+
reverseStreamsLookup.addEntries(
55+
unreadChannelSnapshot.unreadMessageIds.map((messageId) => MapEntry(messageId, messageInfo)));
5256
}
5357

5458
for (final unreadDmSnapshot in initial.dms) {
@@ -65,6 +69,7 @@ class Unreads extends ChangeNotifier {
6569
return Unreads._(
6670
channelStore: channelStore,
6771
streams: streams,
72+
reverseStreamsLookup: reverseStreamsLookup,
6873
dms: dms,
6974
mentions: mentions,
7075
oldUnreadsMissing: initial.oldUnreadsMissing,
@@ -75,11 +80,12 @@ class Unreads extends ChangeNotifier {
7580
Unreads._({
7681
required this.channelStore,
7782
required this.streams,
83+
required Map<int, ({int streamId, String topic})> reverseStreamsLookup,
7884
required this.dms,
7985
required this.mentions,
8086
required this.oldUnreadsMissing,
8187
required this.selfUserId,
82-
});
88+
}) : _reverseStreamsLookup = reverseStreamsLookup;
8389

8490
final ChannelStore channelStore;
8591

@@ -89,6 +95,9 @@ class Unreads extends ChangeNotifier {
8995
/// Unread stream messages, as: stream ID → topic → message IDs (sorted).
9096
final Map<int, Map<String, QueueList<int>>> streams;
9197

98+
/// Maps the message id to the (stream ID, topic) we stored it under in streams.
99+
final Map<int, ({int streamId, String topic})> _reverseStreamsLookup;
100+
92101
/// Unread DM messages, as: DM narrow → message IDs (sorted).
93102
final Map<DmNarrow, QueueList<int>> dms;
94103

@@ -341,6 +350,7 @@ class Unreads extends ChangeNotifier {
341350
streams.clear();
342351
dms.clear();
343352
mentions.clear();
353+
_reverseStreamsLookup.clear();
344354
oldUnreadsMissing = false;
345355
} else {
346356
final messageIdsSet = Set.of(event.messages);
@@ -435,6 +445,7 @@ class Unreads extends ChangeNotifier {
435445

436446
void _addLastInStreamTopic(int messageId, int streamId, String topic) {
437447
((streams[streamId] ??= {})[topic] ??= QueueList()).addLast(messageId);
448+
_reverseStreamsLookup[messageId] = (streamId: streamId, topic: topic);
438449
}
439450

440451
// [messageIds] must be sorted ascending and without duplicates.
@@ -447,6 +458,9 @@ class Unreads extends ChangeNotifier {
447458
// TODO(server-6) remove 6.0 comment
448459
(existing) => setUnion(existing, messageIds),
449460
);
461+
final messageInfo = (streamId: streamId, topic: topic);
462+
_reverseStreamsLookup.addEntries(
463+
messageIds.map((messageId) => MapEntry(messageId, messageInfo)));
450464
}
451465

452466
// TODO use efficient model lookups
@@ -470,6 +484,9 @@ class Unreads extends ChangeNotifier {
470484
for (final streamId in newlyEmptyStreams) {
471485
streams.remove(streamId);
472486
}
487+
for (var messageId in idsToRemove) {
488+
_reverseStreamsLookup.remove(messageId);
489+
}
473490
}
474491

475492
void _removeAllInStreamTopic(Set<int> incomingMessageIds, int streamId, String topic) {
@@ -486,6 +503,9 @@ class Unreads extends ChangeNotifier {
486503
streams.remove(streamId);
487504
}
488505
}
506+
for (var messageId in incomingMessageIds) {
507+
_reverseStreamsLookup.remove(messageId);
508+
}
489509
}
490510

491511
// TODO use efficient model lookups

0 commit comments

Comments
 (0)