From c88023973ee6eeb268f2bfce2719d4ad83734b50 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Tue, 22 Feb 2011 23:22:16 +0100 Subject: [PATCH] fixed bug with lazy evaluation and non-returning PathMapper (i.e PathCallbackHandler) --- .../neo4j/template/IterationController.java | 4 +- .../graph/neo4j/template/Neo4jTemplate.java | 32 +----------- .../data/graph/neo4j/template/PathMapper.java | 4 +- .../neo4j/template/PathMappingIterator.java | 49 +++++++++++++++++++ .../Neo4jGraphRecommendationTest-context.xml | 22 ++++----- .../test/resources/spring-tx-text-context.xml | 7 ++- 6 files changed, 68 insertions(+), 50 deletions(-) create mode 100644 spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/template/PathMappingIterator.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 index 5b5f1d136..f77c6ff11 100644 --- 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 @@ -5,8 +5,8 @@ package org.springframework.data.graph.neo4j.template; * @since 22.02.11 */ public interface IterationController { - public enum IterationControl { + public enum IterationMode { LAZY, EAGER, EAGER_STOP_ON_NULL } - IterationControl iterateAs(); + IterationMode getIterationMode(); } 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 c40d9edc8..eb5690389 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 @@ -29,7 +29,7 @@ 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; +import static org.springframework.data.graph.neo4j.template.IterationController.IterationMode.EAGER_STOP_ON_NULL; public class Neo4jTemplate implements Neo4jOperations { @@ -216,37 +216,9 @@ public class Neo4jTemplate implements Neo4jOperations { } private Iterable mapPaths(final Iterable paths, final PathMapper pathMapper) { - assert paths != null; - assert pathMapper != null; - 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); - } + return new PathMappingIterator().mapPaths(paths,pathMapper); } - 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 public Iterable traverseNext(Node startNode, final PathMapper pathMapper, RelationshipType relationshipType, Direction direction) { 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 d194ab05b..95d703eea 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 @@ -20,8 +20,8 @@ public interface PathMapper { } @Override - public IterationControl iterateAs() { - return IterationController.IterationControl.EAGER; + public IterationMode getIterationMode() { + return IterationMode.EAGER; } } } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/template/PathMappingIterator.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/template/PathMappingIterator.java new file mode 100644 index 000000000..b1005dae4 --- /dev/null +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/template/PathMappingIterator.java @@ -0,0 +1,49 @@ +package org.springframework.data.graph.neo4j.template; + +import org.neo4j.graphdb.Path; +import org.neo4j.helpers.collection.IterableWrapper; + +import java.util.ArrayList; +import java.util.List; + +import static org.springframework.data.graph.neo4j.template.IterationController.IterationMode.EAGER_STOP_ON_NULL; + +/** + * @author mh + * @since 22.02.11 + */ +public class PathMappingIterator { + Iterable mapPaths(final Iterable paths, final PathMapper pathMapper) { + assert paths != null; + assert pathMapper != null; + IterationController.IterationMode mode = getIterationControl(pathMapper); + switch (mode) { + case EAGER: + case EAGER_STOP_ON_NULL: + List result = new ArrayList(); + for (Path path : paths) { + T mapped = pathMapper.mapPath(path); + if (mapped == null && mode == 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 " + mode); + } + } + + private IterationController.IterationMode getIterationControl(PathMapper pathMapper) { + if (pathMapper instanceof IterationController) { + IterationController.IterationMode result = ((IterationController) pathMapper).getIterationMode(); + if (result != null) return result; + } + return IterationController.IterationMode.LAZY; + } +} diff --git a/spring-data-neo4j/src/test/resources/org/springframework/data/graph/neo4j/partial/Neo4jGraphRecommendationTest-context.xml b/spring-data-neo4j/src/test/resources/org/springframework/data/graph/neo4j/partial/Neo4jGraphRecommendationTest-context.xml index 7569fb632..847833ad3 100644 --- a/spring-data-neo4j/src/test/resources/org/springframework/data/graph/neo4j/partial/Neo4jGraphRecommendationTest-context.xml +++ b/spring-data-neo4j/src/test/resources/org/springframework/data/graph/neo4j/partial/Neo4jGraphRecommendationTest-context.xml @@ -143,25 +143,23 @@ - - - + + + + + + + + + + - - - - - - - diff --git a/spring-data-neo4j/src/test/resources/spring-tx-text-context.xml b/spring-data-neo4j/src/test/resources/spring-tx-text-context.xml index abf7dccf6..a31f4b63d 100644 --- a/spring-data-neo4j/src/test/resources/spring-tx-text-context.xml +++ b/spring-data-neo4j/src/test/resources/spring-tx-text-context.xml @@ -16,12 +16,11 @@ - - - - + + +