aggregateWithGroupBy<T extends Table, D> method
Future<List<Map<String, Object?> > >
aggregateWithGroupBy<T extends Table, D>({
- required List<
String> groupByColumns, - required Map<
String, String> aggregations, - Expression<
bool> ? filter, - 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);
}
}