select<R> method
SqlRead<R>
select<R>({
- required SqlTable<
Object?> from, - required SqlProjection<
R> projection, - List<
SqlJoin> joins = const <SqlJoin>[], - SqlPredicate? where,
- List<
SqlOrder> orderBy = const <SqlOrder>[], - int? limit,
- int? offset,
Selects a custom projection from from and optional relational joins.
Implementation
SqlRead<R> select<R>({
required SqlTable<Object?> from,
required SqlProjection<R> projection,
List<SqlJoin> joins = const <SqlJoin>[],
SqlPredicate? where,
List<SqlOrder> orderBy = const <SqlOrder>[],
int? limit,
int? offset,
}) {
_validatePagination(limit, offset);
final tables = _validateJoins(from, joins);
final aliases = _selectAliases(tables, qualified: joins.isNotEmpty);
_validateProjection(tables, projection);
final builder = _BoundSqlBuilder(dialect)..write('SELECT ');
_writeSelections(builder, projection.columns, aliases);
_writeSource(builder, from, joins, tables, aliases);
_writeWhere(builder, tables, aliases, where);
if (orderBy.isNotEmpty) {
builder.write(' ORDER BY ');
for (final (index, order) in orderBy.indexed) {
if (index != 0) builder.write(', ');
_requireColumnIn(tables, order._column);
_writeColumnReference(builder, order._column, aliases);
builder.write(order._descending ? ' DESC' : ' ASC');
}
}
if (limit != null) {
builder
..write(' LIMIT ')
..write('$limit');
if (offset != null) {
builder
..write(' OFFSET ')
..write('$offset');
}
}
return SqlRead<R>._select(
builder.build(kind: SqlStatementKind.rowReturning),
projection.decode,
limit: limit,
offset: offset,
);
}