applyOptimisticChanges method

void applyOptimisticChanges(
  1. String requestId,
  2. List<OptimisticChange>? changes
)

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);
  }
}