aggregateWithGroupBy<T extends Table, D> method

  1. @override
Future<List<Map<String, Object?>>> aggregateWithGroupBy<T extends Table, D>({
  1. required List<String> groupByColumns,
  2. required Map<String, String> aggregations,
  3. Expression<bool>? filter,
  4. String? having,
})
override

Implementation

@override
Future<List<Map<String, Object?>>> aggregateWithGroupBy<T extends Table, D>({
  required List<String> groupByColumns,
  required Map<String, String> aggregations,
  Expression<bool>? filter,
  String? having,
}) async {
  try {
    final table = _getTable<T, D>();

    final selectParts = <String>[];

    selectParts.addAll(groupByColumns);

    for (final entry in aggregations.entries) {
      selectParts.add('${entry.value} as ${entry.key}');
    }

    final selectClause = selectParts.join(', ');
    final groupByClause = groupByColumns.isNotEmpty
        ? ' GROUP BY ${groupByColumns.join(', ')}'
        : '';
    final havingClause = having != null ? ' HAVING $having' : '';
    final whereClause = filter != null ? ' WHERE $filter' : '';

    final sql =
        'SELECT $selectClause FROM ${table.actualTableName}$whereClause$groupByClause$havingClause';

    final results = await _database.customSelect(sql).get();

    final List<Map<String, Object?>> mappedResults = [];
    for (final result in results) {
      final Map<String, Object?> row = {};

      for (final key in result.data.keys) {
        row[key] = result.data[key];
      }

      mappedResults.add(row);
    }

    return mappedResults;
  } catch (e) {
    throw DatabaseBridgeException(error: e);
  }
}