Exemplo n.º 1
0
        private void RegisterAggregate(string name,
                                       SqlParameterInfo param1, SqlParameterInfo param2,
                                       SqlType returnType,
                                       Action <IterateContext> iterate,
                                       Func <InitializeContext, Task> initialize = null,
                                       Func <MergeContext, Task> merge           = null)
        {
            var methodInfo = new SqlFunctionInfo(new ObjectName(name), returnType);

            if (param1 != null)
            {
                methodInfo.Parameters.Add(param1);
            }
            if (param2 != null)
            {
                methodInfo.Parameters.Add(param2);
            }

            var aggregate = new SqlAggregateFunctionDelegate(methodInfo, iterate);

            aggregate.Initialize(initialize);
            aggregate.Merge(merge);

            Register(aggregate);
        }
Exemplo n.º 2
0
        public async Task ExecuteWithReference()
        {
            var info = new SqlFunctionInfo(new ObjectName("count"), PrimitiveTypes.BigInt());

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

            var function = new SqlAggregateFunctionDelegate(info, accumulate => {
                SqlObject r;
                if (accumulate.IsFirst)
                {
                    r = accumulate.Current;
                }
                else
                {
                    var x = accumulate.Accumulation;
                    var y = accumulate.Current;

                    r = x.Add(y);
                }

                accumulate.SetResult(r);
            });

            var result = await function.ExecuteAsync(context, SqlExpression.Reference(ObjectName.Parse("a")));

            Assert.NotNull(result);
            Assert.NotNull(result.ReturnedValue);
            Assert.True(result.HasReturnedValue);

            Assert.IsType <SqlConstantExpression>(result.ReturnedValue);

            var value = ((SqlConstantExpression)result.ReturnedValue).Value;

            Assert.Equal(SqlObject.Integer(56), value);
        }