public void CompilesFirst()
        {
            var exp    = EqlCompiler.Compile(@"people.first(guid = ""6492f5fe-0869-4279-88df-7f82f8e87a67"")", SchemaBuilder.FromObject <TestSchema>(), new DefaultMethodProvider(), null);
            var result = exp.Execute(new TestSchema()) as Person;

            Assert.Equal(new Guid("6492f5fe-0869-4279-88df-7f82f8e87a67"), result.Guid);
        }
        public void CompilesFirstNoPredicate()
        {
            var exp    = EqlCompiler.Compile("people.first()", SchemaBuilder.FromObject <TestSchema>(), new DefaultMethodProvider(), null);
            var result = exp.Execute(new TestSchema()) as Person;

            Assert.Equal("Bob", result.Name);
        }
        public void CompilesWhere2()
        {
            var exp    = EqlCompiler.Compile(@"people.where(name = ""Luke"")", SchemaBuilder.FromObject <TestSchema>(), new DefaultMethodProvider(), null);
            var result = exp.Execute(new TestSchema()) as IEnumerable <Person>;

            Assert.Single(result);
        }
Beispiel #4
0
        public void TestConversionToGuid()
        {
            var     exp    = EqlCompiler.Compile("people.where(guid = '6492f5fe-0869-4279-88df-7f82f8e87a67')", new TestObjectGraphSchema());
            dynamic result = exp.Execute(GetDataContext());

            Assert.Equal(1, Enumerable.Count(result));
        }
Beispiel #5
0
        public void CompilesIdentityCall()
        {
            var     exp    = EqlCompiler.Compile("people", new TestObjectGraphSchema());
            dynamic result = exp.Execute(GetDataContext());

            Assert.Equal(1, Enumerable.Count(result));
        }
Beispiel #6
0
        public void CompilesIfThenElseInlineFalseBrackets()
        {
            // tells it how to read it
            var exp = EqlCompiler.Compile("(someRelation.relation.id = 98) ? 100 : 66", SchemaBuilder.FromObject <TestSchema>());

            Assert.Equal(66, exp.Execute(new TestSchema()));
        }
Beispiel #7
0
        public void CompilesTypeBuiltFromObject()
        {
            // no brackets so it reads it as someRelation.relation.id = (99 ? 'wooh' : 66) and fails as 99 is not a bool
            var exp = EqlCompiler.Compile("defaultlocation.id = 10", new TestObjectGraphSchema());

            Assert.True((bool)exp.Execute(GetDataContext()));
        }
        public void CompilesWhere()
        {
            var exp    = EqlCompiler.Compile("people.where(name = 'bob')", SchemaBuilder.FromObject <TestSchema>(), new DefaultMethodProvider());
            var result = exp.Execute(new TestSchema()) as IEnumerable <Person>;

            Assert.Empty(result);
        }
Beispiel #9
0
        public void TestLinqQueryWorks()
        {
            var schemaProvider = SchemaBuilder.FromObject <TestEntity>();
            var compiledResult = EqlCompiler.Compile("(relation.id = 1) or (relation.id = 2)", schemaProvider, null);
            var list           = new List <TestEntity> {
                new TestEntity("bob")
                {
                    Relation = new Person {
                        Id = 1
                    }
                },
                new TestEntity("mary")
                {
                    Relation = new Person {
                        Id = 2
                    }
                },
                new TestEntity("Jake")
                {
                    Relation = new Person {
                        Id = 5
                    }
                }
            };

            Assert.Equal(3, list.Count());
            var results = list.Where(compiledResult.LambdaExpression);

            Assert.Equal(2, results.Count());
            Assert.Equal("bob", results.ElementAt(0).Name);
            Assert.Equal("mary", results.ElementAt(1).Name);
        }
Beispiel #10
0
        public void FailsIfThenElseInlineNoBrackets()
        {
            // no brackets so it reads it as someRelation.relation.id = (99 ? 'wooh' : 66) and fails as 99 is not a bool
            var ex = Assert.Throws <EqlCompilerException>(() => EqlCompiler.Compile("someRelation.relation.id = 99 ? 'wooh' : 66", SchemaBuilder.FromObject <TestSchema>()));

            Assert.Equal("Expected boolean value in conditional test but found '99'", ex.Message);
        }
        public void CompilesTake()
        {
            var exp    = EqlCompiler.Compile("people.take(1)", SchemaBuilder.FromObject <TestSchema>(), new DefaultMethodProvider(), null);
            var result = exp.Execute(new TestSchema()) as IEnumerable <Person>;

            Assert.Single(result);
            Assert.Equal("Bob", result.ElementAt(0).Name);
        }
        public void CompilesSkip()
        {
            var exp    = EqlCompiler.Compile("people.Skip(1)", SchemaBuilder.FromObject <TestSchema>(), new DefaultMethodProvider(), null);
            var result = exp.Execute(new TestSchema()) as IEnumerable <Person>;

            Assert.Equal(3, result.Count());
            Assert.Equal("Luke", result.ElementAt(0).Name);
        }
        public void CompilesMethodsChained()
        {
            var exp    = EqlCompiler.Compile("people.where(id = 9).take(2)", SchemaBuilder.FromObject <TestSchema>(), new DefaultMethodProvider(), null);
            var result = exp.Execute(new TestSchema()) as IEnumerable <Person>;

            Assert.Equal(2, result.Count());
            Assert.Equal("Bob", result.ElementAt(0).Name);
            // should skip Luke because of the where
            Assert.Equal("Boba", result.ElementAt(1).Name);
        }
Beispiel #14
0
        public void CompilesIdentityCallFullPath()
        {
            var schema = new TestObjectGraphSchema();
            var exp    = EqlCompiler.Compile("privateProjects.where(id = 8).count()", schema);

            Assert.Equal(0, exp.Execute(GetDataContext()));
            var exp2 = EqlCompiler.Compile("privateProjects.count()", schema);

            Assert.Equal(1, exp2.Execute(GetDataContext()));
        }
Beispiel #15
0
        public void CanUseCompiledExpressionInWhereMethod()
        {
            var exp     = EqlCompiler.Compile("name = \"Bob\"", SchemaBuilder.FromObject <TestEntity>(), null);
            var objects = new List <TestEntity> {
                new TestEntity("Sally"), new TestEntity("Bob")
            };

            Assert.Equal(2, objects.Count);
            var results = objects.Where(exp.LambdaExpression);

            Assert.Single(results);
            Assert.Equal("Bob", results.ElementAt(0).Name);
        }
            public override DataApiNode VisitAliasExp(EqlGrammerParser.AliasExpContext context)
            {
                var        name  = context.alias.name.GetText();
                var        query = context.entity.GetText();
                Expression result;

                if (_selectContext == null)
                {
                    // top level are queries on the context
                    var exp  = EqlCompiler.Compile(query, _schemaProvider, _methodProvider).Expression;
                    var node = new DataApiNode(name, exp.Body, exp.Parameters.First(), null);
                    return(node);
                }
                else
                {
                    result = EqlCompiler.CompileWith(query, _selectContext, _schemaProvider, _methodProvider).Expression.Body;
                    var node = new DataApiNode(name, result, null, null);
                    return(node);
                }
            }
            /// Given a syntax of someField { fields, to, selection, from, object }
            /// it will figure out if 'someField' is an IEnumerable or an istance of the object (not a collection) and build the correct select statement
            private DataApiNode BuildDynamicSelectForObjectGraph(string query, string name, EqlGrammerParser.EntityQueryContext context)
            {
                if (!_schemaProvider.TypeHasField(_selectContext.Type.Name, name))
                {
                    throw new EqlCompilerException($"Type {_selectContext.Type} does not have field or property {name}");
                }
                name = _schemaProvider.GetActualFieldName(_selectContext.Type.Name, name);

                // Don't really like any of this, but...
                try
                {
                    var result = EqlCompiler.CompileWith(query, _selectContext, _schemaProvider, _methodProvider);
                    var exp    = result.Expression;
                    if (exp.Body.Type.IsEnumerable())
                    {
                        return(BuildDynamicSelectOnCollection(exp, name, context, false));
                    }

                    var oldContext = _selectContext;
                    _selectContext = exp.Body;
                    // visit child fields. Will be field or entityQueries again
                    var fieldExpressions = context.fields.children.Select(c => Visit(c)).Where(n => n != null).ToList();

                    var relationsExps = fieldExpressions.Where(f => f.Expression.NodeType == ExpressionType.MemberInit || f.Expression.NodeType == ExpressionType.Call).ToList();
                    if (_relationHandler != null && relationsExps.Any())
                    {
                        var parameterExpression = Expression.Parameter(_selectContext.Type);
                        var relations           = relationsExps.Select(r => (Expression)Expression.PropertyOrField(parameterExpression, r.Name)).ToList();
                        exp = _relationHandler.BuildNodeForSelect(relations, parameterExpression, exp, name, _schemaProvider);
                    }

                    var newExp = DataApiExpressionUtil.CreateNewExpression(_selectContext, fieldExpressions, _schemaProvider);
                    _selectContext = oldContext;
                    return(new DataApiNode(_schemaProvider.GetActualFieldName(_selectContext.Type.Name, name), newExp, exp.Parameters.Any() ? exp.Parameters.First() : null, exp.Body));
                }
                catch (EqlCompilerException ex)
                {
                    throw DataApiException.MakeFieldCompileError(query, ex.Message);
                }
            }
            /// We compile each entityQuery with EqlCompiler and build a Select call from the fields
            public override DataApiNode VisitEntityQuery(EqlGrammerParser.EntityQueryContext context)
            {
                string name;
                string query;

                if (context.alias != null)
                {
                    name  = context.alias.name.GetText();
                    query = context.entity.GetText();
                }
                else
                {
                    query = context.entity.GetText();
                    name  = query;
                    if (name.IndexOf(".") > -1)
                    {
                        name = name.Substring(0, name.IndexOf("."));
                    }
                }

                try
                {
                    if (_selectContext == null)
                    {
                        // top level are queries on the context
                        var exp            = EqlCompiler.Compile(query, _schemaProvider, _methodProvider).Expression;
                        var topLevelSelect = BuildDynamicSelectOnCollection(exp, name, context, true);
                        return(topLevelSelect);
                    }
                    // other levels are object selection. e.g. from the top level people query I am selecting all their children { field1, etc. }
                    return(BuildDynamicSelectForObjectGraph(query, name, context));
                }
                catch (EqlCompilerException ex)
                {
                    //return DataApiNode.MakeError(name, $"Error compiling field or query '{query}'. {ex.Message}");
                    throw DataApiException.MakeFieldCompileError(query, ex.Message);
                }
            }
Beispiel #19
0
        public void CompilesIfThenElseTrue()
        {
            var exp = EqlCompiler.Compile("if publicProjects.Count() > 1 then 'Yes' else 'No'", new TestObjectGraphSchema());

            Assert.Equal("No", exp.Execute(GetDataContext()));
        }
Beispiel #20
0
        public void CompilesIfThenElseInlineFalseBrackets()
        {
            var exp = EqlCompiler.Compile("(publicProjects.Count(id = 90) = 1) ? 'Yes' : 'No'", new TestObjectGraphSchema());

            Assert.Equal("Yes", exp.Execute(GetDataContext()));
        }
Beispiel #21
0
        public void CompilesNegitiveNumberConstant()
        {
            var exp = EqlCompiler.Compile("-43");

            Assert.Equal(-43, exp.Execute());
        }
Beispiel #22
0
        public void CompilesStringConstant()
        {
            var exp = EqlCompiler.Compile("'Hello there_987-%#&	;;s'");

            Assert.Equal("Hello there_987-%#&	;;s", exp.Execute());
        }
Beispiel #23
0
        public void CompilesNumberDecimalConstant()
        {
            var exp = EqlCompiler.Compile("23.3");

            Assert.Equal(23.3m, exp.Execute());
        }
Beispiel #24
0
        public void FailsIdentityNotThere()
        {
            var ex = Assert.Throws <EqlCompilerException>(() => EqlCompiler.Compile("wrongField", SchemaBuilder.FromObject <TestSchema>()));

            Assert.Equal("Field or property 'wrongField' not found on current context 'TestSchema'", ex.Message);
        }
Beispiel #25
0
        public void CompilesIdentityCall()
        {
            var exp = EqlCompiler.Compile("hello", SchemaBuilder.FromObject <TestSchema>());

            Assert.Equal("returned value", exp.Execute(new TestSchema()));
        }
        public void FailsWhereWrongParameterType()
        {
            var ex = Assert.Throws <EntityGraphQLCompilerException>(() => EqlCompiler.Compile("people.where(name)", SchemaBuilder.FromObject <TestSchema>(), new DefaultMethodProvider(), null));

            Assert.Equal("Method 'where' expects parameter that evaluates to a 'System.Boolean' result but found result type 'System.String'", ex.Message);
        }
        public void FailsWhereNoParameter()
        {
            var ex = Assert.Throws <EntityGraphQLCompilerException>(() => EqlCompiler.Compile("people.where()", SchemaBuilder.FromObject <TestSchema>(), new DefaultMethodProvider(), null));

            Assert.Equal("Method 'where' expects 1 argument(s) but 0 were supplied", ex.Message);
        }
Beispiel #28
0
        public void CompilesIdentityCallFullPathDeep()
        {
            var exp = EqlCompiler.Compile("someRelation.relation.id", SchemaBuilder.FromObject <TestSchema>());

            Assert.Equal(99, exp.Execute(new TestSchema()));
        }
Beispiel #29
0
        public void CompilesBinaryExpressionPlus()
        {
            var exp = EqlCompiler.Compile("someRelation.relation.id + 99", SchemaBuilder.FromObject <TestSchema>());

            Assert.Equal(198, exp.Execute(new TestSchema()));
        }
Beispiel #30
0
        public void CompilesBinaryExpressionEqualsAndAdd()
        {
            var exp = EqlCompiler.Compile("someRelation.relation.id = (99 - 32)", SchemaBuilder.FromObject <TestSchema>());

            Assert.False((bool)exp.Execute(new TestSchema()));
        }