mapResultWithInputs method
List<T>
mapResultWithInputs(
- List<
T> original, - List<
Map< inputMaps,String, Object?> > - MutationResult result,
- bool returning, {
- 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 [];
}