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 buffer = StringBuffer();
  final f = filter;
  if (f is LogicalFilter) {
    if (level > 0) buffer.write('(');
    buffer
      ..write(
        FilterClause(f.left, singleTable: singleTable, level: level + 1)
            .render(context),
      )
      ..write(f.or ? ' OR ' : ' AND ')
      ..write(
        FilterClause(f.right, singleTable: singleTable, level: level + 1)
            .render(context),
      );
    if (level > 0) buffer.write(')');
  } else if (f is SQL) {
    buffer
        .write(ExpressionClause(f, singleTable: singleTable).render(context));
  } else if (f is Not) {
    final inverted =
        FilterClause(f.invert, singleTable: singleTable).render(context);
    buffer.write('NOT ($inverted)');
  } else if (f case final Expression<dynamic> expression) {
    buffer.write(
      ExpressionClause(SQL([expression]), singleTable: singleTable)
          .render(context),
    );
  } else {
    throw UnsupportedError('${f.runtimeType}');
  }
  return buffer.toString();
}