예제 #1
0
 public GraphQLVisitor(ISchemaProvider schemaProvider, IMethodProvider methodProvider, QueryVariables variables, ClaimsIdentity claims)
 {
     this.claims         = claims;
     this.schemaProvider = schemaProvider;
     this.methodProvider = methodProvider;
     this.variables      = variables;
 }
 public QueryPropertyWalkerVisitorBase(
     IServiceProvider serviceProvider,
     IMethodProvider methodProvider)
     : base(serviceProvider)
 {
     MethodProvider = methodProvider;
 }
예제 #3
0
 public DefaultExpressionVisitor(
     IPropertyValueProvider <T> propertyValueProvider = null,
     IMethodProvider <T> methodProvider = null)
 {
     this.propertyValueProvider = propertyValueProvider ?? new ReflectionPropertyValueProvider <T>();
     this.methodProvider        = methodProvider ?? new ReflectionMethodProvider <T>();
 }
예제 #4
0
        public CategoryValidator(ICategoryValidationService categoryValidationService,
                                 IMethodProvider methodProvider)
        {
            CascadeMode = CascadeMode.Stop;

            var methodType = methodProvider.GetMethodUpperName();

            RuleFor(r => r.Id)
            .NotNull()
            .NotEmpty()
            .MustAsync(categoryValidationService.CategoryExistsAsync)
            .WithMessage("Category with this id doesn't exists.")
            .When(dto => methodType == "PUT");

            RuleFor(r => r.Id)
            .MustAsync(categoryValidationService.CategoryIdNotExistsAsync)
            .WithMessage("Category with this id already exists.")
            .When(dto => methodType == "POST");

            RuleFor(r => r.Name)
            .NotNull()
            .NotEmpty()
            .MaximumLength(50);

            RuleFor(r => r.Name)
            .MustAsync(categoryValidationService.CategoryNameNotExistsAsync)
            .WithMessage("Category with this name already exists.")
            .When(dto => methodType == "POST");

            RuleFor(r => r.Name)
            .MustAsync(async(category, name, cancellation) =>
                       await categoryValidationService.CategoryNameChangedAndNotExistsAsync(category.Id, name, cancellation))
            .WithMessage("Category with this name already exists.")
            .When(dto => methodType == "PUT");
        }
 public QueryGrammerNodeVisitor(Expression expression, ISchemaProvider schemaProvider, IMethodProvider methodProvider, QueryVariables variables)
 {
     currentContext      = (ExpressionResult)expression;
     this.schemaProvider = schemaProvider;
     this.methodProvider = methodProvider;
     this.variables      = variables;
 }
예제 #6
0
        public override void Enumerate(IMemberCompletionAcceptor acceptor)
        {
            if (acceptor == null)
            {
                throw ExceptionBuilder.ArgumentNull("acceptor");
            }

            // Report all columns accessible by the table ref.

            TableRefBinding tableRefBinding = new TableRefBinding(null, _tableBinding, _correlationName);

            foreach (ColumnBinding columnBinding in _tableBinding.Columns)
            {
                ColumnRefBinding columnRefBinding = new ColumnRefBinding(tableRefBinding, columnBinding);
                acceptor.AcceptColumnRef(columnRefBinding);
            }

            // Now contribute any methods accessible by the row type.

            IMethodProvider methodProvider = _scope.DataContext.MetadataContext.MethodProviders[_tableBinding.RowType];

            if (methodProvider != null)
            {
                MethodBinding[] methods = methodProvider.GetMethods(_tableBinding.RowType);
                foreach (MethodBinding methodBinding in  methods)
                {
                    acceptor.AcceptMethod(methodBinding);
                }
            }
        }
예제 #7
0
 /// <summary>
 /// ctor
 /// </summary>
 /// <param name="propertyProvider"></param>
 /// <param name="propertyValidator"></param>
 /// <param name="methodProvider"></param>
 /// <param name="methodValidator"></param>
 public ObjectValidator(IPropertyProvider propertyProvider, IPropertyValidator propertyValidator, IMethodProvider methodProvider, IMethodValidator methodValidator)
 {
     this.propertyProvider  = propertyProvider;
     this.propertyValidator = propertyValidator;
     this.methodProvider    = methodProvider;
     this.methodValidator   = methodValidator;
 }
예제 #8
0
        public override void Enumerate(IMemberCompletionAcceptor acceptor)
        {
            if (acceptor == null)
            {
                throw ExceptionBuilder.ArgumentNull("acceptor");
            }

            NamedConstantExpression namedConstantExpression = _expressionBeforeDot as NamedConstantExpression;
            ParameterExpression     parameterExpression     = _expressionBeforeDot as ParameterExpression;

            IList <PropertyBinding> properties = null;

            if (namedConstantExpression == null && parameterExpression == null)
            {
                // The properties must be provided by a regular property provider.

                IPropertyProvider propertyProvider = _scope.DataContext.MetadataContext.PropertyProviders[_expressionBeforeDot.ExpressionType];

                if (propertyProvider != null)
                {
                    properties = propertyProvider.GetProperties(_expressionBeforeDot.ExpressionType);
                }
            }
            else
            {
                // The expression before the dot is named constant or a parameter. In both cases, the properties
                // could be contributed as custom properties.

                if (namedConstantExpression != null)
                {
                    properties = namedConstantExpression.Constant.CustomProperties;
                }
                else
                {
                    properties = parameterExpression.Parameter.CustomProperties;
                }
            }

            if (properties != null)
            {
                foreach (PropertyBinding propertyBinding in properties)
                {
                    acceptor.AcceptProperty(propertyBinding);
                }
            }

            // Now contribute any methods

            IMethodProvider methodProvider = _scope.DataContext.MetadataContext.MethodProviders[_expressionBeforeDot.ExpressionType];

            if (methodProvider != null)
            {
                MethodBinding[] methods = methodProvider.GetMethods(_expressionBeforeDot.ExpressionType);
                foreach (MethodBinding methodBinding in  methods)
                {
                    acceptor.AcceptMethod(methodBinding);
                }
            }
        }
예제 #9
0
 public QueryPropertyWalkerVisitor(
     IServiceProvider serviceProvider,
     IPropertyProvider propertyProvider,
     IMethodProvider methodProvider)
     : base(serviceProvider, methodProvider)
 {
     _propertyProvider = propertyProvider;
 }
 public EntityQueryNodeVisitor(Expression expression, ISchemaProvider schemaProvider, IMethodProvider methodProvider, QueryVariables variables, ClaimsIdentity claims)
 {
     this.claims          = claims;
     currentContext       = (ExpressionResult)expression;
     this.schemaProvider  = schemaProvider;
     this.methodProvider  = methodProvider;
     this.constantVisitor = new ConstantVisitor(schemaProvider);
 }
 public QueryFilterPropertyWalkerVisitor(
     IServiceProvider serviceProvider,
     IMethodProvider methodProvider,
     IListProvider listProvider)
     : base(serviceProvider)
 {
     _methodProvider = methodProvider;
     _listProvider   = listProvider;
 }
예제 #12
0
 public RouteFilterBuilder(
     IActionContextAccessor actionContextAccessor,
     IPropertyProvider propertyProvider,
     IMethodProvider methodProvider)
 {
     _actionContextAccessor = actionContextAccessor;
     _propertyProvider      = propertyProvider;
     _methodProvider        = methodProvider;
 }
예제 #13
0
 public RouteValidator(
     IActionContextAccessor actionContextAccessor,
     IPropertyProvider propertyProvider,
     IMethodProvider methodProvider)
 {
     _actionContextAccessor = actionContextAccessor;
     _propertyProvider      = propertyProvider;
     _methodProvider        = methodProvider;
 }
예제 #14
0
        /// <summary>
        /// Initializes a new instance of the <see cref="MethodApiClientDecorator{TRequest, TResponse}"/> class.
        /// </summary>
        /// <param name="apiClient">The instance to decorate</param>
        /// <param name="methodProvider"></param>
        public MethodApiClientDecorator(
            IApiClient <TRequest, TResponse> apiClient,
            IMethodProvider <TRequest> methodProvider) : base(apiClient)
        {
            Argument.NotNull(apiClient, nameof(apiClient));
            Argument.NotNull(methodProvider, nameof(methodProvider));

            _apiClient = apiClient;

            _methodProvider = methodProvider;
        }
예제 #15
0
        public JitCompilerHost(string assemblyPath, IMethodProvider methodProvider)
        {
            _assemblyPath   = assemblyPath;
            _methodProvider = methodProvider;
            AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

            // ensure methods are jitted before compilation starts to not interfere with actual jitting events
            RuntimeHelpers.PrepareMethod(GetType().GetMethod(nameof(PreJITMethods), BindingFlags.Instance | BindingFlags.Public).MethodHandle);
            InliningAnalyzerSource.Log.AsyncMethodStart(null);
            InliningAnalyzerSource.Log.AsyncMethodStop(null);
        }
예제 #16
0
        /// <summary>
        /// Returns all methods matching the identifier.
        /// </summary>
        /// <param name="type">The type to search the methods in.</param>
        /// <param name="identifier">The identifier to match the methods.</param>
        public MethodBinding[] FindMethod(Type type, Identifier identifier)
        {
            if (type == null)
            {
                throw ExceptionBuilder.ArgumentNull("type");
            }

            if (identifier == null)
            {
                throw ExceptionBuilder.ArgumentNull("identifier");
            }

            // Get method provider responsible for the given type.

            IMethodProvider methodProvider = _methodProviders[type];

            if (methodProvider == null)
            {
                return(new MethodBinding[0]);
            }

            // Get properties from the provider.

            MethodBinding[] methods;

            try
            {
                methods = methodProvider.GetMethods(type);
            }
            catch (NQueryException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw ExceptionBuilder.IMethodProviderGetMethodsFailed(ex);
            }

            // Return all methods that match the given name.

            List <MethodBinding> result = new List <MethodBinding>();

            foreach (MethodBinding methodBinding in methods)
            {
                if (identifier.Matches(methodBinding.Name))
                {
                    result.Add(methodBinding);
                }
            }

            return(result.ToArray());
        }
예제 #17
0
        // Method Providers

        public DataContext AddMethodProvider(Type type, IMethodProvider provider)
        {
            if (type == null)
            {
                throw new ArgumentNullException(nameof(type));
            }

            if (provider == null)
            {
                throw new ArgumentNullException(nameof(provider));
            }

            var newProviders = MethodProviders.Add(type, provider);

            return(WithMethodProviders(newProviders));
        }
예제 #18
0
        /// <summary>
        /// Execute a query using this schema.
        /// </summary>
        /// <param name="gql">The query</param>
        /// <param name="context">The context object. An instance of the context the schema was build from</param>
        /// <param name="serviceProvider">A service provider used for looking up dependencies of field selections and mutations</param>
        /// <param name="claims">Optional claims to check access for queries</param>
        /// <param name="methodProvider"></param>
        /// <param name="includeDebugInfo"></param>
        /// <typeparam name="TContextType"></typeparam>
        /// <returns></returns>
        public QueryResult ExecuteQuery(QueryRequest gql, TContextType context, IServiceProvider serviceProvider, ClaimsIdentity claims, IMethodProvider methodProvider = null)
        {
            if (methodProvider == null)
            {
                methodProvider = new DefaultMethodProvider();
            }

            QueryResult result;

            try
            {
                var graphQLCompiler = new GraphQLCompiler(this, methodProvider);
                var queryResult     = graphQLCompiler.Compile(gql, claims);
                result = queryResult.ExecuteQuery(context, serviceProvider, gql.OperationName);
            }
            catch (Exception ex)
            {
                // error with the whole query
                result = new QueryResult {
                    Errors = { new GraphQLError(ex.InnerException != null ? ex.InnerException.Message : ex.Message) }
                };
            }

            return(result);
        }
예제 #19
0
 public GraphQLCompiler(ISchemaProvider schemaProvider, IMethodProvider methodProvider)
 {
     _schemaProvider = schemaProvider;
     _methodProvider = methodProvider;
 }
예제 #20
0
 public GraphQLVisitor(ISchemaProvider schemaProvider, IMethodProvider methodProvider, QueryVariables variables)
 {
     this.schemaProvider = schemaProvider;
     this.methodProvider = methodProvider;
     this.variables      = variables;
 }
예제 #21
0
 public QueryDetailPropertyWalkerVisitorBase(
     IServiceProvider serviceProvider,
     IMethodProvider methodProvider)
     : base(serviceProvider, methodProvider)
 {
 }
예제 #22
0
        /// <summary>
        /// Execute a query using this schema.
        /// </summary>
        /// <param name="gql">The query</param>
        /// <param name="context">The context object. An instance of the context the schema was build from</param>
        /// <param name="serviceProvider">A service provider used for looking up dependencies of field selections and mutations</param>
        /// <param name="claims">Optional claims to check access for queries</param>
        /// <param name="methodProvider"></param>
        /// <param name="includeDebugInfo"></param>
        /// <typeparam name="TContextType"></typeparam>
        /// <returns></returns>
        public async Task <QueryResult> ExecuteQueryAsync(QueryRequest gql, TContextType context, IServiceProvider serviceProvider, ClaimsIdentity claims, IMethodProvider methodProvider = null)
        {
            //== JT
            this.User = Security.Worker.CreateUser(claims);
            // Clear any previous errors before executing new query
            GraphQLValidation.Errors = new List <GraphQLError>();
            //==

            if (methodProvider == null)
            {
                methodProvider = new DefaultMethodProvider();
            }

            QueryResult result;

            try
            {
                var graphQLCompiler = new GraphQLCompiler(this, methodProvider);
                var queryResult     = graphQLCompiler.Compile(gql, claims);
                result = await queryResult.ExecuteQueryAsync(context, serviceProvider, gql.OperationName);
            }
            catch (Exception ex)
            {
                // error with the whole query
                result = new QueryResult {
                    Errors = { new GraphQLError(ex.InnerException != null ? ex.InnerException.Message : ex.Message) }
                };
            }

            return(result);
        }
예제 #23
0
 public QueryResult ExecuteQuery(QueryRequest gql, TContextType context, IServiceProvider serviceProvider, ClaimsIdentity claims, IMethodProvider methodProvider = null)
 {
     return(ExecuteQueryAsync(gql, context, serviceProvider, claims, methodProvider).Result);
 }
예제 #24
0
        private static ExpressionResult CompileQuery(string query, Expression context, ISchemaProvider schemaProvider, ClaimsIdentity claims, IMethodProvider methodProvider, QueryVariables variables)
        {
            AntlrInputStream stream = new AntlrInputStream(query);
            var lexer  = new EntityGraphQLLexer(stream);
            var tokens = new CommonTokenStream(lexer);
            var parser = new EntityGraphQLParser(tokens)
            {
                BuildParseTree = true
            };
            var tree = parser.startRule();

            var visitor    = new QueryGrammerNodeVisitor(context, schemaProvider, methodProvider, variables, claims);
            var expression = visitor.Visit(tree);

            return(expression);
        }
        /// Function that returns the DataContext for the queries. If null _serviceProvider is used
        public static IDictionary <string, object> QueryObject <TType>(this TType context, string dataQuery, ISchemaProvider schemaProvider, IRelationHandler relationHandler = null, IMethodProvider methodProvider = null, bool includeDebugInfo = false)
        {
            if (methodProvider == null)
            {
                methodProvider = new DefaultMethodProvider();
            }
            Stopwatch timer = null;

            if (includeDebugInfo)
            {
                timer = new Stopwatch();
                timer.Start();
            }

            var allData = new ConcurrentDictionary <string, object>();

            try
            {
                var objectGraph = new DataApiCompiler(schemaProvider, methodProvider, relationHandler).Compile(dataQuery);
                // Parallel.ForEach(objectGraph.Fields, node =>
                foreach (var node in objectGraph.Fields)
                {
                    try
                    {
                        if (!string.IsNullOrEmpty(node.Error))
                        {
                            System.Console.WriteLine(node.Error);
                            allData[node.Name] = node.Error;
                        }
                        else
                        {
                            var data = node.AsLambda().Compile().DynamicInvoke(context);
                            allData[node.Name] = data;
                        }
                    }
                    catch (Exception ex)
                    {
                        allData[node.Name] = new { eql_error = ex.Message };
                    }
                }
                // );
            }
            catch (Exception ex)
            {
                allData["error"] = ex.Message;
            }
            if (includeDebugInfo && timer != null)
            {
                timer.Stop();
                allData["_debug"] = new { TotalMilliseconds = timer.ElapsedMilliseconds };
            }

            return(allData);
        }
예제 #26
0
        public static CompiledQueryResult CompileWith(string query, Expression context, ISchemaProvider schemaProvider, ClaimsIdentity claims, IMethodProvider methodProvider = null, QueryVariables variables = null)
        {
            if (methodProvider == null)
            {
                methodProvider = new DefaultMethodProvider();
            }
            if (variables == null)
            {
                variables = new QueryVariables();
            }
            var expression = CompileQuery(query, context, schemaProvider, claims, methodProvider, variables);

            var parameters = expression.Expression.NodeType == ExpressionType.Lambda ? ((LambdaExpression)expression.Expression).Parameters.ToList() : new List <ParameterExpression>();

            return(new CompiledQueryResult(expression, parameters));
        }
예제 #27
0
        /// <summary>
        /// Compile a query.
        /// </summary>
        /// <param name="query">The query text</param>
        /// <param name="schemaProvider"></param>
        /// <param name="methodProvider"></param>
        /// <returns></returns>
        public static CompiledQueryResult Compile(string query, ISchemaProvider schemaProvider, ClaimsIdentity claims, IMethodProvider methodProvider, QueryVariables variables)
        {
            ParameterExpression contextParam = null;

            if (schemaProvider != null)
            {
                contextParam = Expression.Parameter(schemaProvider.ContextType);
            }
            var expression = CompileQuery(query, contextParam, schemaProvider, claims, methodProvider, variables);

            var contextParams = new List <ParameterExpression>();

            if (contextParam != null)
            {
                contextParams.Add(contextParam);
            }
            return(new CompiledQueryResult(expression, contextParams));
        }
 public DataApiVisitor(ISchemaProvider schemaProvider, IMethodProvider methodProvider, IRelationHandler relationHandler)
 {
     _schemaProvider  = schemaProvider;
     _methodProvider  = methodProvider;
     _relationHandler = relationHandler;
 }
예제 #29
0
        public static QueryResult CompileWith(string query, Expression context, ISchemaProvider schemaProvider, IMethodProvider methodProvider, QueryVariables variables)
        {
            var expression = CompileQuery(query, context, schemaProvider, methodProvider, variables);

            var parameters = expression.Expression.NodeType == ExpressionType.Lambda ? ((LambdaExpression)expression.Expression).Parameters.ToList() : new List <ParameterExpression>();

            if (expression.ConstantParameters != null)
            {
                parameters.AddRange(expression.ConstantParameters.Keys);
            }
            return(new QueryResult(expression, parameters, expression.ConstantParameters?.Values));
        }
예제 #30
0
        /// <summary>
        /// Compile a query.
        /// </summary>
        /// <param name="query">The query text</param>
        /// <param name="schemaProvider"></param>
        /// <param name="methodProvider"></param>
        /// <returns></returns>
        public static QueryResult Compile(string query, ISchemaProvider schemaProvider, IMethodProvider methodProvider, QueryVariables variables)
        {
            ParameterExpression contextParam = null;

            if (schemaProvider != null)
            {
                contextParam = Expression.Parameter(schemaProvider.ContextType);
            }
            var expression = CompileQuery(query, contextParam, schemaProvider, methodProvider, variables);

            var contextParams = new List <ParameterExpression>();

            if (contextParam != null)
            {
                contextParams.Add(contextParam);
            }
            if (expression.ConstantParameters.Any())
            {
                contextParams.AddRange(expression.ConstantParameters.Keys);
            }
            return(new QueryResult(expression, contextParams, expression.ConstantParameters.Values));
        }