protected override object InternalVisit(SearchedCaseExpression node) { //TODO:node.Collation Func <Environment, object> def = Visit <Func <Environment, object> >(node.ElseExpression); //the key should be a predicate. Dictionary <Func <Environment, object>, Func <Environment, object> > clauses = new Dictionary <Func <Environment, object>, Func <Environment, object> >(); foreach (var clause in node.WhenClauses) { clauses.Add( Visit <Func <Environment, object> >(clause.WhenExpression), Visit <Func <Environment, object> >(clause.ThenExpression) ); } return(new Func <Environment, object>((env) => { foreach (var c in clauses) { if ((bool)c.Key(env)) { return c.Value(env); } } return def(env); })); }
public override void Visit(SearchedCaseExpression node) { this.action(node); }
protected override ScalarExpression ReplaceExpression(ScalarExpression expression, out string name) { name = null; if (expression is CoalesceExpression coalesce) { var caseExpr = new SearchedCaseExpression(); foreach (var expr in coalesce.Expressions) { caseExpr.WhenClauses.Add(new SearchedWhenClause { WhenExpression = new BooleanIsNullExpression { Expression = expr, IsNot = true }, ThenExpression = expr }); } return(caseExpr); } if (expression is IIfCall iif) { var caseExpr = new SearchedCaseExpression { WhenClauses = { new SearchedWhenClause { WhenExpression = iif.Predicate, ThenExpression = iif.ThenExpression } }, ElseExpression = iif.ElseExpression }; return(caseExpr); } if (expression is LeftFunctionCall left) { var leftFunc = new FunctionCall { FunctionName = new Identifier { Value = "LEFT" } }; foreach (var param in left.Parameters) { leftFunc.Parameters.Add(param); } return(leftFunc); } if (expression is NullIfExpression nullif) { var caseExpr = new SearchedCaseExpression { WhenClauses = { new SearchedWhenClause { WhenExpression = new BooleanComparisonExpression { ComparisonType = BooleanComparisonType.Equals, FirstExpression = nullif.FirstExpression, SecondExpression = nullif.SecondExpression }, ThenExpression = new NullLiteral() } }, ElseExpression = nullif.FirstExpression }; return(caseExpr); } if (expression is RightFunctionCall right) { var rightFunc = new FunctionCall { FunctionName = new Identifier { Value = "RIGHT" } }; foreach (var param in right.Parameters) { rightFunc.Parameters.Add(param); } return(rightFunc); } if (expression is UnaryExpression unary && unary.Expression is IntegerLiteral integer && unary.UnaryExpressionType != UnaryExpressionType.BitwiseNot) { if (unary.UnaryExpressionType == UnaryExpressionType.Negative) { var value = Int32.Parse(integer.Value, CultureInfo.InvariantCulture); integer.Value = (-value).ToString(); return(integer); } } return(expression); }
public override void ExplicitVisit(SearchedCaseExpression fragment) { _fragments.Add(fragment); }
protected override object InternalVisit(SearchedCaseExpression node) { //TODO: node.Cursor return(new SQLExpressionInterpreter(Database).Visit <object>(node)); }
protected override ScalarExpression ReplaceExpression(ScalarExpression expression, out string name) { name = null; if (expression is CoalesceExpression coalesce) { var caseExpr = new SearchedCaseExpression(); foreach (var expr in coalesce.Expressions) { caseExpr.WhenClauses.Add(new SearchedWhenClause { WhenExpression = new BooleanIsNullExpression { Expression = expr, IsNot = true }, ThenExpression = expr }); } return(caseExpr); } if (expression is IIfCall iif) { var caseExpr = new SearchedCaseExpression { WhenClauses = { new SearchedWhenClause { WhenExpression = iif.Predicate, ThenExpression = iif.ThenExpression } }, ElseExpression = iif.ElseExpression }; return(caseExpr); } if (expression is LeftFunctionCall left) { var leftFunc = new FunctionCall { FunctionName = new Identifier { Value = "LEFT" } }; foreach (var param in left.Parameters) { leftFunc.Parameters.Add(param); } return(leftFunc); } if (expression is NullIfExpression nullif) { var caseExpr = new SearchedCaseExpression { WhenClauses = { new SearchedWhenClause { WhenExpression = new BooleanComparisonExpression { ComparisonType = BooleanComparisonType.Equals, FirstExpression = nullif.FirstExpression, SecondExpression = nullif.SecondExpression }, ThenExpression = new NullLiteral() } }, ElseExpression = nullif.FirstExpression }; return(caseExpr); } if (expression is RightFunctionCall right) { var rightFunc = new FunctionCall { FunctionName = new Identifier { Value = "RIGHT" } }; foreach (var param in right.Parameters) { rightFunc.Parameters.Add(param); } return(rightFunc); } return(expression); }
private List <TableParsingResult> ExtractTableNamesFromSearchedCaseExpression(SearchedCaseExpression searchedCaseExpression) { List <TableParsingResult> result = new List <TableParsingResult>(); foreach (SearchedWhenClause whenClause in searchedCaseExpression.WhenClauses) { if (whenClause.ThenExpression is BinaryExpression binaryExpression) { var items1 = ExtractTablesFromBinaryExpression(binaryExpression); result.AddIfNotExists(items1); } else { Debug.WriteLine($"SearchedWhenClause {whenClause.GetType().FullName} not analyzed"); } } return(result); }
public gsScalarExpressionParserSearchedCase(ScalarExpression expression, string columnAlias) : base(expression, columnAlias) { _ScalarExpression = expression as SearchedCaseExpression; }