select<R> method

SqlRead<R> select<R>({
  1. required SqlTable<Object?> from,
  2. required SqlProjection<R> projection,
  3. List<SqlJoin> joins = const <SqlJoin>[],
  4. SqlPredicate? where,
  5. List<SqlOrder> orderBy = const <SqlOrder>[],
  6. int? limit,
  7. 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,
  );
}