mapResultWithInputs method

List<T> mapResultWithInputs(
  1. List<T> original,
  2. List<Map<String, Object?>> inputMaps,
  3. MutationResult result,
  4. bool returning, {
  5. bool canCreateFromInputs = true,
})
inherited

Maps mutation results back to model instances.

canCreateFromInputs indicates whether inputMaps contain complete data that can be used to create model instances when no returned data is available. This should be true for inserts/upserts (complete row data) and false for updates (partial data).

Implementation

List<T> mapResultWithInputs(
  List<T> original,
  List<Map<String, Object?>> inputMaps,
  MutationResult result,
  bool returning, {
  bool canCreateFromInputs = true,
}) {
  // If driver returned data (e.g., lastInsertID), merge it with inputs
  if (result.returnedRows != null && result.returnedRows!.isNotEmpty) {
    // Merge returned data with original models
    // Some drivers (like MySQL) only return PKs via lastInsertID, not full rows
    final returned = <T>[];
    for (int i = 0; i < result.returnedRows!.length; i++) {
      final returnedRow = result.returnedRows![i];
      final originalModel = i < original.length ? original[i] : null;
      final inputMap = i < inputMaps.length ? inputMaps[i] : null;

      final Map<String, Object?> mergedData;
      if (originalModel != null) {
        // Merge returned data (e.g., auto-generated PK) with original model data
        final originalData = definition.toMap(
          originalModel,
          registry: codecs,
        );
        mergedData = {...originalData, ...returnedRow};
      } else if (inputMap != null) {
        // For DTOs/Maps, merge returned data with the input map
        // This ensures required fields from the input are preserved
        mergedData = {...inputMap, ...returnedRow};
      } else {
        mergedData = returnedRow;
      }

      final model = definition.fromMap(mergedData, registry: codecs);
      attachRuntimeMetadata(model);

      // Sync original state for change tracking
      if (model is ModelAttributes) {
        final attrs = model as ModelAttributes;
        attrs.syncOriginal();
      }

      returned.add(model);
    }
    return returned;
  }

  // No returned rows from driver
  // If we have original models, return those
  if (original.isNotEmpty) {
    return original;
  }

  // For DTOs/Maps with no returned data, create models from input maps
  // only if the inputs contain complete data (inserts/upserts)
  // For updates, inputMaps only have partial data and can't create valid models
  if (canCreateFromInputs && inputMaps.isNotEmpty) {
    return inputMaps.map((map) {
      final model = definition.fromMap(map, registry: codecs);
      attachRuntimeMetadata(model);
      if (model is ModelAttributes) {
        (model as ModelAttributes).syncOriginal();
      }
      return model;
    }).toList();
  }

  return const [];
}