Exemplo n.º 1
0
        /// <summary>
        /// Register system functions.
        /// </summary>
        public static void RegisterSystemFunctions()
        {
            ExpressionProcessor.AddFunction(typeof(String), nameof(String.Contains), (expression) =>
            {
                if (expression.Object == null || expression.Arguments.Count != 1)
                {
                    throw new ArgumentException("Invalid expression");
                }

                return(SqlBuilder.Instance.Like(SqlBuilder.Instance.Val(expression.Object),
                                                SqlBuilder.Instance.ToLikeAny((string)SqlBuilder.Instance.Val(expression.Arguments[0]))));
            });
            ExpressionProcessor.AddFunction(typeof(String), nameof(String.StartsWith), (expression) =>
            {
                if (expression.Object == null || expression.Arguments.Count != 1)
                {
                    throw new ArgumentException("Invalid expression");
                }

                return(SqlBuilder.Instance.Like(SqlBuilder.Instance.Val(expression.Object),
                                                SqlBuilder.Instance.ToLikeStart((string)SqlBuilder.Instance.Val(expression.Arguments[0]))));
            });
            ExpressionProcessor.AddFunction(typeof(String), nameof(String.EndsWith), (expression) =>
            {
                if (expression.Object == null || expression.Arguments.Count != 1)
                {
                    throw new ArgumentException("Invalid expression");
                }

                return(SqlBuilder.Instance.Like(SqlBuilder.Instance.Val(expression.Object),
                                                SqlBuilder.Instance.ToLikeEnd((string)SqlBuilder.Instance.Val(expression.Arguments[0]))));
            });
        }
Exemplo n.º 2
0
        public void Add_Remove_Function()
        {
            ExpressionProcessor.AddFunction(typeof(string), nameof(string.Trim));
            Assert.True(ExpressionProcessor.ContainsFunction(typeof(string), nameof(string.Trim)));

            ExpressionProcessor.RemoveFunction(typeof(string), nameof(string.Trim));
            Assert.False(ExpressionProcessor.ContainsFunction(typeof(string), nameof(string.Trim)));
        }
Exemplo n.º 3
0
        /// <summary>
        /// Register operators.
        /// </summary>
        public static void RegisterOperators()
        {
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Eq),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.Eq));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.NotEq),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.NotEq));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Like),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.Like));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.NotLike),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.NotLike));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Lt),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.Lt));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Le),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.Le));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Gt),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.Gt));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Ge),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.Ge));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.In),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.In));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.NotIn),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.NotIn));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Not), expression =>
            {
                if (expression.Arguments.Count != 1)
                {
                    throw new ArgumentException("Invalid expression");
                }

                return(SqlBuilder.Instance.Not(SqlBuilder.Instance.Op(expression.Arguments[0])));
            });
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.IsNull),
                                            x => ExpressionHelper.SingleOperator(x, SqlBuilder.Instance.IsNull));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.IsNotNull),
                                            x => ExpressionHelper.SingleOperator(x, SqlBuilder.Instance.IsNotNull));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.All),
                                            x => ExpressionHelper.SingleOperator(x, SqlBuilder.Instance.All));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Any),
                                            x => ExpressionHelper.SingleOperator(x, SqlBuilder.Instance.Any));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Exists),
                                            x => ExpressionHelper.SingleOperator(x, SqlBuilder.Instance.Exists));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Some),
                                            x => ExpressionHelper.SingleOperator(x, SqlBuilder.Instance.Some));

            // Extensions
            ExpressionProcessor.AddFunction(typeof(SqlExtensions), nameof(SqlExtensions.Like),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.Like));
            ExpressionProcessor.AddFunction(typeof(SqlExtensions), nameof(SqlExtensions.NotLike),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.NotLike));
            ExpressionProcessor.AddFunction(typeof(SqlExtensions), nameof(SqlExtensions.In),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.In));
            ExpressionProcessor.AddFunction(typeof(SqlExtensions), nameof(SqlExtensions.NotIn),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.NotIn));
        }
        /// <summary>
        /// Registers functions.
        /// </summary>
        public static void RegisterFunctions()
        {
            // Special methods
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Function), ExpressionHelper.FunctionWithName);
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Val), ExpressionHelper.Val);

            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Abs));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Avg));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.AvgDistinct), FunctionName.Avg,
                                            (expression, name) =>
            {
                return(ExpressionHelper.Function(expression, name).Before(SqlBuilder.Instance.Raw("DISTINCT")));
            });
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Cast));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Ceiling));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Coalesce), true);
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Concat), true);
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Count), (expression, name) =>
            {
                IFunction func = ExpressionHelper.Function(expression, name);
                if (expression.Arguments.Count == 0)
                {
                    func.Add(SqlBuilder.Instance.Col("*"));
                }
                return(func);
            });
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.CountDistinct), FunctionName.Count,
                                            (expression, name) =>
            {
                return(ExpressionHelper.Function(expression, name).Before(SqlBuilder.Instance.Raw("DISTINCT")));
            });
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Floor));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.LastInsertId));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Length));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Lower));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.LTrim));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Max));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Min));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Now));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.NullIf));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Replace));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Round));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.RTrim));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Substring));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Sum));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.SumDistinct), FunctionName.Sum,
                                            (expression, name) =>
            {
                return(ExpressionHelper.Function(expression, name).Before(SqlBuilder.Instance.Raw("DISTINCT")));
            });
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Trim));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Upper));
        }
Exemplo n.º 5
0
        public void Expression_Bool_Function()
        {
            ExpressionProcessor.AddFunction(typeof(CustomExp), nameof(CustomExp.IsNumeric));

            Person    person = null;
            IOperator op     = sql.Op(() => !CustomExp.IsNumeric(person.Id));

            QueryResult result = engine.Compile(op);

            Assert.Equal("NOT ISNUMERIC(\"person\".\"Id\") = @p0", result.Sql);
            Assert.Equal(new Dictionary <string, object>
            {
                ["@p0"] = true
            }, result.Parameters);
        }
        /// <summary>
        /// Registers operators.
        /// </summary>
        public static void RegisterOperators()
        {
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Eq),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.Eq));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.NotEq),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.NotEq));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Like),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.Like));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.NotLike),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.NotLike));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Lt),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.Lt));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Le),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.Le));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Gt),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.Gt));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Ge),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.Ge));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.In),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.In));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.NotIn),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.NotIn));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Not), ExpressionHelper.Not);
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.IsNull),
                                            x => ExpressionHelper.SingleOperator(x, SqlBuilder.Instance.IsNull));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.IsNotNull),
                                            x => ExpressionHelper.SingleOperator(x, SqlBuilder.Instance.IsNotNull));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.All),
                                            x => ExpressionHelper.SingleOperator(x, SqlBuilder.Instance.All));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Any),
                                            x => ExpressionHelper.SingleOperator(x, SqlBuilder.Instance.Any));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Exists),
                                            x => ExpressionHelper.SingleOperator(x, SqlBuilder.Instance.Exists));
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Some),
                                            x => ExpressionHelper.SingleOperator(x, SqlBuilder.Instance.Some));

            // Extensions
            ExpressionProcessor.AddFunction(typeof(SqlExtensions), nameof(SqlExtensions.Like),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.Like));
            ExpressionProcessor.AddFunction(typeof(SqlExtensions), nameof(SqlExtensions.NotLike),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.NotLike));
            ExpressionProcessor.AddFunction(typeof(SqlExtensions), nameof(SqlExtensions.In),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.In));
            ExpressionProcessor.AddFunction(typeof(SqlExtensions), nameof(SqlExtensions.NotIn),
                                            x => ExpressionHelper.Operator(x, SqlBuilder.Instance.NotIn));
        }
Exemplo n.º 7
0
        /// <summary>
        /// Initialize the class with the implemented functions.
        /// </summary>
        /// <param name="registerSystemFunctions">If true, register also system functions.</param>
        public static void Initialize(bool registerSystemFunctions = true)
        {
            // Operators
            RegisterOperators();

            // Function method
            ExpressionProcessor.AddFunction(typeof(SqlExp), nameof(SqlExp.Function), expression =>
            {
                if (expression.Arguments.Count == 0)
                {
                    throw new ArgumentException("Invalid expression");
                }

                ConstantExpression expName = expression.Arguments[0] as ConstantExpression;
                if (expName == null)
                {
                    throw new ArgumentException("Invalid expression");
                }

                IFunction func = SqlBuilder.Instance.Function(((string)expName.Value).ToUpperInvariant());

                if (expression.Arguments.Count > 1)
                {
                    NewArrayExpression expParams = expression.Arguments[1] as NewArrayExpression;
                    if (expParams != null)
                    {
                        foreach (var arg in expParams.Expressions)
                        {
                            func.Add(SqlBuilder.Instance.Val(arg));
                        }
                    }
                }

                return(func);
            });

            // Functions
            RegisterFunctions();

            // System functions
            if (registerSystemFunctions)
            {
                RegisterSystemFunctions();
            }
        }
 /// <summary>
 /// Registers system functions.
 /// </summary>
 public static void RegisterSystemFunctions()
 {
     ExpressionProcessor.AddFunction(typeof(String), nameof(String.StartsWith), ExpressionHelper.LikeStart);
     ExpressionProcessor.AddFunction(typeof(String), nameof(String.EndsWith), ExpressionHelper.LikeEnd);
     ExpressionProcessor.AddFunction(typeof(String), nameof(String.Contains), ExpressionHelper.LikeAny);
 }