public override string Render(IQuery query) { string result = string.Empty; CollectVariableVisitor visitor = new CollectVariableVisitor(); switch (query) { case SelectQuery sq: if (Settings.Parametrization != ParametrizationSettings.None) { visitor.Visit(sq); } result = Render(sq); break; case SelectQueryBase selectQueryBase: result = Render(selectQueryBase); break; case CreateViewQuery createViewQuery: if (Settings.Parametrization != ParametrizationSettings.None) { visitor.Visit(createViewQuery.SelectQuery); } result = Render(createViewQuery); break; case DeleteQuery deleteQuery: if (Settings.Parametrization != ParametrizationSettings.None) { visitor.Visit(deleteQuery); } result = Render(deleteQuery); break; case UpdateQuery updateQuery: result = Render(updateQuery); break; case TruncateQuery truncateQuery: result = Render(truncateQuery); break; case InsertIntoQuery insertIntoQuery: result = Render(insertIntoQuery); break; case BatchQuery batchQuery: result = Render(batchQuery); break; default: throw new ArgumentOutOfRangeException(nameof(query), "Unknown type of query"); } StringBuilder sbParameters = new StringBuilder(visitor.Variables.Count() * 100); #if DEBUG if (visitor.Variables.Any()) { Debug.Assert(visitor.Variables.All(x => x.Value != null), $"{nameof(visitor)}.{nameof(visitor.Variables)} must not contains variables with null value"); } #endif if (Settings.Parametrization == ParametrizationSettings.Default) { foreach (Variable variable in visitor.Variables) { sbParameters.Append("DECLARE @").Append(variable.Name).Append(" AS"); switch (variable.Type) { case VariableType.Numeric: sbParameters.Append(" NUMERIC = ").Append(variable.Value).Append(BatchStatementSeparator); break; case VariableType.String: sbParameters.Append(" VARCHAR(8000) = '").Append(EscapeString(variable.Value.ToString())).Append("'") .Append(BatchStatementSeparator); break; case VariableType.Boolean: sbParameters.Append(" BIT = ") .Append(true.Equals(variable.Value) ? "1" : "0") .Append(BatchStatementSeparator); break; case VariableType.Date: sbParameters.Append(" DATETIME = '").Append(EscapeString((variable.Value as DateTime?)?.ToString(Settings.DateFormatString))) .Append(BatchStatementSeparator); break; default: throw new ArgumentOutOfRangeException(nameof(variable), variable, $"Unexpected {variable.Type} variable type"); } if (Settings.PrettyPrint && sbParameters.Length > 0) { sbParameters.AppendLine(); } } } return(sbParameters.Append(result).ToString()); }
/// <summary> /// Builds a new <see cref="ReplaceParameterBySelectQueryVisitor"/> instance /// </summary> /// <param name="variableRewriter">Defines how a variable should be rewritten</param> public ReplaceParameterBySelectQueryVisitor(Func <Variable, SelectQuery> variableRewriter) { _variableRewriter = variableRewriter ?? throw new ArgumentNullException(nameof(variableRewriter)); _variableVisitor = new CollectVariableVisitor(); }
public CollectVariableVisitorTests(ITestOutputHelper outputHelper) { _outputHelper = outputHelper; _sut = new(); }