Skip to content

Commit fc1f6cf

Browse files
committed
meta pairs improvements
1 parent 373d8b5 commit fc1f6cf

File tree

2 files changed

+36
-29
lines changed

2 files changed

+36
-29
lines changed

lib/src/adapter/watch_adapter.dart

Lines changed: 25 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -178,17 +178,18 @@ mixin _WatchAdapter<T extends DataModelMixin<T>> on _RemoteAdapter<T> {
178178
}
179179

180180
for (final event in events) {
181+
final keysRecord = (event.keys.first, event.keys.last);
181182
// handle done loading
182183
if (notifier.data.isLoading &&
183-
event.keys.last == label.toString() &&
184+
keysRecord.$2 == label.toString() &&
184185
event.type == DataGraphEventType.doneLoading) {
185186
final models = _getUpdatedModels();
186187
states.add(DataState(models, isLoading: false, exception: null));
187188
}
188189

189190
if (notifier.data.isLoading == false &&
190191
event.type.isNode &&
191-
event.keys.first.startsWith(internalType)) {
192+
keysRecord.$1.startsWith(internalType)) {
192193
final models = _getUpdatedModels();
193194
log(label!, 'updated models', logLevel: 2);
194195
states.add(DataState(
@@ -200,7 +201,7 @@ mixin _WatchAdapter<T extends DataModelMixin<T>> on _RemoteAdapter<T> {
200201
}
201202

202203
if (event.type == DataGraphEventType.clear &&
203-
event.keys.first.startsWith(internalType)) {
204+
keysRecord.$1.startsWith(internalType)) {
204205
log(label!, 'clear local storage', logLevel: 2);
205206
states.add(DataState([], isLoading: false, exception: null));
206207
}
@@ -237,7 +238,7 @@ mixin _WatchAdapter<T extends DataModelMixin<T>> on _RemoteAdapter<T> {
237238
label ??= DataRequestLabel('watchOne',
238239
id: key.detypify()?.toString(), type: internalType);
239240

240-
var alsoWatchPairs = <List<String>>{};
241+
var alsoWatchPairs = <(String, String)>{};
241242

242243
// closure to get latest model and watchable relationship pairs
243244
T? _getUpdatedModel() {
@@ -250,13 +251,12 @@ mixin _WatchAdapter<T extends DataModelMixin<T>> on _RemoteAdapter<T> {
250251

251252
// recursively get applicable watch key pairs for each meta -
252253
// from top to bottom (e.g. `p`, `p.familia`, `p.familia.cottage`)
253-
alsoWatchPairs = {
254-
...?metas
255-
?.map((meta) => _getPairsForMeta(meta._top, model._key!))
256-
.nonNulls
257-
.expand((_) => _)
258-
};
259-
// print('also watch $alsoWatchPairs (type $internalType)');
254+
if (metas != null) {
255+
alsoWatchPairs = metas
256+
.map((meta) => _getPairsForMeta(meta._top, model._key!))
257+
.expand((e) => e)
258+
.toSet();
259+
}
260260
} else {
261261
// if there is no model nothing should be watched, reset pairs
262262
alsoWatchPairs = {};
@@ -335,10 +335,11 @@ mixin _WatchAdapter<T extends DataModelMixin<T>> on _RemoteAdapter<T> {
335335
key = bufferModel?._key ?? key;
336336

337337
for (final event in events) {
338-
if (event.keys.contains(key)) {
338+
final keysRecord = (event.keys.first, event.keys.last);
339+
if (keysRecord.contains(key)) {
339340
// handle done loading
340341
if (notifier.data.isLoading &&
341-
event.keys.last == label.toString() &&
342+
keysRecord.$2 == label.toString() &&
342343
event.type == DataGraphEventType.doneLoading) {
343344
states
344345
.add(DataState(bufferModel, isLoading: false, exception: null));
@@ -347,7 +348,7 @@ mixin _WatchAdapter<T extends DataModelMixin<T>> on _RemoteAdapter<T> {
347348
// add/update
348349
if (event.type == DataGraphEventType.updateNode) {
349350
if (notifier.data.isLoading == false) {
350-
log(label!, 'added/updated node ${event.keys}', logLevel: 2);
351+
log(label!, 'added/updated node $keysRecord', logLevel: 2);
351352
states.add(DataState(
352353
bufferModel,
353354
isLoading: notifier.data.isLoading,
@@ -360,16 +361,16 @@ mixin _WatchAdapter<T extends DataModelMixin<T>> on _RemoteAdapter<T> {
360361
// temporarily restore removed pair so that watchedRelationshipUpdate
361362
// has a chance to apply the update
362363
if (event.type == DataGraphEventType.removeEdge &&
363-
!event.keys.first.startsWith('id:')) {
364-
alsoWatchPairs.add(event.keys);
364+
!keysRecord.$1.startsWith('id:')) {
365+
alsoWatchPairs.add(keysRecord);
365366
}
366367
}
367368

368369
// handle deletion
369370
if ([DataGraphEventType.removeNode, DataGraphEventType.clear]
370371
.contains(event.type) &&
371372
bufferModel == null) {
372-
log(label!, 'removed node ${event.keys}', logLevel: 2);
373+
log(label!, 'removed node $keysRecord', logLevel: 2);
373374
states.add(DataState(
374375
null,
375376
isLoading: notifier.data.isLoading,
@@ -381,20 +382,19 @@ mixin _WatchAdapter<T extends DataModelMixin<T>> on _RemoteAdapter<T> {
381382
// updates on watched relationships condition
382383
final watchedRelationshipUpdate = event.type.isEdge &&
383384
alsoWatchPairs
384-
.where((pair) =>
385-
pair.sorted().toString() == event.keys.sorted().toString())
385+
.where((pair) => pair.unorderedEquals(keysRecord))
386386
.isNotEmpty;
387387

388388
// updates on watched models (of relationships) condition
389389
final watchedModelUpdate = event.type.isNode &&
390390
alsoWatchPairs
391-
.where((pair) => pair.contains(event.keys.first))
391+
.where((pair) => pair.contains(keysRecord.$1))
392392
.isNotEmpty;
393393

394394
// if model is loaded and any condition passes, notify update
395395
if (notifier.data.isLoading == false &&
396396
(watchedRelationshipUpdate || watchedModelUpdate)) {
397-
log(label!, 'relationship update ${event.keys}', logLevel: 2);
397+
log(label!, 'relationship update $keysRecord', logLevel: 2);
398398
states.add(DataState(
399399
bufferModel,
400400
isLoading: notifier.data.isLoading,
@@ -433,23 +433,19 @@ mixin _WatchAdapter<T extends DataModelMixin<T>> on _RemoteAdapter<T> {
433433
}
434434
}
435435

436-
Iterable<List<String>> _getPairsForMeta(
436+
Set<(String, String)> _getPairsForMeta(
437437
RelationshipMeta? meta, String ownerKey) {
438438
if (meta == null) return {};
439439

440440
final relationshipKeys = _keysFor(ownerKey, meta.name);
441-
// print('relkeys $relationshipKeys (edge $ownerKey ${meta.name})');
442441

443-
final pm = {
442+
return {
444443
// include key pairs of (owner, key)
445-
for (final key in relationshipKeys) [ownerKey, key],
444+
for (final key in relationshipKeys) (ownerKey, key),
446445
// recursively include key pairs for other requested relationships
447-
// TODO do not include if these are blank
448446
for (final childKey in relationshipKeys)
449-
_getPairsForMeta(meta.child, childKey).expand((_) => _).toList()
447+
..._getPairsForMeta(meta.child, childKey)
450448
};
451-
// print('pairs for meta $pm (edge $ownerKey ${meta.name})');
452-
return pm;
453449
}
454450

455451
// providers

lib/src/utils/extensions.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,3 +136,14 @@ Map<String, String> _flattenQueryParameters(Map<String, dynamic> params) {
136136
return acc;
137137
});
138138
}
139+
140+
extension _R2 on (String, String) {
141+
bool contains(String str) {
142+
return $1 == str || $2 == str;
143+
}
144+
145+
bool unorderedEquals((String, String) record) {
146+
return ($1 == record.$1 || $1 == record.$2) &&
147+
($2 == record.$1 || $2 == record.$2);
148+
}
149+
}

0 commit comments

Comments
 (0)