From badcb6f4eb3ad4ec4dc1a1a0173f7db0b9f2b615 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Sat, 2 Apr 2011 21:41:12 +0200 Subject: [PATCH] performance improvement, caching was not in effect in rel and partial-entitystate --- .../neo4j/fieldaccess/DefaultEntityState.java | 15 ++- .../fieldaccess/NodeEntityStateFactory.java | 14 ++- .../fieldaccess/PartialNodeEntityState.java | 118 +++++++++--------- .../fieldaccess/RelationshipEntityState.java | 52 ++++---- .../RelationshipEntityStateFactory.java | 14 ++- .../relationship/Neo4jRelationshipBacking.aj | 2 - 6 files changed, 121 insertions(+), 94 deletions(-) diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/DefaultEntityState.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/DefaultEntityState.java index 6bae708f7..afdbc5819 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/DefaultEntityState.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/DefaultEntityState.java @@ -21,6 +21,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.data.graph.core.GraphBacked; import java.lang.reflect.Field; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -31,8 +32,8 @@ import java.util.Map; public abstract class DefaultEntityState, STATE> implements EntityState { protected final ENTITY entity; protected final Class type; - private final Map> fieldAccessors; - private final Map>> fieldAccessorListeners; + private final Map> fieldAccessors = new HashMap>(); + private final Map>> fieldAccessorListeners = new HashMap>>(); private STATE state; protected final static Log log= LogFactory.getLog(DefaultEntityState.class); private final FieldAccessorFactoryProviders fieldAccessorFactoryProviders; @@ -42,9 +43,13 @@ public abstract class DefaultEntityState, STAT this.state = underlyingState; this.entity = entity; this.type = type; - fieldAccessorFactoryProviders = delegatingFieldAccessorFactory.accessorFactoriesFor(type); - this.fieldAccessors = fieldAccessorFactoryProviders.getFieldAccessors(); - this.fieldAccessorListeners = fieldAccessorFactoryProviders.getFieldAccessListeners(); + if (delegatingFieldAccessorFactory!=null) { + fieldAccessorFactoryProviders = delegatingFieldAccessorFactory.accessorFactoriesFor(type); + this.fieldAccessors.putAll(fieldAccessorFactoryProviders.getFieldAccessors()); + this.fieldAccessorListeners.putAll(fieldAccessorFactoryProviders.getFieldAccessListeners()); + } else { + fieldAccessorFactoryProviders = null; // todo + } } @Override diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/NodeEntityStateFactory.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/NodeEntityStateFactory.java index bbb41aa47..ab8c84d25 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/NodeEntityStateFactory.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/NodeEntityStateFactory.java @@ -22,6 +22,7 @@ import org.springframework.data.graph.core.NodeBacked; import org.springframework.data.graph.neo4j.repository.DirectGraphRepositoryFactory; import org.springframework.data.graph.neo4j.support.GraphDatabaseContext; +import javax.annotation.PostConstruct; import javax.persistence.EntityManagerFactory; import javax.persistence.PersistenceUnitUtil; @@ -33,12 +34,14 @@ public class NodeEntityStateFactory { private EntityManagerFactory entityManagerFactory; - private NodeDelegatingFieldAccessorFactory nodeDelegatingFieldAccessorFactory; + private NodeDelegatingFieldAccessorFactory nodeDelegatingFieldAccessorFactory; - public EntityState getEntityState(final NodeBacked entity) { + private PartialNodeEntityState.PartialNodeDelegatingFieldAccessorFactory delegatingFieldAccessorFactory; + + public EntityState getEntityState(final NodeBacked entity) { final NodeEntity graphEntityAnnotation = entity.getClass().getAnnotation(NodeEntity.class); // todo cache ?? if (graphEntityAnnotation.partial()) { - final PartialNodeEntityState partialNodeEntityState = new PartialNodeEntityState(null, entity, entity.getClass(), graphDatabaseContext, graphRepositoryFactory,getPersistenceUnitUtils()); + final PartialNodeEntityState partialNodeEntityState = new PartialNodeEntityState(null, entity, entity.getClass(), graphDatabaseContext, getPersistenceUnitUtils(), delegatingFieldAccessorFactory); return new DetachedEntityState(partialNodeEntityState, graphDatabaseContext) { @Override protected boolean isDetached() { @@ -73,4 +76,9 @@ public class NodeEntityStateFactory { public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) { this.entityManagerFactory = entityManagerFactory; } + + @PostConstruct + private void setUp() { + this.delegatingFieldAccessorFactory = new PartialNodeEntityState.PartialNodeDelegatingFieldAccessorFactory(graphDatabaseContext, graphRepositoryFactory); + } } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/PartialNodeEntityState.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/PartialNodeEntityState.java index 989f73e08..2707e900a 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/PartialNodeEntityState.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/PartialNodeEntityState.java @@ -44,62 +44,8 @@ public class PartialNodeEntityState extends DefaultEn private final GraphDatabaseContext graphDatabaseContext; private PersistenceUnitUtil persistenceUnitUtil; - public PartialNodeEntityState(final Node underlyingState, final ENTITY entity, final Class type, final GraphDatabaseContext graphDatabaseContext, final DirectGraphRepositoryFactory graphRepositoryFactory, PersistenceUnitUtil persistenceUnitUtil) { - super(underlyingState, entity, type, new DelegatingFieldAccessorFactory(graphDatabaseContext, graphRepositoryFactory) { - - @Override - protected Collection> createListenerFactories() { - return Arrays.>asList( - new IndexingPropertyFieldAccessorListenerFactory( - getGraphDatabaseContext(), - newPropertyFieldAccessorFactory(), - newConvertingNodePropertyFieldAccessorFactory()) { - @Override - public boolean accept(Field f) { - return f.isAnnotationPresent(GraphProperty.class) && super.accept(f); - } - }, - new JpaIdFieldAccessListenerFactory()); - } - - @Override - protected Collection> createAccessorFactories() { - return Arrays.>asList( - //new IdFieldAccessorFactory(), - //new TransientFieldAccessorFactory(), - newPropertyFieldAccessorFactory(), - newConvertingNodePropertyFieldAccessorFactory(), - new SingleRelationshipFieldAccessorFactory(getGraphDatabaseContext()) { - @Override - public boolean accept(Field f) { - return f.isAnnotationPresent(RelatedTo.class) && super.accept(f); - } - }, - new OneToNRelationshipFieldAccessorFactory(getGraphDatabaseContext()), - new ReadOnlyOneToNRelationshipFieldAccessorFactory(getGraphDatabaseContext()), - new TraversalFieldAccessorFactory(this.graphRepositoryFactory), - new OneToNRelationshipEntityFieldAccessorFactory(getGraphDatabaseContext()) - ); - } - - private ConvertingNodePropertyFieldAccessorFactory newConvertingNodePropertyFieldAccessorFactory() { - return new ConvertingNodePropertyFieldAccessorFactory(getGraphDatabaseContext().getConversionService()) { - @Override - public boolean accept(Field f) { - return f.isAnnotationPresent(GraphProperty.class) && super.accept(f); - } - }; - } - - private PropertyFieldAccessorFactory newPropertyFieldAccessorFactory() { - return new PropertyFieldAccessorFactory(getGraphDatabaseContext().getConversionService()) { - @Override - public boolean accept(Field f) { - return f.isAnnotationPresent(GraphProperty.class) && super.accept(f); - } - }; - } - }); + public PartialNodeEntityState(final Node underlyingState, final ENTITY entity, final Class type, final GraphDatabaseContext graphDatabaseContext, PersistenceUnitUtil persistenceUnitUtil, final PartialNodeDelegatingFieldAccessorFactory delegatingFieldAccessorFactory) { + super(underlyingState, entity, type, delegatingFieldAccessorFactory); this.graphDatabaseContext = graphDatabaseContext; this.persistenceUnitUtil = persistenceUnitUtil; } @@ -163,4 +109,64 @@ public class PartialNodeEntityState extends DefaultEn public Object getId(final Object entity) { return persistenceUnitUtil!=null ? persistenceUnitUtil.getIdentifier(entity) : null; } + + public static class PartialNodeDelegatingFieldAccessorFactory extends DelegatingFieldAccessorFactory { + + public PartialNodeDelegatingFieldAccessorFactory(GraphDatabaseContext graphDatabaseContext, DirectGraphRepositoryFactory graphRepositoryFactory) { + super(graphDatabaseContext, graphRepositoryFactory); + } + + @Override + protected Collection> createListenerFactories() { + return Arrays.>asList( + new IndexingPropertyFieldAccessorListenerFactory( + getGraphDatabaseContext(), + newPropertyFieldAccessorFactory(), + newConvertingNodePropertyFieldAccessorFactory()) { + @Override + public boolean accept(Field f) { + return f.isAnnotationPresent(GraphProperty.class) && super.accept(f); + } + }, + new JpaIdFieldAccessListenerFactory()); + } + + @Override + protected Collection> createAccessorFactories() { + return Arrays.>asList( + //new IdFieldAccessorFactory(), + //new TransientFieldAccessorFactory(), + newPropertyFieldAccessorFactory(), + newConvertingNodePropertyFieldAccessorFactory(), + new SingleRelationshipFieldAccessorFactory(getGraphDatabaseContext()) { + @Override + public boolean accept(Field f) { + return f.isAnnotationPresent(RelatedTo.class) && super.accept(f); + } + }, + new OneToNRelationshipFieldAccessorFactory(getGraphDatabaseContext()), + new ReadOnlyOneToNRelationshipFieldAccessorFactory(getGraphDatabaseContext()), + new TraversalFieldAccessorFactory(this.graphRepositoryFactory), + new OneToNRelationshipEntityFieldAccessorFactory(getGraphDatabaseContext()) + ); + } + + private ConvertingNodePropertyFieldAccessorFactory newConvertingNodePropertyFieldAccessorFactory() { + return new ConvertingNodePropertyFieldAccessorFactory(getGraphDatabaseContext().getConversionService()) { + @Override + public boolean accept(Field f) { + return f.isAnnotationPresent(GraphProperty.class) && super.accept(f); + } + }; + } + + private PropertyFieldAccessorFactory newPropertyFieldAccessorFactory() { + return new PropertyFieldAccessorFactory(getGraphDatabaseContext().getConversionService()) { + @Override + public boolean accept(Field f) { + return f.isAnnotationPresent(GraphProperty.class) && super.accept(f); + } + }; + } + } } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/RelationshipEntityState.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/RelationshipEntityState.java index 763f156cf..383b84fbf 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/RelationshipEntityState.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/RelationshipEntityState.java @@ -34,32 +34,9 @@ public class RelationshipEntityState extends private final GraphDatabaseContext graphDatabaseContext; - private final DirectGraphRepositoryFactory graphRepositoryFactory; - - public RelationshipEntityState(final Relationship underlyingState, final ENTITY entity, final Class type, final GraphDatabaseContext graphDatabaseContext, final DirectGraphRepositoryFactory graphRepositoryFactory) { - super(underlyingState, entity, type, new DelegatingFieldAccessorFactory(graphDatabaseContext, graphRepositoryFactory) { - @Override - protected Collection> createListenerFactories() { - return Arrays.>asList( - new IndexingPropertyFieldAccessorListenerFactory( - graphDatabaseContext, - new PropertyFieldAccessorFactory(graphDatabaseContext.getConversionService()), - new ConvertingNodePropertyFieldAccessorFactory(graphDatabaseContext.getConversionService()) - )); - } - - @Override - protected Collection> createAccessorFactories() { - return Arrays.>asList( - new TransientFieldAccessorFactory(), - new RelationshipNodeFieldAccessorFactory(graphDatabaseContext), - new PropertyFieldAccessorFactory(graphDatabaseContext.getConversionService()), - new ConvertingNodePropertyFieldAccessorFactory(graphDatabaseContext.getConversionService()) - ); - } - }); + public RelationshipEntityState(final Relationship underlyingState, final ENTITY entity, final Class type, final GraphDatabaseContext graphDatabaseContext, final DirectGraphRepositoryFactory graphRepositoryFactory, final RelationshipStateDelegatingFieldAccessorFactory delegatingFieldAccessorFactory) { + super(underlyingState, entity, type, delegatingFieldAccessorFactory); this.graphDatabaseContext = graphDatabaseContext; - this.graphRepositoryFactory = graphRepositoryFactory; } @Override @@ -89,4 +66,29 @@ public class RelationshipEntityState extends return entity; } + public static class RelationshipStateDelegatingFieldAccessorFactory extends DelegatingFieldAccessorFactory { + public RelationshipStateDelegatingFieldAccessorFactory(GraphDatabaseContext graphDatabaseContext, DirectGraphRepositoryFactory graphRepositoryFactory) { + super(graphDatabaseContext, graphRepositoryFactory); + } + + @Override + protected Collection> createListenerFactories() { + return Arrays.>asList( + new IndexingPropertyFieldAccessorListenerFactory( + graphDatabaseContext, + new PropertyFieldAccessorFactory(graphDatabaseContext.getConversionService()), + new ConvertingNodePropertyFieldAccessorFactory(graphDatabaseContext.getConversionService()) + )); + } + + @Override + protected Collection> createAccessorFactories() { + return Arrays.>asList( + new TransientFieldAccessorFactory(), + new RelationshipNodeFieldAccessorFactory(graphDatabaseContext), + new PropertyFieldAccessorFactory(graphDatabaseContext.getConversionService()), + new ConvertingNodePropertyFieldAccessorFactory(graphDatabaseContext.getConversionService()) + ); + } + } } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/RelationshipEntityStateFactory.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/RelationshipEntityStateFactory.java index bb84be016..eed28cced 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/RelationshipEntityStateFactory.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/RelationshipEntityStateFactory.java @@ -21,14 +21,17 @@ import org.springframework.data.graph.core.RelationshipBacked; import org.springframework.data.graph.neo4j.repository.DirectGraphRepositoryFactory; import org.springframework.data.graph.neo4j.support.GraphDatabaseContext; +import javax.annotation.PostConstruct; + public class RelationshipEntityStateFactory { private GraphDatabaseContext graphDatabaseContext; - private DirectGraphRepositoryFactory graphRepositoryFactory; + private DirectGraphRepositoryFactory graphRepositoryFactory; + private RelationshipEntityState.RelationshipStateDelegatingFieldAccessorFactory delegatingFieldAccessorFactory; - public EntityState getEntityState(final RelationshipBacked entity) { - return new RelationshipEntityState(null,entity,entity.getClass(), graphDatabaseContext, graphRepositoryFactory); + public EntityState getEntityState(final RelationshipBacked entity) { + return new RelationshipEntityState(null,entity,entity.getClass(), graphDatabaseContext, graphRepositoryFactory, delegatingFieldAccessorFactory); } public void setGraphDatabaseContext(GraphDatabaseContext graphDatabaseContext) { @@ -39,4 +42,9 @@ public class RelationshipEntityStateFactory { this.graphRepositoryFactory = graphRepositoryFactory; } + @PostConstruct + private void setUp() { + this.delegatingFieldAccessorFactory = new RelationshipEntityState.RelationshipStateDelegatingFieldAccessorFactory(graphDatabaseContext, graphRepositoryFactory); + } + } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/support/relationship/Neo4jRelationshipBacking.aj b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/support/relationship/Neo4jRelationshipBacking.aj index eaf3725fc..86889c12c 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/support/relationship/Neo4jRelationshipBacking.aj +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/support/relationship/Neo4jRelationshipBacking.aj @@ -41,8 +41,6 @@ public aspect Neo4jRelationshipBacking { protected final Log log = LogFactory.getLog(getClass()); declare parents : (@RelationshipEntity *) implements RelationshipBacked; - declare @type: RelationshipBacked+: @Configurable; - protected pointcut entityFieldGet(RelationshipBacked entity) : get(* RelationshipBacked+.*) &&