fixed bug with lazy evaluation and non-returning PathMapper (i.e PathCallbackHandler)
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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 <T> Iterable<T> mapPaths(final Iterable<Path> paths, final PathMapper<T> pathMapper) {
|
||||
assert paths != null;
|
||||
assert pathMapper != null;
|
||||
IterationController.IterationControl control = getIterationControl(pathMapper);
|
||||
switch (control) {
|
||||
case EAGER:
|
||||
case EAGER_STOP_ON_NULL:
|
||||
List<T> result=new ArrayList<T>();
|
||||
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<T, Path>(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 <T> IterationController.IterationControl getIterationControl(PathMapper<T> pathMapper) {
|
||||
if (pathMapper instanceof IterationController) {
|
||||
IterationController.IterationControl result = ((IterationController) pathMapper).iterateAs();
|
||||
if (result!=null) return result;
|
||||
}
|
||||
return IterationController.IterationControl.LAZY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> Iterable<T> traverseNext(Node startNode, final PathMapper<T> pathMapper, RelationshipType relationshipType, Direction direction) {
|
||||
|
||||
@@ -20,8 +20,8 @@ public interface PathMapper<T> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public IterationControl iterateAs() {
|
||||
return IterationController.IterationControl.EAGER;
|
||||
public IterationMode getIterationMode() {
|
||||
return IterationMode.EAGER;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
<T> Iterable<T> mapPaths(final Iterable<Path> paths, final PathMapper<T> pathMapper) {
|
||||
assert paths != null;
|
||||
assert pathMapper != null;
|
||||
IterationController.IterationMode mode = getIterationControl(pathMapper);
|
||||
switch (mode) {
|
||||
case EAGER:
|
||||
case EAGER_STOP_ON_NULL:
|
||||
List<T> result = new ArrayList<T>();
|
||||
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<T, Path>(paths) {
|
||||
@Override
|
||||
protected T underlyingObjectToObject(Path path) {
|
||||
return pathMapper.mapPath(path);
|
||||
}
|
||||
};
|
||||
default:
|
||||
throw new IllegalStateException("Unknown IterationControl " + mode);
|
||||
}
|
||||
}
|
||||
|
||||
private <T> IterationController.IterationMode getIterationControl(PathMapper<T> pathMapper) {
|
||||
if (pathMapper instanceof IterationController) {
|
||||
IterationController.IterationMode result = ((IterationController) pathMapper).getIterationMode();
|
||||
if (result != null) return result;
|
||||
}
|
||||
return IterationController.IterationMode.LAZY;
|
||||
}
|
||||
}
|
||||
@@ -143,25 +143,23 @@
|
||||
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="jpaTransactionManager">
|
||||
<property name="entityManagerFactory" ref="entityManagerFactory"/>
|
||||
</bean>
|
||||
<!--bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
|
||||
<property name="dataSource" ref="dataSource"/>
|
||||
</bean-->
|
||||
<bean
|
||||
class="org.springframework.transaction.jta.JtaTransactionManager">
|
||||
<property name="transactionManager" ref="neo4jTransactionManagerService" />
|
||||
<property name="userTransaction" ref="neo4jUserTransactionService" />
|
||||
<property name="transactionManager">
|
||||
<bean class="org.neo4j.kernel.impl.transaction.SpringTransactionManager">
|
||||
<constructor-arg ref="graphDatabaseService" />
|
||||
</bean>
|
||||
</property>
|
||||
<property name="userTransaction">
|
||||
<bean class="org.neo4j.kernel.impl.transaction.UserTransactionImpl">
|
||||
<constructor-arg ref="graphDatabaseService" />
|
||||
</bean>
|
||||
</property>
|
||||
</bean>
|
||||
</list>
|
||||
</constructor-arg>
|
||||
</bean>
|
||||
|
||||
<bean id="neo4jTransactionManagerService" class="org.neo4j.kernel.impl.transaction.SpringTransactionManager" >
|
||||
<constructor-arg index="0" ref="graphDatabaseService" />
|
||||
</bean>
|
||||
|
||||
<bean id="neo4jUserTransactionService" class="org.neo4j.kernel.impl.transaction.UserTransactionImpl">
|
||||
<constructor-arg index="0" ref="graphDatabaseService" />
|
||||
</bean>
|
||||
|
||||
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
|
||||
<property name="driverClassName" value="${database.driverClassName}"/>
|
||||
|
||||
@@ -16,12 +16,11 @@
|
||||
|
||||
<context:annotation-config />
|
||||
<context:spring-configured/>
|
||||
<bean id="jotm" class="org.springframework.data.graph.neo4j.transaction.JotmFactoryBean">
|
||||
<!--property name="jotmHome" value="target/classes/jotm"/-->
|
||||
</bean>
|
||||
|
||||
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
|
||||
<property name="transactionManager" ref="jotm"/>
|
||||
<property name="transactionManager">
|
||||
<bean id="jotm" class="org.springframework.data.graph.neo4j.transaction.JotmFactoryBean"/>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<bean class="org.neo4j.kernel.EmbeddedGraphDatabase" destroy-method="shutdown">
|
||||
|
||||
Reference in New Issue
Block a user