public void CanParseQueryWithCollection() { var tree = new DataApiCompiler(SchemaBuilder.FromObject <TestSchema>(), new DefaultMethodProvider()).Compile(@" { people { id, name, projects { name } } }"); // People.Select(p => new { Id = p.Id, Name = p.Name, User = new { Field1 = p.User.Field1 }) Assert.Single(tree.Fields); dynamic result = tree.Fields.ElementAt(0).AsLambda().Compile().DynamicInvoke(new TestSchema()); Assert.Equal(1, Enumerable.Count(result)); var person = Enumerable.ElementAt(result, 0); // we only have the fields requested Assert.Equal(3, person.GetType().GetFields().Length); Assert.Equal("Id", person.GetType().GetFields()[0].Name); Assert.Equal("Name", person.GetType().GetFields()[1].Name); // make sure we sub-select correctly to make the requested object graph Assert.Equal("Projects", person.GetType().GetFields()[2].Name); var projects = person.Projects; Assert.Equal(1, Enumerable.Count(projects)); var project = Enumerable.ElementAt(projects, 0); Assert.Equal(1, project.GetType().GetFields().Length); Assert.Equal("Name", project.GetType().GetFields()[0].Name); }
public void HandlesCustomRelationHandler() { var tree = new DataApiCompiler(SchemaBuilder.FromObject <DbTestSchema>(), new DefaultMethodProvider(), new EfRelationHandler(typeof(EntityFrameworkQueryableExtensions))).Compile(@" { people { id, name, User { field1 } } }"); // People.Include(p => p.User).Select(p => new { Id = p.Id, Name = p.Name, User = new { Field1 = p.User.Field1 }) Assert.Single(tree.Fields); dynamic result = tree.Fields.ElementAt(0).AsLambda().Compile().DynamicInvoke(new TestSchema()); Assert.Equal(1, Enumerable.Count(result)); var person = Enumerable.ElementAt(result, 0); // we only have the fields requested Assert.Equal(3, person.GetType().GetFields().Length); Assert.Equal("Id", person.GetType().GetFields()[0].Name); Assert.Equal("Name", person.GetType().GetFields()[1].Name); // make sure we sub-select correctly to make the requested object graph Assert.Equal("User", person.GetType().GetFields()[2].Name); var user = person.User; Assert.Equal(1, user.GetType().GetFields().Length); Assert.Equal("Field1", user.GetType().GetFields()[0].Name); }
public void CanParseMultipleEntityQuery() { var tree = new DataApiCompiler(SchemaBuilder.FromObject <TestSchema>(), new DefaultMethodProvider()).Compile(@" { people { id, name }, Users { id } }"); Assert.Equal(2, tree.Fields.Count); dynamic result = tree.Fields.ElementAt(0).AsLambda().Compile().DynamicInvoke(new TestSchema()); Assert.Equal(1, Enumerable.Count(result)); var person = Enumerable.ElementAt(result, 0); // we only have the fields requested Assert.Equal(2, person.GetType().GetFields().Length); Assert.Equal("Id", person.GetType().GetFields()[0].Name); Assert.Equal("Name", person.GetType().GetFields()[1].Name); result = tree.Fields.ElementAt(1).AsLambda().Compile().DynamicInvoke(new TestSchema()); Assert.Equal(1, Enumerable.Count(result)); var user = Enumerable.ElementAt(result, 0); // we only have the fields requested Assert.Single(user.GetType().GetFields()); Assert.Equal("Id", user.GetType().GetFields()[0].Name); }
public void CanParseAliasQuery() { var tree = new DataApiCompiler(new ObjectSchemaProvider<TestSchema>(), new DefaultMethodProvider()).Compile(@" { luke: people.where(id = 99) { id, name } }"); Assert.Equal(1, tree.Fields.Count); Assert.Equal("luke", tree.Fields.ElementAt(0).Name); dynamic result = tree.Fields.ElementAt(0).AsLambda().Compile().DynamicInvoke(new TestSchema()); Assert.Equal(1, Enumerable.Count(result)); }
/// 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); }
public void CanParseSimpleQuery2() { var tree = new DataApiCompiler(SchemaBuilder.FromObject <TestSchema>(), new DefaultMethodProvider()).Compile(@" { people.where(id = 9) { id, name } }"); Assert.Single(tree.Fields); dynamic result = tree.Fields.ElementAt(0).AsLambda().Compile().DynamicInvoke(new TestSchema()); Assert.Equal(0, Enumerable.Count(result)); }
public void CanRemoveFields() { var objectSchemaProvider = SchemaBuilder.FromObject <TestSchema>(); objectSchemaProvider.Type <Person>().RemoveField(p => p.Id); var ex = Assert.Throws <DataApiException>(() => { var tree = new DataApiCompiler(objectSchemaProvider, new DefaultMethodProvider()).Compile(@" { people { id } }"); }); Assert.Equal("Error compiling field or query 'people'. Type EntityQueryLanguage.DataApi.Tests.DataApiCompilerTests+Person does not have field or property id", ex.Message); }
public void CanParseScalar() { var objectSchemaProvider = SchemaBuilder.FromObject <TestSchema>(); var tree = new DataApiCompiler(objectSchemaProvider, new DefaultMethodProvider()).Compile(@" { people { id, name }, total: people.count() }"); Assert.Equal(2, tree.Fields.Count); var result = tree.Fields.ElementAt(1).AsLambda().Compile().DynamicInvoke(new TestSchema()) as int?; Assert.True(result.HasValue); Assert.Equal(1, result.Value); }
public void CanParseAliasQueryComplexExpression() { var tree = new DataApiCompiler(new ObjectSchemaProvider<TestSchema>(), new DefaultMethodProvider()).Compile(@" { people { id, fullName: name + ' ' + lastname } }"); Assert.Equal(1, tree.Fields.Count); Assert.Equal("people", tree.Fields.ElementAt(0).Name); dynamic result = tree.Fields.ElementAt(0).AsLambda().Compile().DynamicInvoke(new TestSchema()); Assert.Equal(1, Enumerable.Count(result)); var person = Enumerable.ElementAt(result, 0); Assert.Equal(2, person.GetType().GetFields().Length); Assert.Equal("Id", person.GetType().GetFields()[0].Name); Assert.Equal("fullName", person.GetType().GetFields()[1].Name); }
public void CanParseAliasQueryComplexExpression() { var tree = new DataApiCompiler(SchemaBuilder.FromObject <TestSchema>(), new DefaultMethodProvider()).Compile(@" { people { id, fullName: name + ' ' + lastname } }"); Assert.Single(tree.Fields); Assert.Equal("people", tree.Fields.ElementAt(0).Name); dynamic result = tree.Fields.ElementAt(0).AsLambda().Compile().DynamicInvoke(new TestSchema()); Assert.Equal(1, Enumerable.Count(result)); var person = Enumerable.ElementAt(result, 0); Assert.Equal(2, person.GetType().GetFields().Length); Assert.Equal("Id", person.GetType().GetFields()[0].Name); Assert.Equal("fullName", person.GetType().GetFields()[1].Name); }
public void CanQueryExtendedFields() { var objectSchemaProvider = SchemaBuilder.FromObject <TestSchema>(); objectSchemaProvider.Type <Person>().AddField("thing", p => p.Id + " - " + p.Name, "A weird field I want"); var tree = new DataApiCompiler(objectSchemaProvider, new DefaultMethodProvider()).Compile(@" { people { id, thing } }"); Assert.Single(tree.Fields); dynamic result = tree.Fields.ElementAt(0).AsLambda().Compile().DynamicInvoke(new TestSchema()); Assert.Equal(1, Enumerable.Count(result)); var person = Enumerable.ElementAt(result, 0); // we only have the fields requested Assert.Equal(2, person.GetType().GetFields().Length); Assert.Equal("Id", person.GetType().GetFields()[0].Name); Assert.Equal("thing", person.GetType().GetFields()[1].Name); }
public void CanParseQueryWithCollection() { var tree = new DataApiCompiler(new ObjectSchemaProvider<TestSchema>(), new DefaultMethodProvider()).Compile(@" { people { id, name, projects { name } } }"); // People.Select(p => new { Id = p.Id, Name = p.Name, User = new { Field1 = p.User.Field1 }) Assert.Equal(1, tree.Fields.Count); dynamic result = tree.Fields.ElementAt(0).AsLambda().Compile().DynamicInvoke(new TestSchema()); Assert.Equal(1, Enumerable.Count(result)); var person = Enumerable.ElementAt(result, 0); // we only have the fields requested Assert.Equal(3, person.GetType().GetFields().Length); Assert.Equal("Id", person.GetType().GetFields()[0].Name); Assert.Equal("Name", person.GetType().GetFields()[1].Name); // make sure we sub-select correctly to make the requested object graph Assert.Equal("Projects", person.GetType().GetFields()[2].Name); var projects = person.Projects; Assert.Equal(1, Enumerable.Count(projects)); var project = Enumerable.ElementAt(projects, 0); Assert.Equal(1, project.GetType().GetFields().Length); Assert.Equal("Name", project.GetType().GetFields()[0].Name); }
public void CanParseMultipleEntityQuery() { var tree = new DataApiCompiler(new ObjectSchemaProvider<TestSchema>(), new DefaultMethodProvider()).Compile(@" { people { id, name }, Users { id } }"); Assert.Equal(2, tree.Fields.Count); dynamic result = tree.Fields.ElementAt(0).AsLambda().Compile().DynamicInvoke(new TestSchema()); Assert.Equal(1, Enumerable.Count(result)); var person = Enumerable.ElementAt(result, 0); // we only have the fields requested Assert.Equal(2, person.GetType().GetFields().Length); Assert.Equal("Id", person.GetType().GetFields()[0].Name); Assert.Equal("Name", person.GetType().GetFields()[1].Name); result = tree.Fields.ElementAt(1).AsLambda().Compile().DynamicInvoke(new TestSchema()); Assert.Equal(1, Enumerable.Count(result)); var user = Enumerable.ElementAt(result, 0); // we only have the fields requested Assert.Equal(1, user.GetType().GetFields().Length); Assert.Equal("Id", user.GetType().GetFields()[0].Name); }
public void HandlesCustomRelationHandler() { var tree = new DataApiCompiler(new ObjectSchemaProvider<DbTestSchema>(), new DefaultMethodProvider(), new EfRelationHandler(typeof(EntityFrameworkQueryableExtensions))).Compile(@" { people { id, name, User { field1 } } }"); // People.Include(p => p.User).Select(p => new { Id = p.Id, Name = p.Name, User = new { Field1 = p.User.Field1 }) Assert.Equal(1, tree.Fields.Count); dynamic result = tree.Fields.ElementAt(0).AsLambda().Compile().DynamicInvoke(new TestSchema()); Assert.Equal(1, Enumerable.Count(result)); var person = Enumerable.ElementAt(result, 0); // we only have the fields requested Assert.Equal(3, person.GetType().GetFields().Length); Assert.Equal("Id", person.GetType().GetFields()[0].Name); Assert.Equal("Name", person.GetType().GetFields()[1].Name); // make sure we sub-select correctly to make the requested object graph Assert.Equal("User", person.GetType().GetFields()[2].Name); var user = person.User; Assert.Equal(1, user.GetType().GetFields().Length); Assert.Equal("Field1", user.GetType().GetFields()[0].Name); }
public void CanParseQueryWithRelationDeep() { var tree = new DataApiCompiler(new ObjectSchemaProvider<TestSchema>(), new DefaultMethodProvider()).Compile(@" { people { id, name, User { field1, nestedRelation { id, name } } } }"); // People.Select(p => new { Id = p.Id, Name = p.Name, User = new { Field1 = p.User.Field1, NestedRelation = new { Id = p.User.NestedRelation.Id, Name = p.User.NestedRelation.Name } }) Assert.Equal(1, tree.Fields.Count); dynamic result = tree.Fields.ElementAt(0).AsLambda().Compile().DynamicInvoke(new TestSchema()); Assert.Equal(1, Enumerable.Count(result)); var person = Enumerable.ElementAt(result, 0); // we only have the fields requested Assert.Equal(3, person.GetType().GetFields().Length); Assert.Equal("Id", person.GetType().GetFields()[0].Name); Assert.Equal("Name", person.GetType().GetFields()[1].Name); // make sure we sub-select correctly to make the requested object graph Assert.Equal("User", person.GetType().GetFields()[2].Name); var user = person.User; Assert.Equal(2, user.GetType().GetFields().Length); Assert.Equal("Field1", user.GetType().GetFields()[0].Name); Assert.Equal("NestedRelation", user.GetType().GetFields()[1].Name); var nested = person.User.NestedRelation; Assert.Equal(2, nested.GetType().GetFields().Length); Assert.Equal("Id", nested.GetType().GetFields()[0].Name); Assert.Equal("Name", nested.GetType().GetFields()[1].Name); }