diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java index 9da5cb57f..f5afebc0e 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,19 +17,14 @@ package org.springframework.data.mongodb.repository.support; import java.io.Serializable; import java.util.List; -import java.util.regex.Pattern; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Order; -import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.convert.MongoConverter; -import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; -import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty; import org.springframework.data.mongodb.repository.query.MongoEntityInformation; import org.springframework.data.querydsl.EntityPathResolver; import org.springframework.data.querydsl.QueryDslPredicateExecutor; @@ -37,14 +32,10 @@ import org.springframework.data.querydsl.SimpleEntityPathResolver; import org.springframework.data.repository.core.EntityMetadata; import org.springframework.util.Assert; -import com.mongodb.DBObject; import com.mysema.query.mongodb.MongodbQuery; -import com.mysema.query.mongodb.MongodbSerializer; import com.mysema.query.types.EntityPath; import com.mysema.query.types.Expression; import com.mysema.query.types.OrderSpecifier; -import com.mysema.query.types.Path; -import com.mysema.query.types.PathMetadata; import com.mysema.query.types.Predicate; import com.mysema.query.types.path.PathBuilder; @@ -56,7 +47,6 @@ import com.mysema.query.types.path.PathBuilder; public class QueryDslMongoRepository extends SimpleMongoRepository implements QueryDslPredicateExecutor { - private final MongodbSerializer serializer; private final PathBuilder builder; /** @@ -67,7 +57,6 @@ public class QueryDslMongoRepository extends SimpleM * @param template */ public QueryDslMongoRepository(MongoEntityInformation entityInformation, MongoOperations mongoOperations) { - this(entityInformation, mongoOperations, SimpleEntityPathResolver.INSTANCE); } @@ -86,40 +75,27 @@ public class QueryDslMongoRepository extends SimpleM Assert.notNull(resolver); EntityPath path = resolver.createPath(entityInformation.getJavaType()); this.builder = new PathBuilder(path.getType(), path.getMetadata()); - this.serializer = new SpringDataMongodbSerializer(mongoOperations.getConverter()); } /* * (non-Javadoc) - * - * @see - * org.springframework.data.mongodb.repository.QueryDslExecutor - * #findOne(com.mysema.query.types.Predicate) + * @see org.springframework.data.querydsl.QueryDslPredicateExecutor#findOne(com.mysema.query.types.Predicate) */ public T findOne(Predicate predicate) { - return createQueryFor(predicate).uniqueResult(); } /* * (non-Javadoc) - * - * @see - * org.springframework.data.mongodb.repository.QueryDslExecutor - * #findAll(com.mysema.query.types.Predicate) + * @see org.springframework.data.querydsl.QueryDslPredicateExecutor#findAll(com.mysema.query.types.Predicate) */ public List findAll(Predicate predicate) { - return createQueryFor(predicate).list(); } /* * (non-Javadoc) - * - * @see - * org.springframework.data.mongodb.repository.QueryDslExecutor - * #findAll(com.mysema.query.types.Predicate, - * com.mysema.query.types.OrderSpecifier[]) + * @see org.springframework.data.querydsl.QueryDslPredicateExecutor#findAll(com.mysema.query.types.Predicate, com.mysema.query.types.OrderSpecifier[]) */ public List findAll(Predicate predicate, OrderSpecifier... orders) { @@ -128,11 +104,7 @@ public class QueryDslMongoRepository extends SimpleM /* * (non-Javadoc) - * - * @see - * org.springframework.data.mongodb.repository.QueryDslExecutor - * #findAll(com.mysema.query.types.Predicate, - * org.springframework.data.domain.Pageable) + * @see org.springframework.data.querydsl.QueryDslPredicateExecutor#findAll(com.mysema.query.types.Predicate, org.springframework.data.domain.Pageable) */ public Page findAll(Predicate predicate, Pageable pageable) { @@ -144,13 +116,9 @@ public class QueryDslMongoRepository extends SimpleM /* * (non-Javadoc) - * - * @see - * org.springframework.data.mongodb.repository.QueryDslExecutor - * #count(com.mysema.query.types.Predicate) + * @see org.springframework.data.querydsl.QueryDslPredicateExecutor#count(com.mysema.query.types.Predicate) */ public long count(Predicate predicate) { - return createQueryFor(predicate).count(); } @@ -164,7 +132,7 @@ public class QueryDslMongoRepository extends SimpleM Class domainType = getEntityInformation().getJavaType(); - MongodbQuery query = new SpringDataMongodbQuery(getMongoOperations(), serializer, domainType); + MongodbQuery query = new SpringDataMongodbQuery(getMongoOperations(), domainType); return query.where(predicate); } @@ -219,40 +187,4 @@ public class QueryDslMongoRepository extends SimpleM return new OrderSpecifier(order.isAscending() ? com.mysema.query.types.Order.ASC : com.mysema.query.types.Order.DESC, property); } - - /** - * Custom {@link MongodbSerializer} to take mapping information into account when building keys for constraints. - * - * @author Oliver Gierke - */ - static class SpringDataMongodbSerializer extends MongodbSerializer { - - private final MongoConverter converter; - private final MappingContext, MongoPersistentProperty> mappingContext; - - /** - * Creates a new {@link SpringDataMongodbSerializer} for the given {@link MappingContext}. - * - * @param mappingContext - */ - public SpringDataMongodbSerializer(MongoConverter converter) { - this.mappingContext = converter.getMappingContext(); - this.converter = converter; - } - - @Override - protected String getKeyForPath(Path expr, PathMetadata metadata) { - - Path parent = metadata.getParent(); - MongoPersistentEntity entity = mappingContext.getPersistentEntity(parent.getType()); - MongoPersistentProperty property = entity.getPersistentProperty(metadata.getExpression().toString()); - return property == null ? super.getKeyForPath(expr, metadata) : property.getFieldName(); - } - - @Override - protected DBObject asDBObject(String key, Object value) { - - return super.asDBObject(key, value instanceof Pattern ? value : converter.convertToMongoType(value)); - } - } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupport.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupport.java index 6426f6dca..4141921d8 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupport.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 the original author or authors. + * Copyright 2011-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,6 @@ import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; import org.springframework.util.Assert; import com.mysema.query.mongodb.MongodbQuery; -import com.mysema.query.mongodb.MongodbSerializer; import com.mysema.query.types.EntityPath; /** @@ -33,7 +32,6 @@ public abstract class QuerydslRepositorySupport { private final MongoOperations template; private final MappingContext, ?> context; - private final MongodbSerializer serializer; /** * Creates a new {@link QuerydslRepositorySupport} for the given {@link MongoOperations}. @@ -41,10 +39,11 @@ public abstract class QuerydslRepositorySupport { * @param operations must not be {@literal null} */ public QuerydslRepositorySupport(MongoOperations operations) { + Assert.notNull(operations); + this.template = operations; this.context = operations.getConverter().getMappingContext(); - this.serializer = new MongodbSerializer(); } /** @@ -72,6 +71,6 @@ public abstract class QuerydslRepositorySupport { Assert.notNull(path); Assert.hasText(collection); - return new SpringDataMongodbQuery(template, serializer, path.getType(), collection); + return new SpringDataMongodbQuery(template, path.getType(), collection); } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbQuery.java index 307ae24f1..67c48466d 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbQuery.java @@ -21,7 +21,6 @@ import com.google.common.base.Function; import com.mongodb.DBCollection; import com.mongodb.DBObject; import com.mysema.query.mongodb.MongodbQuery; -import com.mysema.query.mongodb.MongodbSerializer; /** * Spring Data specfic {@link MongodbQuery} implementation. @@ -36,30 +35,26 @@ class SpringDataMongodbQuery extends MongodbQuery { * Creates a new {@link SpringDataMongodbQuery}. * * @param operations must not be {@literal null}. - * @param serializer must not be {@literal null}. * @param type must not be {@literal null}. */ - public SpringDataMongodbQuery(final MongoOperations operations, final MongodbSerializer serializer, - final Class type) { - this(operations, serializer, type, operations.getCollectionName(type)); + public SpringDataMongodbQuery(final MongoOperations operations, final Class type) { + this(operations, type, operations.getCollectionName(type)); } /** * Creates a new {@link SpringDataMongodbQuery} to query the given collection. * * @param operations must not be {@literal null}. - * @param serializer must not be {@literal null}. * @param type must not be {@literal null}. * @param collectionName must not be {@literal null} or empty. */ - public SpringDataMongodbQuery(final MongoOperations operations, final MongodbSerializer serializer, - final Class type, String collectionName) { + public SpringDataMongodbQuery(final MongoOperations operations, final Class type, String collectionName) { super(operations.getCollection(collectionName), new Function() { public T apply(DBObject input) { return operations.getConverter().read(type, input); } - }, serializer); + }, new SpringDataMongodbSerializer(operations.getConverter())); this.operations = operations; } @@ -72,4 +67,4 @@ class SpringDataMongodbQuery extends MongodbQuery { protected DBCollection getCollection(Class type) { return operations.getCollection(operations.getCollectionName(type)); } -} \ No newline at end of file +} diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializer.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializer.java new file mode 100644 index 000000000..e2325294c --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializer.java @@ -0,0 +1,75 @@ +/* + * Copyright 2011-2012 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.mongodb.repository.support; + +import java.util.regex.Pattern; + +import org.springframework.data.mapping.context.MappingContext; +import org.springframework.data.mongodb.core.convert.MongoConverter; +import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; +import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty; +import org.springframework.util.Assert; + +import com.mongodb.DBObject; +import com.mysema.query.mongodb.MongodbSerializer; +import com.mysema.query.types.Path; +import com.mysema.query.types.PathMetadata; + +/** + * Custom {@link MongodbSerializer} to take mapping information into account when building keys for constraints. + * + * @author Oliver Gierke + */ +class SpringDataMongodbSerializer extends MongodbSerializer { + + private final MongoConverter converter; + private final MappingContext, MongoPersistentProperty> mappingContext; + + /** + * Creates a new {@link SpringDataMongodbSerializer} for the given {@link MappingContext}. + * + * @param mappingContext + */ + public SpringDataMongodbSerializer(MongoConverter converter) { + + Assert.notNull(converter, "MongoConverter must not be null!"); + + this.mappingContext = converter.getMappingContext(); + this.converter = converter; + } + + /* + * (non-Javadoc) + * @see com.mysema.query.mongodb.MongodbSerializer#getKeyForPath(com.mysema.query.types.Path, com.mysema.query.types.PathMetadata) + */ + @Override + protected String getKeyForPath(Path expr, PathMetadata metadata) { + + Path parent = metadata.getParent(); + MongoPersistentEntity entity = mappingContext.getPersistentEntity(parent.getType()); + MongoPersistentProperty property = entity.getPersistentProperty(metadata.getExpression().toString()); + return property == null ? super.getKeyForPath(expr, metadata) : property.getFieldName(); + } + + /* + * (non-Javadoc) + * @see com.mysema.query.mongodb.MongodbSerializer#asDBObject(java.lang.String, java.lang.Object) + */ + @Override + protected DBObject asDBObject(String key, Object value) { + return super.asDBObject(key, value instanceof Pattern ? value : converter.convertToMongoType(value)); + } +} diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java index f11de18f2..b32d6a114 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java @@ -30,7 +30,6 @@ import org.springframework.data.mongodb.core.mapping.Field; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.repository.QAddress; import org.springframework.data.mongodb.repository.QPerson; -import org.springframework.data.mongodb.repository.support.QueryDslMongoRepository.SpringDataMongodbSerializer; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; @@ -53,7 +52,7 @@ public class SpringDataMongodbSerializerUnitTests { public void setUp() { MongoMappingContext context = new MongoMappingContext(); converter = new MappingMongoConverter(dbFactory, context); - serializer = new QueryDslMongoRepository.SpringDataMongodbSerializer(converter); + serializer = new SpringDataMongodbSerializer(converter); } @Test