build method
Builds the final SQL string and collects arguments.
Implementation
FinalSqlStatement build() {
String sql;
List<Object?> arguments = [];
final whereClauseSql =
whereClauses.isNotEmpty ? 'WHERE ${whereClauses.join(' AND ')}' : '';
switch (operationType) {
case SqlOperationType.select:
// Ensure fromAlias is not null for select, or handle it gracefully.
// The table name itself can be used if fromAlias is not provided.
final fromClause = fromAlias != null ? '$tableName $fromAlias' : tableName;
sql =
'SELECT $selectColumns FROM $fromClause $whereClauseSql';
if (orderBy != null) sql += ' ORDER BY $orderBy';
if (limit != null) sql += ' LIMIT $limit';
if (offset != null) sql += ' OFFSET $offset';
arguments.addAll(whereArguments);
break;
case SqlOperationType.insert:
if (insertColumns == null ||
insertValuesPlaceholders == null ||
insertArguments == null) {
throw StateError('Missing components for INSERT operation.');
}
final columnsSql = insertColumns!.join(', ');
sql =
'INSERT INTO $tableName ($columnsSql) VALUES $insertValuesPlaceholders RETURNING *';
arguments.addAll(insertArguments!);
break;
case SqlOperationType.update:
if (updateSetClauses == null || updateArguments == null) {
throw StateError('Missing components for UPDATE operation.');
}
final setSql = updateSetClauses!.join(', ');
sql = 'UPDATE $tableName SET $setSql $whereClauseSql';
arguments.addAll(updateArguments!);
arguments.addAll(whereArguments);
break;
case SqlOperationType.delete:
sql = 'DELETE FROM $tableName $whereClauseSql';
arguments.addAll(whereArguments);
break;
case SqlOperationType.upsert:
if (insertColumns == null ||
insertValuesPlaceholders == null ||
insertArguments == null ||
upsertConflictTarget == null) {
throw StateError('Missing components for UPSERT operation.');
}
final columnsSql = insertColumns!.join(', ');
final conflictResolution = upsertUpdateSetClauses != null &&
upsertUpdateSetClauses!.isNotEmpty
? 'DO UPDATE SET $upsertUpdateSetClauses'
: 'DO NOTHING';
sql =
'INSERT INTO $tableName ($columnsSql) VALUES $insertValuesPlaceholders ON CONFLICT ($upsertConflictTarget) $conflictResolution';
arguments.addAll(insertArguments!);
break;
}
return FinalSqlStatement(sql, arguments);
}