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