@@ -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
0 commit comments