render method

  1. @override
String render(
  1. RenderContext context
)
override

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();
}