예제 #1
0
        public async Task ExecuteWithNamedArgsAndDefaultValue()
        {
            var name = ObjectName.Parse("a.func");
            var info = new SqlFunctionInfo(name, PrimitiveTypes.Integer());

            info.Parameters.Add(new SqlParameterInfo("a", PrimitiveTypes.Integer()));
            info.Parameters.Add(new SqlParameterInfo("b",
                                                     PrimitiveTypes.String(),
                                                     SqlExpression.Constant(SqlObject.String(new SqlString("test")))));

            var function = new SqlFunctionDelegate(info, ctx => {
                var a = ctx.Value("a");
                var b = ctx.Value("b");
                Assert.NotNull(b);
                return(Task.FromResult(a.Multiply(SqlObject.BigInt(2))));
            });

            Assert.Equal(name, info.MethodName);
            Assert.Equal(FunctionType.Scalar, function.FunctionType);
            Assert.NotNull(info.ReturnType);
            Assert.Equal(SqlTypeCode.Integer, info.ReturnType.TypeCode);

            var result = await function.ExecuteAsync(context, new InvokeArgument("a", SqlObject.Integer(22)));

            Assert.NotNull(result);
            Assert.True(result.HasReturnedValue);
            Assert.NotNull(result.ReturnedValue);
            Assert.IsType <SqlConstantExpression>(result.ReturnedValue);
        }
예제 #2
0
        private void Register(string name, SqlParameterInfo[] parameters, SqlType returnType, Func <MethodContext, Task> body)
        {
            var functionInfo = new SqlFunctionInfo(ObjectName.Parse(name), returnType);

            foreach (var parameter in parameters)
            {
                functionInfo.Parameters.Add(parameter);
            }

            var function = new SqlFunctionDelegate(functionInfo, body);

            Register(function);
        }
예제 #3
0
        public static void MatchInvoke()
        {
            var name = ObjectName.Parse("a.func");
            var info = new SqlFunctionInfo(name, PrimitiveTypes.Integer());

            info.Parameters.Add(new SqlParameterInfo("a", PrimitiveTypes.Integer()));

            var function = new SqlFunctionDelegate(info, context => Task.CompletedTask);

            var invoke = new Invoke(name, new [] { new InvokeArgument(SqlObject.BigInt(11)) });

            Assert.True(function.Matches(null, invoke));
        }
예제 #4
0
        public static void GetString()
        {
            var name = ObjectName.Parse("a.func");
            var info = new SqlFunctionInfo(name, PrimitiveTypes.Integer());

            info.Parameters.Add(new SqlParameterInfo("a", PrimitiveTypes.Integer()));
            var function = new SqlFunctionDelegate(info, ctx => {
                var a = ctx.Value("a");
                return(Task.FromResult(a.Multiply(SqlObject.BigInt(2))));
            });

            var sql = $"FUNCTION a.func(a INTEGER) RETURNS INTEGER";

            Assert.Equal(sql, function.ToString());
        }
예제 #5
0
        public void ResolveDeterministricReturnType()
        {
            var name = ObjectName.Parse("a.func");
            var info = new SqlFunctionInfo(name, new SqlDeterministicType());

            info.Parameters.Add(new SqlParameterInfo("a", PrimitiveTypes.Integer()));
            info.Parameters.Add(new SqlParameterInfo("b",
                                                     PrimitiveTypes.String(),
                                                     SqlExpression.Constant(SqlObject.String(new SqlString("test")))));

            var function = new SqlFunctionDelegate(info, ctx => {
                var a = ctx.Value("a");
                var b = ctx.Value("b");
                Assert.NotNull(b);
                return(Task.FromResult(a.Multiply(SqlObject.BigInt(2))));
            });

            var returnType = function.ReturnType(context,
                                                 new Invoke(name, new[] { new InvokeArgument(SqlObject.Integer(33)), new InvokeArgument(SqlObject.Integer(2)) }));

            Assert.Equal(PrimitiveTypes.Integer(), returnType);
        }
예제 #6
0
        public void RegisterAndResolveFunction()
        {
            var name = ObjectName.Parse("a.func");
            var info = new SqlFunctionInfo(name, PrimitiveTypes.Integer());

            info.Parameters.Add(new SqlParameterInfo("a", PrimitiveTypes.Integer()));
            var function = new SqlFunctionDelegate(info, ctx => {
                var a = ctx.Value("a");
                return(Task.FromResult(a.Multiply(SqlObject.BigInt(2))));
            });

            registry.Register(function);

            var invoke = new Invoke(name);

            invoke.Arguments.Add(new InvokeArgument("a", SqlObject.Integer(11)));

            var method = (registry as IMethodResolver).ResolveMethod(context, invoke);

            Assert.NotNull(method);
            Assert.True(method.IsFunction);
            Assert.Equal(name, method.MethodInfo.MethodName);
        }