DATAGRAPH-1091: Deep nested derived queries support.
Introduce feature to support deeper than just one level of property path in derived query methods. (cherry picked from commit dd2ee88)
This commit is contained in:
2
pom.xml
2
pom.xml
@@ -26,7 +26,7 @@
|
||||
<properties>
|
||||
<project.type>multi</project.type>
|
||||
<dist.id>spring-data-neo4j</dist.id>
|
||||
<neo4j.ogm.version>3.0.3</neo4j.ogm.version>
|
||||
<neo4j.ogm.version>3.0.4-SNAPSHOT</neo4j.ogm.version>
|
||||
<springdata.commons>2.0.9.BUILD-SNAPSHOT</springdata.commons>
|
||||
<source.level>1.8</source.level>
|
||||
</properties>
|
||||
|
||||
@@ -13,16 +13,19 @@
|
||||
|
||||
package org.springframework.data.neo4j.repository.query.derived.builder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Stack;
|
||||
|
||||
import org.neo4j.ogm.cypher.BooleanOperator;
|
||||
import org.neo4j.ogm.cypher.Filter;
|
||||
import org.springframework.data.mapping.PropertyPath;
|
||||
import org.springframework.data.repository.query.parser.Part;
|
||||
|
||||
/**
|
||||
* @author Jasper Blues
|
||||
* @author Nicolas Mervaillie
|
||||
* @author Gerrit Meier
|
||||
*/
|
||||
public abstract class FilterBuilder {
|
||||
|
||||
@@ -47,12 +50,28 @@ public abstract class FilterBuilder {
|
||||
}
|
||||
|
||||
void setNestedAttributes(Part part, Filter filter) {
|
||||
if (part.getProperty().next() != null) {
|
||||
filter.setOwnerEntityType(part.getProperty().getOwningType().getType());
|
||||
filter.setNestedPropertyType(part.getProperty().getType());
|
||||
filter.setPropertyName(part.getProperty().getLeafProperty().getSegment());
|
||||
filter.setNestedPropertyName(part.getProperty().getSegment());
|
||||
List<Filter.NestedPathSegment> segments = new ArrayList<>();
|
||||
PropertyPath property = part.getProperty();
|
||||
if (property.hasNext()) {
|
||||
filter.setOwnerEntityType(property.getOwningType().getType());
|
||||
segments.add(new Filter.NestedPathSegment(property.getSegment(), property.getType()));
|
||||
segments.addAll(deepNestedProperty(property));
|
||||
filter.setPropertyName(property.getLeafProperty().getSegment());
|
||||
filter.setNestedPath(segments.toArray(new Filter.NestedPathSegment[0]));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private List<Filter.NestedPathSegment> deepNestedProperty(PropertyPath path) {
|
||||
List<Filter.NestedPathSegment> segments = new ArrayList<>();
|
||||
if (path.hasNext()) {
|
||||
PropertyPath next = path.next();
|
||||
if (!next.equals(next.getLeafProperty())) {
|
||||
segments.add(new Filter.NestedPathSegment(next.getSegment(), next.getType()));
|
||||
segments.addAll(deepNestedProperty(next));
|
||||
}
|
||||
}
|
||||
return segments;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -57,6 +57,8 @@ public interface CinemaRepository extends Neo4jRepository<Cinema, Long> {
|
||||
|
||||
List<Cinema> findByVisitedName(String name);
|
||||
|
||||
List<Cinema> findByVisitedInterestedName(String title);
|
||||
|
||||
List<Cinema> findByLocationAndVisitedName(String location, String name);
|
||||
|
||||
List<Cinema> findByLocationAndCapacityGreaterThan(String location, int capacity);
|
||||
|
||||
@@ -309,6 +309,20 @@ public class DerivedQueryTests extends MultiDriverTestClass {
|
||||
assertTrue(theatres.contains(new Cinema("Ritzy")));
|
||||
}
|
||||
|
||||
/**
|
||||
* @see DATAGRAPH-???
|
||||
*/
|
||||
@Test
|
||||
public void shouldFindNodeEntititiesWithDeepNestedProperty() {
|
||||
executeUpdate("CREATE (r:Theatre {name:'Ritzy', city:'London', capacity: 7500})" +
|
||||
" CREATE (u:User {name:'Michal'}) CREATE (u)-[:VISITED]->(r) CREATE (m1:Movie {name:'Speed'})" +
|
||||
" CREATE (g:Genre {name:'Thriller'}) CREATE (u)-[:INTERESTED]->(g)");
|
||||
|
||||
List<Cinema> theatres = cinemaRepository.findByVisitedInterestedName("Thriller");
|
||||
assertEquals(1, theatres.size());
|
||||
assertTrue(theatres.contains(new Cinema("Ritzy")));
|
||||
}
|
||||
|
||||
/**
|
||||
* @see DATAGRAPH-629
|
||||
*/
|
||||
|
||||
@@ -19,6 +19,7 @@ import org.springframework.data.neo4j.annotation.Query;
|
||||
import org.springframework.data.neo4j.domain.sample.User;
|
||||
import org.springframework.data.neo4j.repository.Neo4jRepository;
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
import org.springframework.data.repository.query.Param;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
|
||||
@@ -71,5 +72,5 @@ public interface UserRepository extends Neo4jRepository<User, Long> {
|
||||
*/
|
||||
@Query("MATCH (n:User{emailAddress:{emailAddress}}) return n")
|
||||
@Transactional(readOnly = true)
|
||||
User findByAnnotatedQuery(String emailAddress);
|
||||
User findByAnnotatedQuery(@Param("emailAddress") String emailAddress);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user