コード例 #1
0
        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);
            }));
        }
コード例 #2
0
ファイル: AllNodesVisitor.cs プロジェクト: yaakoviyun/sqlskim
 public override void Visit(SearchedCaseExpression node) { this.action(node); }
コード例 #3
0
        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);
        }
コード例 #4
0
 public override void ExplicitVisit(SearchedCaseExpression fragment)
 {
     _fragments.Add(fragment);
 }
コード例 #5
0
ファイル: SQLBaseInterpreter.cs プロジェクト: IM-SQL/IMSQL
 protected override object InternalVisit(SearchedCaseExpression node)
 {
     //TODO: node.Cursor
     return(new SQLExpressionInterpreter(Database).Visit <object>(node));
 }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
        }
コード例 #8
0
 public gsScalarExpressionParserSearchedCase(ScalarExpression expression, string columnAlias)
     : base(expression, columnAlias)
 {
     _ScalarExpression = expression as SearchedCaseExpression;
 }