예제 #1
0
        public static EqlResult CompileWith(string query, Expression context, ISchemaProvider schemaProvider, IMethodProvider _methodProvider)
        {
            AntlrInputStream stream = new AntlrInputStream(query);
            var lexer  = new EqlGrammerLexer(stream);
            var tokens = new CommonTokenStream(lexer);
            var parser = new EqlGrammerParser(tokens);

            parser.BuildParseTree = true;
            var tree = parser.startRule();

            var visitor    = new EqlGrammerVisitor(context, schemaProvider, _methodProvider);
            var expression = visitor.Visit(tree);

            return(new EqlResult(Expression.Lambda(expression)));
        }
        /// Parses a GraphQL-like query syntax into a tree respresenting the requested object graph. E.g.
        /// {
        ///   entity/query {
        ///     field1,
        ///     field2,
        ///     relation { field }
        ///   },
        ///   ...
        /// }
        ///
        /// The returned DataQueryNode is a root node, it's Fields are the top level data queries
        public DataApiNode Compile(string query)
        {
            // Setup our Antlr parser
            var stream = new AntlrInputStream(query);
            var lexer  = new EqlGrammerLexer(stream);
            var tokens = new CommonTokenStream(lexer);
            var parser = new EqlGrammerParser(tokens);

            parser.BuildParseTree = true;
            parser.ErrorHandler   = new BailErrorStrategy();
            try
            {
                var tree    = parser.dataQuery();
                var visitor = new DataApiVisitor(_schemaProvider, _methodProvider, _relationHandler);
                // visit each node. it will return a linq expression for each entity requested
                var node = visitor.Visit(tree);
                return(node);
            }
            catch (ParseCanceledException pce)
            {
                if (pce.InnerException != null)
                {
                    if (pce.InnerException is NoViableAltException)
                    {
                        var nve = (NoViableAltException)pce.InnerException;
                        throw new EqlCompilerException($"Error: line {nve.OffendingToken.Line}:{nve.OffendingToken.Column} no viable alternative at input '{nve.OffendingToken.Text}'");
                    }
                    else if (pce.InnerException is InputMismatchException)
                    {
                        var ime       = (InputMismatchException)pce.InnerException;
                        var expecting = string.Join(", ", ime.GetExpectedTokens());
                        throw new EqlCompilerException($"Error: line {ime.OffendingToken.Line}:{ime.OffendingToken.Column} extraneous input '{ime.OffendingToken.Text}' expecting {expecting}");
                    }
                    System.Console.WriteLine(pce.InnerException.GetType());
                    throw new EqlCompilerException(pce.InnerException.Message);
                }
                throw new EqlCompilerException(pce.Message);
            }
        }
예제 #3
0
        public static EqlResult Compile(string query, ISchemaProvider schemaProvider, IMethodProvider _methodProvider)
        {
            ParameterExpression contextParam = null;

            if (schemaProvider != null)
            {
                contextParam = Expression.Parameter(schemaProvider.ContextType);
            }

            AntlrInputStream stream = new AntlrInputStream(query);
            var lexer  = new EqlGrammerLexer(stream);
            var tokens = new CommonTokenStream(lexer);
            var parser = new EqlGrammerParser(tokens);

            parser.BuildParseTree = true;
            var tree = parser.startRule();

            var visitor    = new EqlGrammerVisitor(contextParam, schemaProvider, _methodProvider);
            var expression = visitor.Visit(tree);

            return(new EqlResult(contextParam != null ? Expression.Lambda(expression, contextParam) : Expression.Lambda(expression)));
        }