@@ -53,17 +53,8 @@ sealed class Relationship<E extends DataModelMixin<E>, N> with EquatableMixin {
5353
5454 // setting up from scratch, remove all and add keys
5555
56- db.execute (
57- 'DELETE FROM _edges WHERE (src = ? AND name = ?) OR (dest = ? AND inverse = ?)' ,
58- [_ownerKey! , _name! , _ownerKey! , _name! ]);
59-
60- final ps = db.prepare (
61- 'INSERT INTO _edges (src, name, dest, inverse) VALUES (?, ?, ?, ?)' );
62-
63- for (final key in _uninitializedKeys! ) {
64- ps.execute ([_ownerKey! , _name, key, _inverseName]);
65- }
66- ps.dispose ();
56+ _removeAll (notify: false );
57+ _addAll (_uninitializedKeys! , notify: false );
6758
6859 _uninitializedKeys! .clear ();
6960
@@ -72,42 +63,80 @@ sealed class Relationship<E extends DataModelMixin<E>, N> with EquatableMixin {
7263
7364 // implement collection-like methods
7465
75- void _addAll (Iterable <E > values ) {
66+ void _addAll (Iterable <String > keys, { bool notify = true } ) {
7667 final ps = db.prepare (
7768 'REPLACE INTO _edges (src, name, dest, inverse) VALUES (?, ?, ?, ?)' );
7869 final additions = [];
79- for (final value in values) {
80- ps.execute ([ownerKey, name, value._key! , inverseName]);
81- additions.add (value._key! );
70+ for (final key in keys) {
71+ final order = ownerKey.compareTo (key);
72+ final args = order == - 1
73+ ? [ownerKey, name, key, inverseName]
74+ : [key, inverseName, ownerKey, name];
75+ // TODO if we dont have inverseName?
76+ ps.execute (args);
77+ additions.add (key);
8278 }
8379 ps.dispose ();
8480
85- _adapter.core._notify (
86- [ownerKey, ...additions],
87- metadata: _name,
88- type: DataGraphEventType .addEdge,
89- );
81+ if (notify) {
82+ _adapter.core._notify (
83+ [ownerKey, ...additions],
84+ metadata: _name,
85+ type: DataGraphEventType .addEdge,
86+ );
87+ }
9088 }
9189
9290 bool _contains (E ? element) {
9391 return _iterable.contains (element);
9492 }
9593
9694 bool _update (E value, E newValue) {
97- db.execute (
98- 'UPDATE _edges SET dest = ? WHERE src = ? AND name = ? AND dest = ?' ,
99- [newValue._key! , ownerKey, name, value._key! ]);
95+ // -1 is ascending
96+ final currentKey = value._key! ;
97+ final newKey = newValue._key! ;
98+ final order = ownerKey.compareTo (currentKey);
99+ final args = [newKey, ownerKey, name, currentKey];
100+
101+ if (order == - 1 ) {
102+ db.execute (
103+ 'UPDATE _edges SET dest = ? WHERE src = ? AND name = ? AND dest = ?' ,
104+ args);
105+ } else {
106+ db.execute (
107+ 'UPDATE _edges SET src = ? WHERE dest = ? AND inverse = ? AND src = ?' ,
108+ args);
109+ }
110+
100111 _adapter.core._notify (
101- [ownerKey, newValue._key ! ],
112+ [ownerKey, newKey ],
102113 metadata: _name,
103114 type: DataGraphEventType .updateEdge,
104115 );
105116 return true ;
106117 }
107118
119+ void _removeAll ({bool notify = true }) {
120+ db.execute (
121+ 'DELETE FROM _edges WHERE (src = ? AND name = ?) OR (dest = ? AND inverse = ?)' ,
122+ [_ownerKey! , _name! , _ownerKey! , _name! ]);
123+ }
124+
108125 bool _remove (E value) {
109- db.execute ('DELETE FROM _edges WHERE src = ? AND name = ? AND dest = ?' ,
110- [ownerKey, name, value._key! ]);
126+ // -1 is ascending
127+ final currentKey = value._key! ;
128+ final order = ownerKey.compareTo (currentKey);
129+ final args = [ownerKey, name, currentKey];
130+
131+ if (order == - 1 ) {
132+ db.execute (
133+ 'DELETE FROM _edges WHERE src = ? AND name = ? AND dest = ?' , args);
134+ } else {
135+ db.execute (
136+ 'DELETE FROM _edges WHERE dest = ? AND inverse = ? AND src = ?' ,
137+ args);
138+ }
139+
111140 _adapter.core._notify (
112141 [ownerKey, value._key! ],
113142 metadata: _name,
@@ -140,17 +169,9 @@ sealed class Relationship<E extends DataModelMixin<E>, N> with EquatableMixin {
140169 return _adapter.findManyLocal (_keys);
141170 }
142171
143- Set <String > _keysFor (String key, String name) {
144- final result = _adapter.storage.db.select (
145- 'SELECT src, dest FROM _edges WHERE (src = ? AND name = ?) OR (dest = ? AND inverse = ?)' ,
146- [key, name, key, name]);
147- // final edges = _adapter.storage.edgesFor([(key, name)]);
148- return {for (final r in result) r['src' ] == key ? r['dest' ] : r['src' ]};
149- }
150-
151172 Set <String > get _keys {
152173 if (_ownerKey == null ) return {};
153- return _keysFor (ownerKey, _name! );
174+ return _adapter. _keysFor (ownerKey, _name! );
154175 }
155176
156177 DelayedStateNotifier <DataGraphEvent > get _relationshipEventNotifier {
0 commit comments