예제 #1
0
        public override ExecuteResult Execute(ExecuteContext context)
        {
            if (Body == null)
                throw new InvalidOperationException();

            throw new NotImplementedException();
        }
예제 #2
0
        protected override void Dispose(bool disposing)
        {
            parentContext = null;
            executeContext = null;

            base.Dispose(disposing);
        }
예제 #3
0
        public override DataType ReturnType(ExecuteContext context)
        {
            if (method == null)
                method = DiscoverMethod();

            return base.ReturnType(context);
        }
예제 #4
0
        public FunctionQueryContext(IQueryContext parentContext, ExecuteContext executeContext)
        {
            if (parentContext == null)
                throw new ArgumentNullException("parentContext");
            if (executeContext == null)
                throw new ArgumentNullException("executeContext");

            this.parentContext = parentContext;
            this.executeContext = executeContext;
        }
예제 #5
0
        /// <summary>
        /// Executes the function given the cintext provided.
        /// </summary>
        /// <param name="function">The function to execute.</param>
        /// <param name="request">The invocation information that was used to resolve 
        /// the function.</param>
        /// <param name="group"></param>
        /// <param name="resolver"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public static DataObject Execute(this IFunction function,
			Invoke request,
			IGroupResolver group,
			IVariableResolver resolver,
			IQueryContext context)
        {
            var execContext = new ExecuteContext(request, function, resolver, group, context);
            var result = function.Execute(execContext);
            return result.ReturnValue;
        }
예제 #6
0
        public static ExecuteResult Execute(this IRoutine routine, SqlExpression[] args, IQueryContext context, IVariableResolver resolver, IGroupResolver group)
        {
            var request = new Invoke(routine.FullName, args);

            if (context != null &&
                !context.UserCanExecuteFunction(request))
                throw new InvalidOperationException();

            var executeContext = new ExecuteContext(request, routine, resolver, group, context);
            return routine.Execute(executeContext);
        }
예제 #7
0
        public override ExecuteResult Execute(ExecuteContext context)
        {
            if (context == null)
                throw new ArgumentNullException("context");

            var group = context.GroupResolver;

            if (group == null)
                throw new Exception(String.Format("'{0}' can only be used as an aggregate function.", FunctionName));

            DataObject result = null;
            // All aggregates functions return 'null' if group size is 0
            int size = group.Count;
            if (size == 0) {
                // Return a NULL of the return type
                return context.Result(DataObject.Null(ReturnType(context)));
            }

            DataObject val;
            ObjectName v = context.Arguments[0].AsReferenceName();
            // If the aggregate parameter is a simple variable, then use optimal
            // routine,
            if (v != null) {
                for (int i = 0; i < size; ++i) {
                    val = group.Resolve(v, i);
                    result = Evaluate(result, val, context.QueryContext, group);
                }
            } else {
                // Otherwise we must resolve the expression for each entry in group,
                // This allows for expressions such as 'sum(quantity * price)' to
                // work for a group.
                var exp = context.Arguments[0];
                for (int i = 0; i < size; ++i) {
                    val = exp.EvaluateToConstant(context.QueryContext, group.GetVariableResolver(i));
                    result = Evaluate(result, val, context.QueryContext, group);
                }
            }

            // Post method.
            result = PostEvaluate(result, context.QueryContext, group);

            return context.Result(result);
        }
예제 #8
0
        public override ExecuteResult Execute(ExecuteContext context)
        {
            if (method == null)
                method = DiscoverMethod();

            if (method == null)
                throw new InvalidOperationException();

            var args = context.EvaluatedArguments;

            try {
                var methodArgs = ConvertArguments(method, args);
                var result = method.Invoke(null, methodArgs);

                return  context.Result(ConvertValue(result, ReturnType()));
            } catch (Exception ex) {
                throw;
            }
        }
예제 #9
0
 internal ExecuteResult(ExecuteContext context, DataObject returnValue)
     : this(context, returnValue, true)
 {
 }
예제 #10
0
 /// <summary>
 /// Executes the function and provides a result.
 /// </summary>
 /// <param name="context">The context of the execution.</param>
 /// <returns>
 /// Returns a <see cref="ExecuteResult"/> instance that encapsulates
 /// the returned value of the function.
 /// </returns>
 /// <seealso cref="ExecuteResult.ReturnValue"/>
 public abstract ExecuteResult Execute(ExecuteContext context);
예제 #11
0
 public override ExecuteResult Execute(ExecuteContext context)
 {
     throw new NotImplementedException();
 }
예제 #12
0
            public static ExecuteResult Execute(ExecuteContext context)
            {
                if (context.GroupResolver == null)
                    throw new Exception("'count' can only be used as an aggregate function.");

                int size = context.GroupResolver.Count;
                DataObject result;
                // if, count(*)
                if (size == 0 || context.Invoke.IsGlobArgument) {
                    result = DataObject.Integer(size);
                } else {
                    // Otherwise we need to count the number of non-null entries in the
                    // columns list(s).

                    int totalCount = size;

                    var exp = context.Arguments[0];
                    for (int i = 0; i < size; ++i) {
                        var val = exp.EvaluateToConstant(context.QueryContext, context.GroupResolver.GetVariableResolver(i));
                        if (val.IsNull) {
                            --totalCount;
                        }
                    }

                    result = DataObject.Integer(totalCount);
                }

                return context.Result(result);
            }
예제 #13
0
 private ExecuteResult Simple(ExecuteContext context, Func<DataObject[], DataObject> func)
 {
     var evaluated = context.EvaluatedArguments;
     var value = func(evaluated);
     return context.Result(value);
 }
예제 #14
0
 private ExecuteResult Binary(ExecuteContext context, Func<DataObject, DataObject, DataObject> func)
 {
     var evaluated = context.EvaluatedArguments;
     var value = func(evaluated[0], evaluated[1]);
     return context.Result(value);
 }
예제 #15
0
 public static DataType ReturnType(this IFunction function, Invoke request, IQueryContext context, IVariableResolver resolver)
 {
     var execContext = new ExecuteContext(request, function, resolver, null, context);
     return function.ReturnType(execContext);
 }
예제 #16
0
 private ExecuteResult(ExecuteContext context, DataObject returnValue, bool hasReturn)
 {
     Context = context;
     ReturnValue = returnValue;
     HasReturnValue = hasReturn;
 }
예제 #17
0
파일: Invoke.cs 프로젝트: prepare/deveeldb
 public ExecuteResult Execute(IQueryContext context, IVariableResolver resolver, IGroupResolver group)
 {
     var routine = ResolveRoutine(context);
     var executeContext = new ExecuteContext(this, routine, resolver, group, context);
     return routine.Execute(executeContext);
 }
예제 #18
0
            public static ExecuteResult Execute(ExecuteContext context)
            {
                var value = context.EvaluatedArguments[0];
                var typeArg = context.EvaluatedArguments[1];
                var typeString = typeArg.AsVarChar().Value.ToString();
                var type = SqlType.Parse(context.QueryContext, typeString);

                return context.Result(SystemFunctions.Cast(value, type));
            }
예제 #19
0
 public static SqlType ReturnType(ExecuteContext context)
 {
     var typeArg = context.EvaluatedArguments[1];
     var typeString = typeArg.AsVarChar().Value.ToString();
     return SqlType.Parse(context.QueryContext, typeString);
 }
예제 #20
0
 public static ExecuteResult Execute(ExecuteContext context)
 {
     throw new NotImplementedException();
 }
예제 #21
0
 private static ExecuteResult Simple(ExecuteContext context, Func<DataObject[], DataObject> func)
 {
     var args = context.EvaluatedArguments;
     var funcResult = func(args);
     return context.Result(funcResult);
 }
예제 #22
0
 public override ExecuteResult Execute(ExecuteContext context)
 {
     return functionBody(context);
 }
예제 #23
0
 /// <summary>
 /// Resolves the function return type against the given context.
 /// </summary>
 /// <param name="context">The execution context used to resolve
 /// the function return type.</param>
 /// <returns>
 /// Returns an instance of <see cref="SqlType"/> that defines
 /// the type of the returned value resolved against the given
 /// execution context..
 /// </returns>
 public virtual SqlType ReturnType(ExecuteContext context)
 {
     return FunctionInfo.ReturnType;
 }
예제 #24
0
            public override SqlType ReturnType(ExecuteContext context)
            {
                if (returnType == null)
                    return FunctionInfo.ReturnType;

                return returnType(context);
            }
예제 #25
0
 internal ExecuteResult Execute(ExecuteContext context)
 {
     throw new NotImplementedException();
 }
예제 #26
0
 internal ExecuteResult(ExecuteContext context)
     : this(context, DataObject.Null(), false)
 {
 }