From 08faa52ef4a0adbf9423cfebe0191a98567c6890 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Fri, 28 Nov 2014 16:05:17 +0100 Subject: [PATCH] DATAMONGO-1108 - Performance improvements in BasicMongoPersistentEntity. BasicMongoPersistentEntity.getCollection() now avoids repeated SpEL-parsing and evaluating in case no SpEL expression is used. Parsing is happening at most once now. Evaluation is skipped entirely if the configured collection String is not or does not contain an expression. --- .../mapping/BasicMongoPersistentEntity.java | 52 +++++++++++++++---- .../BasicMongoPersistentEntityUnitTests.java | 6 +++ 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/BasicMongoPersistentEntity.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/BasicMongoPersistentEntity.java index 1de1072ab..6d814d871 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/BasicMongoPersistentEntity.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/BasicMongoPersistentEntity.java @@ -35,6 +35,7 @@ import org.springframework.data.mongodb.MongoCollectionUtils; import org.springframework.data.util.TypeInformation; import org.springframework.expression.Expression; import org.springframework.expression.ParserContext; +import org.springframework.expression.common.LiteralExpression; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; import org.springframework.util.Assert; @@ -54,31 +55,36 @@ public class BasicMongoPersistentEntity extends BasicPersistentEntity, ApplicationContextAware { private static final String AMBIGUOUS_FIELD_MAPPING = "Ambiguous field mapping detected! Both %s and %s map to the same field name %s! Disambiguate using @Field annotation!"; + private static final SpelExpressionParser PARSER = new SpelExpressionParser(); + private final String collection; private final String language; - private final SpelExpressionParser parser; + private final StandardEvaluationContext context; + private final Expression expression; /** * Creates a new {@link BasicMongoPersistentEntity} with the given {@link TypeInformation}. Will default the * collection name to the entities simple type name. * - * @param typeInformation + * @param typeInformation must not be {@literal null}. */ public BasicMongoPersistentEntity(TypeInformation typeInformation) { super(typeInformation, MongoPersistentPropertyComparator.INSTANCE); - this.parser = new SpelExpressionParser(); - this.context = new StandardEvaluationContext(); - Class rawType = typeInformation.getType(); String fallback = MongoCollectionUtils.getPreferredCollectionName(rawType); - if (rawType.isAnnotationPresent(Document.class)) { - Document d = rawType.getAnnotation(Document.class); - this.collection = StringUtils.hasText(d.collection()) ? d.collection() : fallback; - this.language = StringUtils.hasText(d.language()) ? d.language() : ""; + Document document = rawType.getAnnotation(Document.class); + + this.expression = detectExpression(document); + this.context = new StandardEvaluationContext(); + + if (document != null) { + + this.collection = StringUtils.hasText(document.collection()) ? document.collection() : fallback; + this.language = StringUtils.hasText(document.language()) ? document.language() : ""; } else { this.collection = fallback; this.language = ""; @@ -101,8 +107,7 @@ public class BasicMongoPersistentEntity extends BasicPersistentEntity extends BasicPersistentEntity