build method

({String sql, Map<String, dynamic>? valuesNamed, List? valuesOrdered}) build({
  1. required SQLDialect dialect,
  2. List<SQL>? executedSqls,
})

Implementation

({String sql, List? valuesOrdered, Map<String, dynamic>? valuesNamed}) build(
    {required SQLDialect dialect, List<SQL>? executedSqls}) {
  executedSqls ??= [];

  final q = dialect.q;

  String sql;
  List? valuesOrdered;
  Map<String, dynamic>? valuesNamed;

  var parameters = resolveParameters(executedSqls);

  switch (type) {
    case SQLType.INSERT:
      {
        if (parameters.isEmpty) {
          throw StateError(
              "Can't build INSERT SQL with empty parameters: $this");
        }

        var columns = parameters.keys.map((p) => '$q$p$q').join(' , ');
        var values = parameters.values
            .map((e) => resolveValueAsSQL(e, dialect: dialect))
            .join(' , ');

        sql = 'INSERT INTO $q$table$q ($columns) VALUES ($values)';
      }
    case SQLType.UPDATE:
      {
        if (parameters.isEmpty) {
          throw StateError(
              "Can't build UPDATE SQL with empty parameters: $this");
        }

        final where = this.where?.build(
            dialect: dialect,
            variables: variables,
            executedSqls: executedSqls);
        if (where == null || where.isEmpty) {
          throw StateError("Can't build UPDATE SQL with empty WHERE: $this");
        }

        var set = parameters.entries
            .map((e) =>
                '$q${e.key}$q = ${resolveValueAsSQL(e.value, dialect: dialect)}')
            .join(' , ');

        sql = 'UPDATE $q$table$q SET $set WHERE $where';
      }
    case SQLType.SELECT:
      {
        final where = this.where?.build(
            dialect: dialect,
            variables: variables,
            executedSqls: executedSqls);

        var sqlColumns = '*';

        if (returnColumns.isNotEmpty) {
          sqlColumns = returnColumns.entries.map((e) {
            var column = e.key;
            var alias = e.value ?? '';
            return alias.isNotEmpty
                ? '$q$column$q as $q$alias$q'
                : '$q$column$q';
          }).join(' , ');
        }

        var sqlWhere =
            where != null && where.isNotEmpty ? ' WHERE $where' : '';

        var orderBy = this.orderBy?.trim();

        var sqlOrder = '';
        if (orderBy != null && orderBy.isNotEmpty) {
          if (orderBy.startsWith('>')) {
            orderBy = orderBy.substring(1).trim();
            sqlOrder = ' ORDER BY $q$orderBy$q DESC';
          } else if (orderBy.startsWith('<')) {
            orderBy = orderBy.substring(1).trim();
            sqlOrder = ' ORDER BY $q$orderBy$q';
          } else {
            sqlOrder = ' ORDER BY $q$orderBy$q';
          }
        }

        var limit = this.limit;

        var sqlLimit = limit != null && limit > 0 ? ' LIMIT $limit' : '';

        sql = 'SELECT $sqlColumns FROM $q$table$q$sqlWhere$sqlOrder$sqlLimit';
      }
    case SQLType.DELETE:
      {
        final where = this.where?.build(
            dialect: dialect,
            variables: variables,
            executedSqls: executedSqls);

        var sqlWhere =
            where != null && where.isNotEmpty ? ' WHERE $where' : '';

        var limit = this.limit;

        var sqlLimit = limit != null && limit > 0 ? ' LIMIT $limit' : '';

        sql = 'DELETE FROM $q$table$q$sqlWhere$sqlLimit';
      }
    default:
      throw StateError("Can't build SQL: $this");
  }

  return (sql: sql, valuesOrdered: valuesOrdered, valuesNamed: valuesNamed);
}