Beispiel #1
0
        public void ThrowNiceErrorForStructInMemberInitExpression()
        {
            Expression <Func <ICypherResultItem, object> > expression =
                a => new KeyValuePair <ICypherResultItem, ICypherResultItem>()
            {
            };

            var ex = Assert.Throws <ArgumentException>(() => CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters));

            StringAssert.StartsWith(CypherReturnExpressionBuilder.ReturnExpressionCannotBeStruct, ex.Message);
        }
Beispiel #2
0
        public void ReturnNode()
        {
            Expression <Func <ICypherResultItem, object> > expression =
                a => new
            {
                FooNode = a.As <Node <Foo> >()
            };

            var returnExpression = CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters);

            Assert.AreEqual("a AS FooNode", returnExpression.Text);
        }
        public void PreventDoubleNodeWrappedCollectAsDistinct()
        {
            Expression <Func <ICypherResultItem, object> > expression =
                a => new
            {
                Foo = a.CollectAsDistinct <Node <Foo> >()
            };

            var ex = Assert.Throws <ArgumentException>(() => CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters));

            StringAssert.StartsWith(CypherReturnExpressionBuilder.CollectAsDistinctShouldNotBeNodeTExceptionMessage, ex.Message);
        }
Beispiel #4
0
        public void ReturnPropertyWithNullablePropertyOnRightHandSide()
        {
            Expression <Func <ICypherResultItem, Foo> > expression =
                a => new Foo
            {
                Age = a.As <Foo>().AgeNullable.Value
            };

            var returnExpression = CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters);

            Assert.AreEqual("a.AgeNullable AS Age", returnExpression.Text);
        }
Beispiel #5
0
        public void ThrowNiceErrorForConstructorsWithArgumentsInReturnAs()
        {
            Expression <Func <ICypherResultItem, object> > expression =
                a => a.As <TypeWithoutDefaultConstructor>();

            var ex = Assert.Throws <ArgumentException>(() => CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters));

            const string expectedMessage =
                "You've called As<TypeWithoutDefaultConstructor>() in your return clause, where TypeWithoutDefaultConstructor is not a supported type. It must be a simple type (like int, string, or long), a class with a default constructor (so that we can deserialize into it), RelationshipInstance, RelationshipInstance<T>, list of RelationshipInstance, or list of RelationshipInstance<T>.";

            StringAssert.StartsWith(expectedMessage, ex.Message);
        }
Beispiel #6
0
        public void NullablePropertiesShouldNotGetSpecialHandling()
        {
            Expression <Func <ICypherResultItem, OptionalPropertiesQueryResult> > expression =
                n => new OptionalPropertiesQueryResult
            {
                Age          = n.As <Foo>().Age,
                NumberOfCats = n.As <Foo>().NumberOfCats
            };

            var returnExpression = CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters);

            Assert.AreEqual("n.Age AS Age, n.NumberOfCats AS NumberOfCats", returnExpression.Text);
        }
Beispiel #7
0
        public void ReturnCountOnItsOwn()
        {
            // http://docs.neo4j.org/chunked/1.8.M05/query-aggregation.html#aggregation-collect
            // START a=node(1)
            // MATCH a<--b
            // RETURN count(b)

            Expression <Func <ICypherResultItem, long> > expression = b => b.Count();

            var returnExpression = CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters);

            Assert.AreEqual("count(b)", returnExpression.Text);
        }
Beispiel #8
0
        public void ThrowNiceErrorForChainedMethods()
        {
            Expression <Func <ICypherResultItem, object> > expression =
                a => new
            {
                Foo = a
                      .CollectAs <Foo>()
                      .ToList()
            };

            var ex = Assert.Throws <ArgumentException>(() => CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters));

            Assert.AreEqual(CypherReturnExpressionBuilder.ReturnExpressionCannotBeSerializedToCypherExceptionMessage, ex.Message);
        }
Beispiel #9
0
        public void ReturnComplexAnonymousWithValueTypesAndCustomExpressions()
        {
            Expression <Func <ICypherResultItem, ICypherResultItem, ICypherResultItem, object> > expression = (ping, reviews, reviewer) => new
            {
                PingId          = Return.As <long>("ping.Id"),
                PingImage       = Return.As <string>("ping.Image"),
                PingDescription = Return.As <string>("ping.Description"),
                Reviews         = reviews.As <long>(),
                Reviewers       = reviewer.CountDistinct(),
                Avatars         = Return.As <IEnumerable <string> >("collect(distinct reviewer.Avatar)[0..{maxAvatars}]")
            };
            var returnExpression = CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters);

            Assert.AreEqual("ping.Id AS PingId, ping.Image AS PingImage, ping.Description AS PingDescription, reviews AS Reviews, count(distinct reviewer) AS Reviewers, collect(distinct reviewer.Avatar)[0..{maxAvatars}] AS Avatars", returnExpression.Text);
        }
Beispiel #10
0
        public void ReturnNodeInColumn()
        {
            // START a=node(1)
            // RETURN a AS Foo

            Expression <Func <ICypherResultItem, object> > expression =
                a => new
            {
                Foo = a.As <Foo>()
            };

            var returnExpression = CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters);

            Assert.AreEqual("a AS Foo", returnExpression.Text);
        }
Beispiel #11
0
        public void ReturnComplexTupleWithValueTypesAndCustomExpressions()
        {
            Expression <Func <ICypherResultItem, ICypherResultItem, ICypherResultItem, object> > expression = (ping, reviews, reviewer) => new
                                                                                                              Tuple <long, string, string, long, long, IEnumerable <string> >(
                Return.As <long>("ping.Id"),
                Return.As <string>("ping.Image"),
                Return.As <string>("ping.Description"),
                reviews.As <long>(),
                reviewer.CountDistinct(),
                Return.As <IEnumerable <string> >("collect(distinct reviewer.Avatar)[0..{maxAvatars}]")
                );
            var returnExpression = CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters);

            Assert.AreEqual("ping.Id AS Item1, ping.Image AS Item2, ping.Description AS Item3, reviews AS Item4, count(distinct reviewer) AS Item5, collect(distinct reviewer.Avatar)[0..{maxAvatars}] AS Item6", returnExpression.Text);
        }
Beispiel #12
0
        public void ReturnLabelsInAnonymousType()
        {
            // MATCH (a:User)
            // WHERE a.Id == 123
            // RETURN labels(a)

            Expression <Func <ICypherResultItem, object> > expression =
                b => new
            {
                Foo = b.Labels()
            };

            var returnExpression = CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters);

            Assert.AreEqual("labels(b) AS Foo", returnExpression.Text);
        }
Beispiel #13
0
        public void ReturnProperty()
        {
            // http://docs.neo4j.org/chunked/1.6/query-return.html#return-column-alias
            // START a=node(1)
            // RETURN a.Age AS SomethingTotallyDifferent

            Expression <Func <ICypherResultItem, ReturnPropertyQueryResult> > expression =
                a => new ReturnPropertyQueryResult
            {
                SomethingTotallyDifferent = a.As <Foo>().Age
            };

            var returnExpression = CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters);

            Assert.AreEqual("a.Age AS SomethingTotallyDifferent", returnExpression.Text);
        }
Beispiel #14
0
        public void ReturnCustomCypherTextFromDynamicCode()
        {
            // START a=node(1)
            // MATCH a<--b
            // RETURN abs(sum(a.age) - sum(b.age))

            Expression <Func <ICypherResultItem, object> > expression =
                b => new
            {
                Foo = Return.As <long>("abs(sum(a.age)" + new string(' ', 1) + "- sum(b.age))")
            };

            var returnExpression = CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters);

            Assert.AreEqual("abs(sum(a.age) - sum(b.age)) AS Foo", returnExpression.Text);
        }
Beispiel #15
0
        public void ReturnMultiplePropertiesInAnonymousType()
        {
            // http://docs.neo4j.org/chunked/1.6/query-return.html#return-column-alias
            // START a=node(1)
            // RETURN a.Age AS SomethingTotallyDifferent, a.Name as FirstName

            Expression <Func <ICypherResultItem, object> > expression =
                a => new
            {
                SomethingTotallyDifferent = a.As <Foo>().Age,
                FirstName = a.As <Foo>().Name
            };

            var returnExpression = CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters);

            Assert.AreEqual("a.Age AS SomethingTotallyDifferent, a.Name AS FirstName", returnExpression.Text);
        }
Beispiel #16
0
        public void ReturnMultipleNodesInColumns()
        {
            // START a=node(1)
            // MATCH a<--b
            // RETURN a AS Foo, b AS Bar

            Expression <Func <ICypherResultItem, ICypherResultItem, object> > expression =
                (a, b) => new
            {
                Foo = a.As <Foo>(),
                Bar = b.As <Foo>()
            };

            var returnExpression = CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters);

            Assert.AreEqual("a AS Foo, b AS Bar", returnExpression.Text);
        }
Beispiel #17
0
        public void ReturnCollectedDistinctNodesInColumn()
        {
            // http://docs.neo4j.org/chunked/1.9.M05/query-aggregation.html#aggregation-distinct
            // START a=node(1)
            // MATCH a-->b
            // RETURN collect(distinct b.eyes)

            Expression <Func <ICypherResultItem, object> > expression =
                a => new
            {
                Foo = a.CollectAsDistinct <Foo>()
            };

            var returnExpression = CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters);

            Assert.AreEqual("collect(distinct a) AS Foo", returnExpression.Text);
        }
Beispiel #18
0
        public void NullablePropertiesShouldBeQueriedAsCypherOptionalProperties_PreNeo4j20()
        {
            // http://docs.neo4j.org/chunked/1.6/query-return.html#return-optional-properties
            // START n=node(1)
            // RETURN n.Age AS Age, n.NumberOfCats? AS NumberOfCats

            Expression <Func <ICypherResultItem, OptionalPropertiesQueryResult> > expression =
                n => new OptionalPropertiesQueryResult
            {
                Age          = n.As <Foo>().Age,
                NumberOfCats = n.As <Foo>().NumberOfCats
            };

            var returnExpression = CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Cypher19, GraphClient.DefaultJsonConverters);

            Assert.AreEqual("n.Age AS Age, n.NumberOfCats? AS NumberOfCats", returnExpression.Text);
        }
Beispiel #19
0
        public void ReturnLastCollectedNodesInColumn()
        {
            // http://docs.neo4j.org/chunked/milestone/query-functions-scalar.html#functions-last
            // START a=node(1)
            // MATCH a<--b
            // RETURN last(collect(a))

            Expression <Func <ICypherResultItem, object> > expression =
                a => new
            {
                Foo = a.Last().CollectAs <Foo>()
            };

            var returnExpression = CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters);

            Assert.AreEqual("last(collect(a)) AS Foo", returnExpression.Text);
        }
        public void ReturnCountInAnonymousType()
        {
            // http://docs.neo4j.org/chunked/1.8.M05/query-aggregation.html#aggregation-collect
            // START a=node(1)
            // MATCH a<--b
            // RETURN count(b)

            Expression <Func <ICypherResultItem, object> > expression =
                b => new
            {
                Foo = b.Count()
            };

            var returnExpression = CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters);

            Assert.Equal("count(b) AS Foo", returnExpression.Text);
        }
Beispiel #21
0
        public void ReturnMultiplePropertiesFromMultipleColumns()
        {
            // http://docs.neo4j.org/chunked/milestone/cypher-query-lang.html
            // START john=node(1)
            // MATCH john-[:friend]->()-[:friend]->fof
            // RETURN john.Age, fof.Name

            Expression <Func <ICypherResultItem, ICypherResultItem, ReturnPropertyQueryResult> > expression =
                (john, fof) => new ReturnPropertyQueryResult
            {
                SomethingTotallyDifferent = john.As <Foo>().Age,
                FirstName = fof.As <Foo>().Name
            };

            var returnExpression = CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters);

            Assert.AreEqual("john.Age AS SomethingTotallyDifferent, fof.Name AS FirstName", returnExpression.Text);
        }
Beispiel #22
0
        public void AllowListOfInt32InReturnAs()
        {
            Expression <Func <ICypherResultItem, object> > expression = a => a.As <List <int> >();

            Assert.DoesNotThrow(() => CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters));
        }
Beispiel #23
0
        public void AllowEnumerableOfRelationshipInstanceInReturnAs()
        {
            Expression <Func <ICypherResultItem, object> > expression = a => a.As <IEnumerable <RelationshipInstance <object> > >();

            Assert.DoesNotThrow(() => CypherReturnExpressionBuilder.BuildText(expression, CypherCapabilities.Default, GraphClient.DefaultJsonConverters));
        }