From e2422b42d44ecf43aae70d3f8dfd6cead437a1a0 Mon Sep 17 00:00:00 2001 From: Michael Hunger Date: Tue, 11 Jan 2011 14:09:09 +0100 Subject: [PATCH] parametrized index name from either Annotation or usecase --- ...NodePropertyFieldAccessorListenerFactory.java | 8 ++++++-- .../PartialNodeEntityStateAccessors.java | 7 ++++--- .../data/graph/neo4j/finder/Finder.java | 12 ++++++++---- .../neo4j/support/GraphDatabaseContext.java | 16 ++++++++++++---- .../neo4j/support/Neo4jGraphPersistenceTest.java | 16 ++++++++-------- 5 files changed, 38 insertions(+), 21 deletions(-) diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/IndexingNodePropertyFieldAccessorListenerFactory.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/IndexingNodePropertyFieldAccessorListenerFactory.java index 2091a5aa7..eea3e3ff7 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/IndexingNodePropertyFieldAccessorListenerFactory.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/IndexingNodePropertyFieldAccessorListenerFactory.java @@ -29,7 +29,7 @@ import java.lang.reflect.Field; class IndexingNodePropertyFieldAccessorListenerFactory implements FieldAccessorListenerFactory { - private final GraphDatabaseContext graphDatabaseContext; + private final GraphDatabaseContext graphDatabaseContext; private final PropertyFieldAccessorFactory propertyFieldAccessorFactory; private final ConvertingNodePropertyFieldAccessorFactory convertingNodePropertyFieldAccessorFactory; @@ -64,7 +64,11 @@ class IndexingNodePropertyFieldAccessorListenerFactory implements FieldAccessorL private String getIndexName(Field field) { Indexed indexed = field.getAnnotation(Indexed.class); - return indexed != null ? indexed.name() : null; + return hasIndexName(indexed) ? indexed.name() : null; + } + + private boolean hasIndexName(Indexed indexed) { + return indexed!=null && !indexed.name().isEmpty(); } /** diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/PartialNodeEntityStateAccessors.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/PartialNodeEntityStateAccessors.java index 7ac4da1ce..fe1688737 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/PartialNodeEntityStateAccessors.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/fieldaccess/PartialNodeEntityStateAccessors.java @@ -37,7 +37,8 @@ import java.util.Collection; public class PartialNodeEntityStateAccessors extends DefaultEntityStateAccessors { public static final String FOREIGN_ID = "foreignId"; - + public static final String FOREIGN_ID_INDEX = "foreign_id"; + private final GraphDatabaseContext graphDatabaseContext; public PartialNodeEntityStateAccessors(final Node underlyingState, final ENTITY entity, final Class type, final GraphDatabaseContext graphDatabaseContext, final FinderFactory finderFactory) { @@ -107,7 +108,7 @@ public class PartialNodeEntityStateAccessors extends final Object id = getId(entity,type); if (id == null) return; final String foreignId = createForeignId(id); - Node node = graphDatabaseContext.getSingleIndexedNode("node", FOREIGN_ID, foreignId); + Node node = graphDatabaseContext.getSingleIndexedNode(FOREIGN_ID_INDEX, FOREIGN_ID, foreignId); if (node == null) { node = graphDatabaseContext.createNode(); persistForeignId(node, id); @@ -128,7 +129,7 @@ public class PartialNodeEntityStateAccessors extends if (!node.hasProperty(FOREIGN_ID) && id != null) { final String foreignId = createForeignId(id); node.setProperty(FOREIGN_ID, id); - graphDatabaseContext.index("node", node, FOREIGN_ID, foreignId); + graphDatabaseContext.index(FOREIGN_ID_INDEX, node, FOREIGN_ID, foreignId); } } diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/finder/Finder.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/finder/Finder.java index 9110a7977..4537e6fcd 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/finder/Finder.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/finder/Finder.java @@ -74,13 +74,15 @@ public class Finder { /** * Index based single finder. + * + * @param indexName or null for default * @param property * @param value * @return Single Node Entity with this property and value */ - public T findByPropertyValue(final String property, final Object value) { + public T findByPropertyValue(final String indexName, final String property, final Object value) { try { - final Node node = graphDatabaseContext.getSingleIndexedNode("node", property, value); + final Node node = graphDatabaseContext.getSingleIndexedNode(indexName, property, value); if (node == null) return null; return graphDatabaseContext.createEntityFromState(node, clazz); } catch (NotFoundException e) { @@ -91,13 +93,15 @@ public class Finder { /** * Index based finder. + * + * @param indexName or null for default index * @param property * @param value * @return Iterable over Node Entities with this property and value */ - public Iterable findAllByPropertyValue(final String property, final Object value) { + public Iterable findAllByPropertyValue(final String indexName, final String property, final Object value) { try { - final IndexHits nodes = graphDatabaseContext.getIndexedNodes("node", property, value); + final IndexHits nodes = graphDatabaseContext.getIndexedNodes(indexName, property, value); if (nodes == null) return Collections.emptyList(); return new IterableWrapper(nodes) { @Override diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/support/GraphDatabaseContext.java b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/support/GraphDatabaseContext.java index ddb0ede6b..2b39e6386 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/support/GraphDatabaseContext.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/graph/neo4j/support/GraphDatabaseContext.java @@ -47,6 +47,8 @@ import javax.transaction.TransactionManager; */ public class GraphDatabaseContext { + public static final String DEFAULT_NODE_INDEX_NAME = "node"; + private GraphDatabaseService graphDatabaseService; public EntityInstantiator graphEntityInstantiator; @@ -120,7 +122,13 @@ public class GraphDatabaseContext { } private Index getNodeIndex(final String indexName) { - return getIndexManager().forNodes(indexName); + String indexNameToUse = indexNameOrDefault(indexName); + // checkValidIndex(indexNameToUse); // check invalid index names + return getIndexManager().forNodes(indexNameToUse); + } + + private String indexNameOrDefault(String indexName) { + return indexName==null ? DEFAULT_NODE_INDEX_NAME : indexName; // todo take from neo4j config } public Node getSingleIndexedNode(final String indexName, final String property, final Object value) { @@ -175,7 +183,7 @@ public class GraphDatabaseContext { } public void removeIndex(final String indexName, final String propName) { - removeIndex(indexName, null,propName); + removeIndex(indexName, null, propName); } public void index(final String indexName, final Node node, final String propName, final Object newVal) { @@ -183,11 +191,11 @@ public class GraphDatabaseContext { } public boolean canConvert(final Class from, final Class to) { - return conversionService.canConvert(from,to); + return conversionService.canConvert(from, to); } public T convert(final Object value, final Class type) { - return conversionService.convert(value,type); + return conversionService.convert(value, type); } public Iterable getAllNodes() { diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/graph/neo4j/support/Neo4jGraphPersistenceTest.java b/spring-data-neo4j/src/test/java/org/springframework/data/graph/neo4j/support/Neo4jGraphPersistenceTest.java index 1519ea7cb..a433d28c9 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/graph/neo4j/support/Neo4jGraphPersistenceTest.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/graph/neo4j/support/Neo4jGraphPersistenceTest.java @@ -369,7 +369,7 @@ public class Neo4jGraphPersistenceTest { Person spouse = new Person("Tina", 36); me.setSpouse(spouse); final Finder personFinder = finderFactory.getFinderForClass(Person.class); - final Person foundMe = personFinder.findByPropertyValue("Person.name", "Michael"); + final Person foundMe = personFinder.findByPropertyValue(null, "Person.name", "Michael"); assertEquals(spouse,foundMe.getSpouse()); } @@ -431,7 +431,7 @@ public class Neo4jGraphPersistenceTest { group.setName("test"); final Finder finder = finderFactory.getFinderForClass(Group.class); graphDatabaseContext.removeIndex("node", group.getUnderlyingState(), "name"); - final Group found = finder.findByPropertyValue("name", "test"); + final Group found = finder.findByPropertyValue(null, "name", "test"); assertNull("Group.name removed from index", found); } @@ -441,7 +441,7 @@ public class Neo4jGraphPersistenceTest { Group group = new Group(); group.setName("test"); final Finder finder = finderFactory.getFinderForClass(Group.class); - final Group found = finder.findByPropertyValue("name", "test"); + final Group found = finder.findByPropertyValue(null, "name", "test"); assertEquals(group,found); } @Test @@ -450,7 +450,7 @@ public class Neo4jGraphPersistenceTest { Group group = new Group(); group.setUnindexedName("value-unindexedName"); final Finder finder = finderFactory.getFinderForClass(Group.class); - final Group found = finder.findByPropertyValue("unindexedName", "value-unindexedName"); + final Group found = finder.findByPropertyValue(null, "unindexedName", "value-unindexedName"); assertNull(found); } @Test @@ -459,7 +459,7 @@ public class Neo4jGraphPersistenceTest { Group group = new Group(); group.setUnindexedName2("value-unindexedName2"); final Finder finder = finderFactory.getFinderForClass(Group.class); - final Group found = finder.findByPropertyValue("unindexedName2", "value-unindexedName2"); + final Group found = finder.findByPropertyValue(null, "unindexedName2", "value-unindexedName2"); assertNull(found); } @@ -471,7 +471,7 @@ public class Neo4jGraphPersistenceTest { Group group2 = new Group(); group2.setName("test"); final Finder finder = finderFactory.getFinderForClass(Group.class); - final Iterable found = finder.findAllByPropertyValue("name", "test"); + final Iterable found = finder.findAllByPropertyValue(null, "name", "test"); final Collection result = IteratorUtil.addToCollection(found.iterator(), new HashSet()); assertEquals(new HashSet(Arrays.asList(group,group2)), result); } @@ -481,7 +481,7 @@ public class Neo4jGraphPersistenceTest { public void testFindAllPersonByIndexOnAnnotatedField() { Person person = new Person("Michael",35); final Finder finder = finderFactory.getFinderForClass(Person.class); - final Person found = finder.findByPropertyValue("Person.name", "Michael"); + final Person found = finder.findByPropertyValue(null, "Person.name", "Michael"); assertEquals(person, found); } @@ -491,7 +491,7 @@ public class Neo4jGraphPersistenceTest { Person person = new Person("Michael", 35); person.setNickname("Mike"); final Finder finder = finderFactory.getFinderForClass(Person.class); - final Person found = finder.findByPropertyValue("Person.nickname", "Mike"); + final Person found = finder.findByPropertyValue(null, "Person.nickname", "Mike"); assertEquals(person, found); }