deserialize method

List<Map<String, dynamic>> deserialize({
  1. required List<Map<String, dynamic>> rows,
  2. required String baseModel,
  3. required Map<String, ColumnAlias> columnAliases,
  4. required List<IncludedRelation> includedRelations,
})

Deserialize flat rows into nested structure.

rows - Flat rows from JOIN query. baseModel - The base model name. columnAliases - Column alias mapping. includedRelations - List of included relations.

Returns list of nested objects.

Implementation

List<Map<String, dynamic>> deserialize({
  required List<Map<String, dynamic>> rows,
  required String baseModel,
  required Map<String, ColumnAlias> columnAliases,
  required List<IncludedRelation> includedRelations,
}) {
  if (rows.isEmpty) return [];

  // Group rows by base model primary key
  final model = _schema.getModel(baseModel);
  if (model == null) return rows;

  final pkFields = model.primaryKeys;
  if (pkFields.isEmpty) return rows;

  final pkColumn = pkFields.first.columnName;

  // Group by primary key
  final grouped = <dynamic, List<Map<String, dynamic>>>{};
  for (final row in rows) {
    final pk = row[pkColumn];
    (grouped[pk] ??= []).add(row);
  }

  // Build result for each unique base record
  return grouped.entries.map((entry) {
    final rowGroup = entry.value;
    final baseRow = _extractBaseColumns(rowGroup.first, columnAliases);

    // Add relations
    for (final relation in includedRelations) {
      baseRow[relation.name] = _extractRelation(
        rows: rowGroup,
        relation: relation,
        columnAliases: columnAliases,
      );
    }

    return baseRow;
  }).toList();
}