public override SqlExpression VisitCompoundExpression(PlSqlParser.CompoundExpressionContext context)
        {
            var left = Visit(context.exp);

            bool isNot = context.NOT() != null;

            if (context.LIKE() != null)
            {
                var right = Visit(context.likeExp);
                var op    = isNot ? SqlExpressionType.NotLike : SqlExpressionType.Like;
                return(SqlExpression.Binary(left, op, right));
            }
            if (context.BETWEEN() != null)
            {
                var min        = Visit(context.min);
                var max        = Visit(context.max);
                var lowerBound = SqlExpression.GreaterOrEqualThan(left, min);
                var upperBound = SqlExpression.SmallerOrEqualThan(left, max);
                return(SqlExpression.And(lowerBound, upperBound));
            }

            if (context.IN() != null)
            {
                var arg = Visit(context.inElements());

                SqlExpression     right;
                SqlExpressionType op;

                if (isNot)
                {
                    right = SqlExpression.All(arg);
                    op    = SqlExpressionType.NotEqual;
                }
                else
                {
                    right = SqlExpression.Any(arg);
                    op    = SqlExpressionType.Equal;
                }

                return(SqlExpression.Binary(left, op, right));
            }

            return(left);
        }
Exemple #2
0
        public override SqlExpression VisitCompoundExpression(PlSqlParser.CompoundExpressionContext context)
        {
            var left = Visit(context.exp);

            bool isNot = context.NOT() != null;

            if (context.LIKE() != null)
            {
                var right = Visit(context.likeExp);
                var op    = isNot ? SqlExpressionType.NotLike : SqlExpressionType.Like;
                // TODO: ESCAPE
                return(SqlExpression.StringMatch(op, left, right, null));
            }

            if (context.BETWEEN() != null)
            {
                var min        = Visit(context.min);
                var max        = Visit(context.max);
                var lowerBound = SqlExpression.GreaterThanOrEqual(left, min);
                var upperBound = SqlExpression.LessThanOrEqual(left, max);
                return(SqlExpression.And(lowerBound, upperBound));
            }

            if (context.IN() != null)
            {
                var arg = Visit(context.inElements());

                if (isNot)
                {
                    return(SqlExpression.All(SqlExpression.Binary(SqlExpressionType.NotEqual, left, arg)));
                }

                return(SqlExpression.Any(SqlExpression.Binary(SqlExpressionType.Equal, left, arg)));
            }

            return(left);
        }