build method
({String sql, Map<String, dynamic> ? valuesNamed, List? valuesOrdered})
build({
- required SQLDialect dialect,
- 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);
}