Skip to content

Commit 12c4124

Browse files
committed
Rename statusInPriority to priorityStatusEntries
1 parent 505acb7 commit 12c4124

File tree

5 files changed

+45
-46
lines changed

5 files changed

+45
-46
lines changed

packages/powersync_core/lib/src/database/powersync_db_mixin.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ mixin PowerSyncDatabaseMixin implements SqliteConnection {
127127
const prioritySentinel = 2147483647;
128128
var hasSynced = false;
129129
DateTime? lastCompleteSync;
130-
final priorityStatus = <SyncPriorityStatus>[];
130+
final priorityStatusEntries = <SyncPriorityStatus>[];
131131

132132
DateTime parseDateTime(String sql) {
133133
return DateTime.parse('${sql}Z').toLocal();
@@ -141,7 +141,7 @@ mixin PowerSyncDatabaseMixin implements SqliteConnection {
141141
hasSynced = true;
142142
lastCompleteSync = lastSyncedAt;
143143
} else {
144-
priorityStatus.add((
144+
priorityStatusEntries.add((
145145
hasSynced: true,
146146
lastSyncedAt: lastSyncedAt,
147147
priority: BucketPriority(priority)
@@ -153,7 +153,7 @@ mixin PowerSyncDatabaseMixin implements SqliteConnection {
153153
final status = SyncStatus(
154154
hasSynced: hasSynced,
155155
lastSyncedAt: lastCompleteSync,
156-
statusInPriority: priorityStatus,
156+
priorityStatusEntries: priorityStatusEntries,
157157
);
158158
setStatus(status);
159159
}

packages/powersync_core/lib/src/streaming_sync.dart

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -276,30 +276,13 @@ class StreamingSyncImplementation implements StreamingSync {
276276
}
277277

278278
void _updateStatusForPriority(SyncPriorityStatus completed) {
279-
// Note: statusInPriority is sorted by priorities (ascending)
280-
final existingPriorityState = lastStatus.statusInPriority;
281-
282-
for (final (i, priority) in existingPriorityState.indexed) {
283-
switch (
284-
BucketPriority.comparator(priority.priority, completed.priority)) {
285-
case > 0:
286-
// Entries from here on have a higher priority than the one that was
287-
// just completed
288-
final copy = existingPriorityState.toList();
289-
copy.insert(i, completed);
290-
_updateStatus(statusInPriority: copy);
291-
return;
292-
case 0:
293-
final copy = existingPriorityState.toList();
294-
copy[i] = completed;
295-
_updateStatus(statusInPriority: copy);
296-
return;
297-
case < 0:
298-
continue;
299-
}
300-
}
301-
302-
_updateStatus(statusInPriority: [...existingPriorityState, completed]);
279+
// All status entries with a higher priority can be deleted since this
280+
// partial sync includes them.
281+
_updateStatus(priorityStatusEntries: [
282+
for (final entry in lastStatus.priorityStatusEntries)
283+
if (entry.priority < completed.priority) entry,
284+
completed
285+
]);
303286
}
304287

305288
/// Update sync status based on any non-null parameters.
@@ -313,7 +296,7 @@ class StreamingSyncImplementation implements StreamingSync {
313296
bool? uploading,
314297
Object? uploadError,
315298
Object? downloadError,
316-
List<SyncPriorityStatus>? statusInPriority,
299+
List<SyncPriorityStatus>? priorityStatusEntries,
317300
}) {
318301
final c = connected ?? lastStatus.connected;
319302
var newStatus = SyncStatus(
@@ -329,7 +312,8 @@ class StreamingSyncImplementation implements StreamingSync {
329312
downloadError: downloadError == _noError
330313
? null
331314
: (downloadError ?? lastStatus.downloadError),
332-
statusInPriority: statusInPriority ?? lastStatus.statusInPriority,
315+
priorityStatusEntries:
316+
priorityStatusEntries ?? lastStatus.priorityStatusEntries,
333317
);
334318

335319
if (!_statusStreamController.isClosed) {
@@ -412,7 +396,7 @@ class StreamingSyncImplementation implements StreamingSync {
412396
downloading: false,
413397
downloadError: _noError,
414398
lastSyncedAt: now,
415-
statusInPriority: [
399+
priorityStatusEntries: [
416400
if (appliedCheckpoint.checksums.isNotEmpty)
417401
(
418402
hasSynced: true,

packages/powersync_core/lib/src/sync_status.dart

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ final class SyncStatus {
4040
/// Cleared on the next successful data download.
4141
final Object? downloadError;
4242

43-
final List<SyncPriorityStatus> statusInPriority;
43+
final List<SyncPriorityStatus> priorityStatusEntries;
4444

4545
const SyncStatus({
4646
this.connected = false,
@@ -51,7 +51,7 @@ final class SyncStatus {
5151
this.uploading = false,
5252
this.downloadError,
5353
this.uploadError,
54-
this.statusInPriority = const [],
54+
this.priorityStatusEntries = const [],
5555
});
5656

5757
@override
@@ -65,7 +65,8 @@ final class SyncStatus {
6565
other.uploadError == uploadError &&
6666
other.lastSyncedAt == lastSyncedAt &&
6767
other.hasSynced == hasSynced &&
68-
_statusEquality.equals(other.statusInPriority, statusInPriority));
68+
_statusEquality.equals(
69+
other.priorityStatusEntries, priorityStatusEntries));
6970
}
7071

7172
SyncStatus copyWith({
@@ -77,7 +78,7 @@ final class SyncStatus {
7778
Object? downloadError,
7879
DateTime? lastSyncedAt,
7980
bool? hasSynced,
80-
List<SyncPriorityStatus>? statusInPriority,
81+
List<SyncPriorityStatus>? priorityStatusEntries,
8182
}) {
8283
return SyncStatus(
8384
connected: connected ?? this.connected,
@@ -88,7 +89,8 @@ final class SyncStatus {
8889
downloadError: downloadError ?? this.downloadError,
8990
lastSyncedAt: lastSyncedAt ?? this.lastSyncedAt,
9091
hasSynced: hasSynced ?? this.hasSynced,
91-
statusInPriority: statusInPriority ?? this.statusInPriority,
92+
priorityStatusEntries:
93+
priorityStatusEntries ?? this.priorityStatusEntries,
9294
);
9395
}
9496

@@ -111,14 +113,14 @@ final class SyncStatus {
111113
/// in priority `2` necessarily includes a consistent view over data in
112114
/// priority `1`.
113115
SyncPriorityStatus statusForPriority(BucketPriority priority) {
114-
assert(statusInPriority.isSortedByCompare(
116+
assert(priorityStatusEntries.isSortedByCompare(
115117
(e) => e.priority, BucketPriority.comparator));
116118

117-
for (final known in statusInPriority) {
119+
for (final known in priorityStatusEntries) {
118120
// Lower-priority buckets are synchronized after higher-priority buckets,
119-
// and since statusInPriority is sorted we look for the first entry that
120-
// doesn't have a higher priority.
121-
if (BucketPriority.comparator(known.priority, priority) <= 0) {
121+
// and since priorityStatusEntries is sorted we look for the first entry
122+
// that doesn't have a higher priority.
123+
if (known.priority <= priority) {
122124
return known;
123125
}
124126
}
@@ -141,7 +143,7 @@ final class SyncStatus {
141143
uploadError,
142144
downloadError,
143145
lastSyncedAt,
144-
_statusEquality.hash(statusInPriority));
146+
_statusEquality.hash(priorityStatusEntries));
145147
}
146148

147149
@override
@@ -161,6 +163,11 @@ extension type const BucketPriority._(int priorityNumber) {
161163
return BucketPriority._(i);
162164
}
163165

166+
bool operator >(BucketPriority other) => comparator(this, other) > 0;
167+
bool operator >=(BucketPriority other) => comparator(this, other) >= 0;
168+
bool operator <(BucketPriority other) => comparator(this, other) < 0;
169+
bool operator <=(BucketPriority other) => comparator(this, other) <= 0;
170+
164171
/// A [Comparator] instance suitable for comparing [BucketPriority] values.
165172
static int comparator(BucketPriority a, BucketPriority b) =>
166173
-a.priorityNumber.compareTo(b.priorityNumber);

packages/powersync_core/lib/src/web/sync_worker_protocol.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ extension type SerializedSyncStatus._(JSObject _) implements JSObject {
157157
required bool? hasSyned,
158158
required String? uploadError,
159159
required String? downloadError,
160-
required JSArray? statusInPriority,
160+
required JSArray? priorityStatusEntries,
161161
});
162162

163163
factory SerializedSyncStatus.from(SyncStatus status) {
@@ -170,8 +170,8 @@ extension type SerializedSyncStatus._(JSObject _) implements JSObject {
170170
hasSyned: status.hasSynced,
171171
uploadError: status.uploadError?.toString(),
172172
downloadError: status.downloadError?.toString(),
173-
statusInPriority: <JSArray?>[
174-
for (final entry in status.statusInPriority)
173+
priorityStatusEntries: <JSArray?>[
174+
for (final entry in status.priorityStatusEntries)
175175
[
176176
entry.priority.priorityNumber.toJS,
177177
entry.lastSyncedAt?.microsecondsSinceEpoch.toJS,
@@ -189,7 +189,7 @@ extension type SerializedSyncStatus._(JSObject _) implements JSObject {
189189
external bool? hasSynced;
190190
external String? uploadError;
191191
external String? downloadError;
192-
external JSArray? statusInPriority;
192+
external JSArray? priorityStatusEntries;
193193

194194
SyncStatus asSyncStatus() {
195195
return SyncStatus(
@@ -203,7 +203,7 @@ extension type SerializedSyncStatus._(JSObject _) implements JSObject {
203203
hasSynced: hasSynced,
204204
uploadError: uploadError,
205205
downloadError: downloadError,
206-
statusInPriority: statusInPriority?.toDart.map((e) {
206+
priorityStatusEntries: priorityStatusEntries?.toDart.map((e) {
207207
final [rawPriority, rawSynced, rawHasSynced, ...] =
208208
(e as JSArray).toDart;
209209
final syncedMillis = (rawSynced as JSNumber?)?.toDartInt;

packages/powersync_core/test/sync_types_test.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'dart:async';
22

3+
import 'package:powersync_core/src/sync_status.dart';
34
import 'package:powersync_core/src/sync_types.dart';
45
import 'package:test/test.dart';
56

@@ -214,5 +215,12 @@ void main() {
214215
});
215216
}
216217
});
218+
219+
test('bucket priority comparisons', () {
220+
expect(BucketPriority(0) < BucketPriority(3), isFalse);
221+
expect(BucketPriority(0) > BucketPriority(3), isTrue);
222+
expect(BucketPriority(0) >= BucketPriority(3), isTrue);
223+
expect(BucketPriority(0) >= BucketPriority(0), isTrue);
224+
});
217225
});
218226
}

0 commit comments

Comments
 (0)