From 2a8fe5bac7ddfb90ad348e3d2e710f03d07565a7 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Mon, 12 Mar 2012 11:52:19 +0100 Subject: [PATCH] DATAMONGO-413 - Fixed bug in MongoQueryCreator. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MongoQueryCreator used the outdated OrQuery class to concatenate parts with OR. Refactored the class to use the Criteria.orOperator(…) method. Removed OrQuery class as it is deprecated in the 1.0.x branch. --- .../data/mongodb/core/query/OrQuery.java | 35 ------------------- .../repository/query/MongoQueryCreator.java | 23 ++++++------ .../query/MongoQueryCreatorUnitTests.java | 16 ++++++++- 3 files changed, 28 insertions(+), 46 deletions(-) delete mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/OrQuery.java diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/OrQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/OrQuery.java deleted file mode 100644 index 9060ecef3..000000000 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/OrQuery.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2010-2011 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.core.query; - -import java.util.ArrayList; -import java.util.List; - -public class OrQuery extends Query { - - public OrQuery(Query... q) { - super(getOrCriteria(q)); - } - - private static Criteria getOrCriteria(Query[] queries) { - List criteriaList = new ArrayList(); - for (Query q : queries) { - criteriaList.addAll(q.getCriteria()); - } - return new Criteria(criteriaList, "$or"); - } - -} diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java index 2188713f3..c91fcf4cf 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java @@ -31,7 +31,6 @@ import org.springframework.data.mongodb.core.geo.Shape; import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.CriteriaDefinition; -import org.springframework.data.mongodb.core.query.OrQuery; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.repository.query.ConvertingParameterAccessor.PotentiallyConvertingIterator; import org.springframework.data.repository.query.parser.AbstractQueryCreator; @@ -45,7 +44,7 @@ import org.springframework.util.Assert; * * @author Oliver Gierke */ -class MongoQueryCreator extends AbstractQueryCreator { +class MongoQueryCreator extends AbstractQueryCreator { private static final Logger LOG = LoggerFactory.getLogger(MongoQueryCreator.class); private final MongoParameterAccessor accessor; @@ -92,7 +91,7 @@ class MongoQueryCreator extends AbstractQueryCreator { * @see org.springframework.data.repository.query.parser.AbstractQueryCreator#create(org.springframework.data.repository.query.parser.Part, java.util.Iterator) */ @Override - protected Query create(Part part, Iterator iterator) { + protected Criteria create(Part part, Iterator iterator) { if (isGeoNearQuery && part.getType().equals(Type.NEAR)) { return null; @@ -103,7 +102,7 @@ class MongoQueryCreator extends AbstractQueryCreator { where(path.toDotPath(MongoPersistentProperty.PropertyToFieldNameConverter.INSTANCE)), (PotentiallyConvertingIterator) iterator); - return new Query(criteria); + return criteria; } /* @@ -111,7 +110,7 @@ class MongoQueryCreator extends AbstractQueryCreator { * @see org.springframework.data.repository.query.parser.AbstractQueryCreator#and(org.springframework.data.repository.query.parser.Part, java.lang.Object, java.util.Iterator) */ @Override - protected Query and(Part part, Query base, Iterator iterator) { + protected Criteria and(Part part, Criteria base, Iterator iterator) { if (base == null) { return create(part, iterator); @@ -122,7 +121,8 @@ class MongoQueryCreator extends AbstractQueryCreator { Criteria criteria = from(part.getType(), where(path2.toDotPath(MongoPersistentProperty.PropertyToFieldNameConverter.INSTANCE)), (PotentiallyConvertingIterator) iterator); - return base.addCriteria(criteria); + + return criteria.andOperator(criteria); } /* @@ -133,8 +133,10 @@ class MongoQueryCreator extends AbstractQueryCreator { * #or(java.lang.Object, java.lang.Object) */ @Override - protected Query or(Query base, Query query) { - return new OrQuery(new Query[] { base, query }); + protected Criteria or(Criteria base, Criteria criteria) { + + Criteria result = new Criteria(); + return result.orOperator(base, criteria); } /* @@ -145,12 +147,13 @@ class MongoQueryCreator extends AbstractQueryCreator { * #complete(java.lang.Object, org.springframework.data.domain.Sort) */ @Override - protected Query complete(Query query, Sort sort) { + protected Query complete(Criteria criteria, Sort sort) { - if (query == null) { + if (criteria == null) { return null; } + Query query = new Query(criteria); QueryUtils.applySorting(query, sort); if (LOG.isDebugEnabled()) { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryCreatorUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryCreatorUnitTests.java index 5eccee996..e5a221610 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryCreatorUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryCreatorUnitTests.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. @@ -211,6 +211,20 @@ public class MongoQueryCreatorUnitTests { assertThat(creator.createQuery().getQueryObject(), is(query.getQueryObject())); } + /** + * @see DATAMONGO + */ + @Test + public void createsOrQueryCorrectly() { + + PartTree tree = new PartTree("findByFirstNameOrAge", Person.class); + MongoQueryCreator creator = new MongoQueryCreator(tree, getAccessor(converter, "Dave", 42), context); + + Query query = creator.createQuery(); + assertThat(query.getQueryObject(), + is(query(new Criteria().orOperator(where("firstName").is("Dave"), where("age").is(42))).getQueryObject())); + } + private void assertBindsDistanceToQuery(Point point, Distance distance, Query reference) throws Exception { when(converter.convertToMongoType("Dave")).thenReturn("Dave");