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); } }
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))); }