fixed bug with lazy evaluation and non-returning PathMapper (i.e PathCallbackHandler)

This commit is contained in:
Michael Hunger
2011-02-22 23:22:16 +01:00
parent fe0165238d
commit c88023973e
6 changed files with 68 additions and 50 deletions

View File

@@ -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();
}

View File

@@ -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) {

View File

@@ -20,8 +20,8 @@ public interface PathMapper<T> {
}
@Override
public IterationControl iterateAs() {
return IterationController.IterationControl.EAGER;
public IterationMode getIterationMode() {
return IterationMode.EAGER;
}
}
}

View File

@@ -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;
}
}

View File

@@ -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}"/>

View File

@@ -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">