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