From fe0165238db723f0dc9d09ee206984a2ed4e828e Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Tue, 22 Feb 2011 17:21:13 +0100 Subject: [PATCH] introduced iteration control for neo4j template to cover non-lazy result iteration --- .../neo4j/template/IterationController.java | 12 ++++++ .../graph/neo4j/template/Neo4jTemplate.java | 38 ++++++++++++++++--- .../data/graph/neo4j/template/PathMapper.java | 8 +++- .../neo4j/template/NeoTraversalTest.java | 2 +- 4 files changed, 52 insertions(+), 8 deletions(-) create mode 100644 spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/template/IterationController.java diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/template/IterationController.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/template/IterationController.java new file mode 100644 index 000000000..5b5f1d136 --- /dev/null +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/template/IterationController.java @@ -0,0 +1,12 @@ +package org.springframework.data.graph.neo4j.template; + +/** +* @author mh +* @since 22.02.11 +*/ +public interface IterationController { + public enum IterationControl { + LAZY, EAGER, EAGER_STOP_ON_NULL + } + IterationControl iterateAs(); +} diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/template/Neo4jTemplate.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/template/Neo4jTemplate.java index c25a9da63..c40d9edc8 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/template/Neo4jTemplate.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/template/Neo4jTemplate.java @@ -25,8 +25,12 @@ import org.neo4j.helpers.collection.IterableWrapper; import org.springframework.dao.DataAccessException; import org.springframework.dao.InvalidDataAccessApiUsageException; +import java.util.ArrayList; +import java.util.List; import java.util.Map; +import static org.springframework.data.graph.neo4j.template.IterationController.IterationControl.EAGER_STOP_ON_NULL; + public class Neo4jTemplate implements Neo4jOperations { private final GraphDatabaseService graphDatabaseService; @@ -214,12 +218,34 @@ public class Neo4jTemplate implements Neo4jOperations { private Iterable mapPaths(final Iterable paths, final PathMapper pathMapper) { assert paths != null; assert pathMapper != null; - return new IterableWrapper(paths) { - @Override - protected T underlyingObjectToObject(Path path) { - return pathMapper.mapPath(path); - } - }; + IterationController.IterationControl control = getIterationControl(pathMapper); + switch (control) { + case EAGER: + case EAGER_STOP_ON_NULL: + List result=new ArrayList(); + for (Path path : paths) { + T mapped = pathMapper.mapPath(path); + if (mapped==null && control== EAGER_STOP_ON_NULL) break; + result.add(mapped); + } + return result; + case LAZY: + return new IterableWrapper(paths) { + @Override + protected T underlyingObjectToObject(Path path) { + return pathMapper.mapPath(path); + } + }; + default: throw new IllegalStateException("Unknown IterationControl "+control); + } + } + + private IterationController.IterationControl getIterationControl(PathMapper pathMapper) { + if (pathMapper instanceof IterationController) { + IterationController.IterationControl result = ((IterationController) pathMapper).iterateAs(); + if (result!=null) return result; + } + return IterationController.IterationControl.LAZY; } @Override diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/template/PathMapper.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/template/PathMapper.java index 37b63cae1..d194ab05b 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/template/PathMapper.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/template/PathMapper.java @@ -7,9 +7,10 @@ import org.neo4j.graphdb.Path; * @since 19.02.11 */ public interface PathMapper { + T mapPath(Path path); - public abstract class WithoutResult implements PathMapper{ + public abstract class WithoutResult implements PathMapper, IterationController{ public abstract void eachPath(Path path); @Override @@ -17,5 +18,10 @@ public interface PathMapper { eachPath(path); return null; } + + @Override + public IterationControl iterateAs() { + return IterationController.IterationControl.EAGER; + } } } diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/graph/neo4j/template/NeoTraversalTest.java b/spring-data-neo4j/src/test/java/org/springframework/data/graph/neo4j/template/NeoTraversalTest.java index a329a5434..5d82e0fef 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/graph/neo4j/template/NeoTraversalTest.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/graph/neo4j/template/NeoTraversalTest.java @@ -38,7 +38,7 @@ public class NeoTraversalTest extends NeoApiTest { String nodeName = (String) path.endNode().getProperty("name", ""); resultSet.add(nodeName); } - }, Traversal.description().filter(returnAllButStartNode()).relationships(HAS)); + }, Traversal.description().relationships(HAS).filter(returnAllButStartNode()).prune(Traversal.pruneAfterDepth(2))); assertEquals("all members", new HashSet(asList("grandpa", "grandma", "daughter", "son", "man", "wife", "family")), resultSet); }