render method
Renders this clause to SQL text, recording any bind values on context.
context is the entire context a clause is given: use
RenderContext.escapeName for identifiers and RenderContext.param
for values.
Return an empty string to render nothing, which is how an optional clause
(such as a WHERE with no filter) drops itself from the statement.
Implementation
@override
String render(RenderContext context) {
final select = this.select;
final chunks = <String>[];
if (select case final Schema<dynamic> schema) {
return SelectionClause(schema.$, singleTable: singleTable)
.render(context);
}
if (select case final Table<Schema<dynamic>, dynamic> table) {
for (var i = 0; i < table.columns.length; i++) {
chunks.add(
SelectionClause(table.columns[i], singleTable: singleTable)
.render(context),
);
if (i != table.columns.length - 1) chunks.add(', ');
}
} else if (select case final Column<dynamic, Object?> column) {
final explicit = switch (column) {
final ColumnAlias<dynamic, dynamic> aliased => aliased.alias,
_ => null,
};
if (singleTable) {
final name = context.escapeName(column.name);
chunks.add(
explicit == null ? name : '$name AS ${context.escapeName(explicit)}',
);
} else {
final prefix = column.table.alias ?? column.table.name;
final colName = context.escapeName(column.name);
final alias =
context.escapeName(explicit ?? '${prefix}__${column.name}');
chunks.add('${context.escapeName(prefix)}.$colName AS $alias');
}
} else if (select case final AliasedExpression<dynamic> aliased) {
final rendered = ExpressionClause(
aliased.build(),
singleTable: singleTable,
).render(context);
chunks.add('$rendered AS ${context.escapeName(aliased.alias)}');
} else if (select case final Expression<dynamic> expr) {
chunks.add(ExpressionClause(expr.build(), singleTable: singleTable)
.render(context));
} else if (select case final SelectableResult<dynamic> result) {
for (var i = 0; i < result.selected.length; i++) {
chunks.add(
SelectionClause(result.selected[i], singleTable: singleTable)
.render(context),
);
if (i != result.selected.length - 1) chunks.add(', ');
}
}
return chunks.join();
}