applyOptimisticChanges method
Implementation
void applyOptimisticChanges(
String requestId,
List<OptimisticChange>? changes,
) {
if (changes == null) return;
final entries = <OptimisticEntry>[];
final specsByTable = <String, List<TableEventSpec>>{};
final context = EventContext.optimistic(requestId: requestId);
for (final change in changes) {
final table = _cache.getTableByName(change.tableName);
if (table == null) {
SdkLogger.w(
'Table "${change.tableName}" not found and no decoder registered',
);
continue;
}
if (!table.decoder.supportsJsonSerialization) continue;
switch (change.type) {
case OptimisticChangeType.insert:
final row = table.decoder.fromJson(change.newRowJson!);
if (row != null) {
final pk = table.decoder.getPrimaryKey(row);
entries.add(
OptimisticEntry(
tableName: change.tableName,
type: OptimisticChangeType.insert,
primaryKey: pk,
newRowJson: change.newRowJson,
),
);
table.insertRow(row);
(specsByTable[change.tableName] ??= []).add(
TableEventSpec.insert(row),
);
}
case OptimisticChangeType.update:
final oldRow = table.decoder.fromJson(change.oldRowJson!);
final newRow = table.decoder.fromJson(change.newRowJson!);
if (oldRow != null && newRow != null) {
final pk = table.decoder.getPrimaryKey(newRow);
entries.add(
OptimisticEntry(
tableName: change.tableName,
type: OptimisticChangeType.update,
primaryKey: pk,
oldRowJson: change.oldRowJson,
newRowJson: change.newRowJson,
),
);
table.updateRow(newRow);
(specsByTable[change.tableName] ??= []).add(
TableEventSpec.update(oldRow, newRow),
);
}
case OptimisticChangeType.delete:
final row = table.decoder.fromJson(change.oldRowJson!);
if (row != null) {
final pk = table.decoder.getPrimaryKey(row);
entries.add(
OptimisticEntry(
tableName: change.tableName,
type: OptimisticChangeType.delete,
primaryKey: pk,
oldRowJson: change.oldRowJson,
),
);
table.deleteRow(pk);
(specsByTable[change.tableName] ??= []).add(
TableEventSpec.delete(row),
);
}
}
}
for (final entry in specsByTable.entries) {
final table = _cache.getTableByName(entry.key);
if (table != null) {
table.emitBatch(entry.value, context);
}
}
if (entries.isNotEmpty) {
_entries.putIfAbsent(requestId, () => []).addAll(entries);
}
}