From e73afaa9ebd60496262084596811774ebb983f1e Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Fri, 4 Dec 2020 13:20:40 +0100 Subject: [PATCH] GH113 - Allow conditions based on path patterns on pattern comprehensions. --- .../cypherdsl/core/PatternComprehension.java | 15 +++++++++++++++ .../java/org/neo4j/cypherdsl/core/CypherIT.java | 16 ++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/PatternComprehension.java b/neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/PatternComprehension.java index 72f2fa3913..48e8805cf3 100644 --- a/neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/PatternComprehension.java +++ b/neo4j-cypher-dsl/src/main/java/org/neo4j/cypherdsl/core/PatternComprehension.java @@ -80,6 +80,21 @@ public interface OngoingDefinitionWithPattern extends OngoingDefinitionWithoutRe * @return An ongoing definition of a pattern comprehension for furhter modification */ OngoingDefinitionWithPatternAndWhere where(Condition condition); + + /** + * Adds a where clause based on a path pattern to the ongoing definition + * + * @param pathPattern The path pattern to add to the where clause. + * This path pattern must not be {@literal null} and must + * not introduce new variables not available in the match. + * @return A match or a call restricted by a where clause with no return items yet. + * @since 2020.1.4 + */ + default OngoingDefinitionWithPatternAndWhere where(RelationshipPattern pathPattern) { + + Assertions.notNull(pathPattern, "The path pattern must not be null."); + return this.where(new RelationshipPatternCondition(pathPattern)); + } } /** diff --git a/neo4j-cypher-dsl/src/test/java/org/neo4j/cypherdsl/core/CypherIT.java b/neo4j-cypher-dsl/src/test/java/org/neo4j/cypherdsl/core/CypherIT.java index cefbd9dbcb..e633751eb5 100644 --- a/neo4j-cypher-dsl/src/test/java/org/neo4j/cypherdsl/core/CypherIT.java +++ b/neo4j-cypher-dsl/src/test/java/org/neo4j/cypherdsl/core/CypherIT.java @@ -1391,6 +1391,22 @@ void doc3653() { .isEqualTo("MATCH (n:`Person`) WHERE (n)-[:`KNOWS`]-( {name: 'Timothy'}) RETURN n.name, n.age"); } + @Test + void gh113() { + + Node foo = Cypher.node("Foo").named("foo"); + Node bar = Cypher.node("Bar").named("bar"); + Relationship fooBar = foo.relationshipTo(bar, "FOOBAR").named("rel"); + PatternComprehension pc = Cypher.listBasedOn(fooBar) + .where(bar.relationshipTo(Cypher.node("ZZZ"), "HAS")) + .returning(fooBar, bar); + Statement statement = Cypher.match(foo).returning(foo.getRequiredSymbolicName(), pc).build(); + + assertThat(cypherRenderer.render(statement)).isEqualTo( + "MATCH (foo:`Foo`) RETURN foo, [(foo)-[rel:`FOOBAR`]->(bar:`Bar`) WHERE (bar)-[:`HAS`]->(:`ZZZ`) | [rel, bar]]" + ); + } + @Test void doc3654() {