From 635e156bc0ddd00ea6845d577ccb01c11466844c Mon Sep 17 00:00:00 2001 From: Jon Brisbin Date: Fri, 25 Mar 2011 13:52:53 -0500 Subject: [PATCH] JIRA: DATADOC-70: Trying to fix problem with indexes being wiped out in the tests, trying to make sure indexes get created properly. Now tests do not wipe out database automatically. --- .gitignore | 1 + .../config/MongoMappingConverterParser.java | 12 ++--- .../mongodb/mapping/MongoMappingContext.java | 4 +- .../MongoPersistentEntityIndexCreator.java | 51 ++++++++----------- .../mongodb/mapping/MappingTests.java | 47 ++++++++--------- 5 files changed, 51 insertions(+), 64 deletions(-) diff --git a/.gitignore b/.gitignore index d5826a45e..336aca2b7 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ target .project .classpath src/ant/.ant-targets-upload-dist.xml +atlassian-ide-plugin.xml diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoMappingConverterParser.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoMappingConverterParser.java index 7c7c82068..5dcc67b56 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoMappingConverterParser.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/MongoMappingConverterParser.java @@ -45,7 +45,7 @@ import org.w3c.dom.Element; public class MongoMappingConverterParser extends AbstractBeanDefinitionParser { static final String MAPPING_CONTEXT = "mappingContext"; - private static final String MAPPING_CONFIGURATION_HELPER = "mappingConfigurationHelper"; + private static final String INDEX_HELPER = "indexCreationHelper"; private static final String TEMPLATE = "mongoTemplate"; private static final String BASE_PACKAGE = "base-package"; @@ -85,13 +85,13 @@ public class MongoMappingConverterParser extends AbstractBeanDefinitionParser { converterBuilder.addPropertyReference("mongo", StringUtils.hasText(mongoRef) ? mongoRef : "mongo"); try { - registry.getBeanDefinition(MAPPING_CONFIGURATION_HELPER); + registry.getBeanDefinition(INDEX_HELPER); } catch (NoSuchBeanDefinitionException ignored) { String templateRef = element.getAttribute("mongo-template-ref"); - BeanDefinitionBuilder mappingConfigHelperBuilder = BeanDefinitionBuilder.genericBeanDefinition(MongoPersistentEntityIndexCreator.class); - mappingConfigHelperBuilder.addConstructorArgValue(new RuntimeBeanReference(ctxRef)); - mappingConfigHelperBuilder.addConstructorArgValue(new RuntimeBeanReference(StringUtils.hasText(templateRef) ? templateRef : TEMPLATE)); - registry.registerBeanDefinition(MAPPING_CONFIGURATION_HELPER, mappingConfigHelperBuilder.getBeanDefinition()); + BeanDefinitionBuilder indexHelperBuilder = BeanDefinitionBuilder.genericBeanDefinition(MongoPersistentEntityIndexCreator.class); + indexHelperBuilder.addConstructorArgValue(new RuntimeBeanReference(ctxRef)); + indexHelperBuilder.addConstructorArgValue(new RuntimeBeanReference(StringUtils.hasText(templateRef) ? templateRef : TEMPLATE)); + registry.registerBeanDefinition(INDEX_HELPER, indexHelperBuilder.getBeanDefinition()); } return converterBuilder.getBeanDefinition(); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoMappingContext.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoMappingContext.java index 2766b3a03..decccca73 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoMappingContext.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoMappingContext.java @@ -35,7 +35,7 @@ import org.springframework.data.util.TypeInformation; * @author Jon Brisbin */ public class MongoMappingContext extends BasicMappingContext { - + public MongoMappingContext() { augmentSimpleTypes(); } @@ -67,7 +67,7 @@ public class MongoMappingContext extends BasicMappingContext { @Override public BasicPersistentProperty createPersistentProperty(Field field, PropertyDescriptor descriptor, - TypeInformation information) throws MappingConfigurationException { + TypeInformation information) throws MappingConfigurationException { return new MongoPersistentProperty(field, descriptor, information); } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoPersistentEntityIndexCreator.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoPersistentEntityIndexCreator.java index f2150192f..a8ba4c84b 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoPersistentEntityIndexCreator.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoPersistentEntityIndexCreator.java @@ -18,8 +18,6 @@ package org.springframework.data.document.mongodb.mapping; import java.lang.reflect.Field; import java.util.Collections; -import java.util.HashMap; -import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -46,40 +44,38 @@ import org.springframework.util.Assert; /** * Component that inspects {@link MongoPersistentEntity} instances contained in the given {@link MongoMappingContext} * for indexing metadata and ensures the indexes to be available. - * + * * @author Jon Brisbin * @author Oliver Gierke */ -public class MongoPersistentEntityIndexCreator implements ApplicationListener{ +public class MongoPersistentEntityIndexCreator implements ApplicationListener { private static final Logger log = LoggerFactory.getLogger(MongoPersistentEntityIndexCreator.class); - private Map compoundIndexes = new HashMap(); - private Map fieldIndexes = new HashMap(); private Set> classesSeen = Collections.newSetFromMap(new ConcurrentHashMap, Boolean>()); - + private final MongoTemplate mongoTemplate; public MongoPersistentEntityIndexCreator(MongoMappingContext mappingContext, MongoTemplate mongoTemplate) { - + Assert.notNull(mongoTemplate); Assert.notNull(mappingContext); this.mongoTemplate = mongoTemplate; - + for (MongoPersistentEntity entity : mappingContext.getPersistentEntities()) { checkForIndexes(entity); } } - + /* (non-Javadoc) - * @see org.springframework.context.ApplicationListener#onApplicationEvent(org.springframework.context.ApplicationEvent) - */ + * @see org.springframework.context.ApplicationListener#onApplicationEvent(org.springframework.context.ApplicationEvent) + */ public void onApplicationEvent(MappingContextEvent event) { checkForIndexes((MongoPersistentEntity) event.getPersistentEntity()); } protected void checkForIndexes(MongoPersistentEntity entity) { - Class type = entity.getType(); + final Class type = entity.getType(); if (!classesSeen.contains(type)) { if (log.isDebugEnabled()) { log.debug("Analyzing class " + type + " for index information."); @@ -102,12 +98,9 @@ public class MongoPersistentEntityIndexCreator implements ApplicationListener result = template.find(new Query(Criteria.where("_id").is(p.getId())), PersonPojo.class); + List result = template.find(new Query(Criteria.where("ssn").is(12345)), PersonPojo.class); assertThat(result.size(), is(1)); assertThat(result.get(0).getSsn(), is(12345)); } @@ -141,14 +119,29 @@ public class MappingTests { template.save("person", p); assertNotNull(p.getId()); - } - @Test - public void testReadEntity() { List result = template.find(new Query(Criteria.where("ssn").is(123456789)), Person.class); assertThat(result.size(), is(1)); assertThat(result.get(0).getAddress().getCountry(), is("USA")); assertThat(result.get(0).getAccounts(), notNullValue()); } + @Test + public void testUniqueIndex() { + Address addr = new Address(); + addr.setLines(new String[]{"1234 W. 1st Street", "Apt. 12"}); + addr.setCity("Anytown"); + addr.setPostalCode(12345); + addr.setCountry("USA"); + + Person p1 = new Person(1234567890, "John", "Doe", 37, addr); + Person p2 = new Person(1234567890, "John", "Doe", 37, addr); + + template.insert("person", p1); + template.insert("person", p2); + + List result = template.find(new Query(Criteria.where("ssn").is(1234567890)), Person.class); + assertThat(result.size(), is(1)); + } + }