diff --git a/pom.xml b/pom.xml index 75745189ed..e88e953616 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 1.7.0.BUILD-SNAPSHOT + 1.7.0.DATAMONGO-1068-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-cross-store/pom.xml b/spring-data-mongodb-cross-store/pom.xml index 40e8a0f253..e250833a2a 100644 --- a/spring-data-mongodb-cross-store/pom.xml +++ b/spring-data-mongodb-cross-store/pom.xml @@ -6,7 +6,7 @@ org.springframework.data spring-data-mongodb-parent - 1.7.0.BUILD-SNAPSHOT + 1.7.0.DATAMONGO-1068-SNAPSHOT ../pom.xml @@ -48,7 +48,7 @@ org.springframework.data spring-data-mongodb - 1.7.0.BUILD-SNAPSHOT + 1.7.0.DATAMONGO-1068-SNAPSHOT diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index 13110137b6..267c003696 100644 --- a/spring-data-mongodb-distribution/pom.xml +++ b/spring-data-mongodb-distribution/pom.xml @@ -13,7 +13,7 @@ org.springframework.data spring-data-mongodb-parent - 1.7.0.BUILD-SNAPSHOT + 1.7.0.DATAMONGO-1068-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-log4j/pom.xml b/spring-data-mongodb-log4j/pom.xml index 6ff09e4577..779ee82ad4 100644 --- a/spring-data-mongodb-log4j/pom.xml +++ b/spring-data-mongodb-log4j/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 1.7.0.BUILD-SNAPSHOT + 1.7.0.DATAMONGO-1068-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index bfcacd66eb..e14d5286d8 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -11,7 +11,7 @@ org.springframework.data spring-data-mongodb-parent - 1.7.0.BUILD-SNAPSHOT + 1.7.0.DATAMONGO-1068-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java index f3e215c5ee..a57dee028c 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java @@ -31,7 +31,9 @@ import org.springframework.data.mongodb.InvalidMongoDbApiUsageException; import org.springframework.data.mongodb.core.geo.Sphere; import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; +import org.springframework.util.StringUtils; import com.mongodb.BasicDBList; import com.mongodb.BasicDBObject; @@ -515,8 +517,11 @@ public String getKey() { * @see org.springframework.data.mongodb.core.query.CriteriaDefinition#getCriteriaObject() */ public DBObject getCriteriaObject() { + if (this.criteriaChain.size() == 1) { return criteriaChain.get(0).getSingleCriteriaObject(); + } else if (CollectionUtils.isEmpty(this.criteriaChain) && !CollectionUtils.isEmpty(this.criteria)) { + return getSingleCriteriaObject(); } else { DBObject criteriaObject = new BasicDBObject(); for (Criteria c : this.criteriaChain) { @@ -550,6 +555,13 @@ protected DBObject getSingleCriteriaObject() { } } + if (!StringUtils.hasText(this.key)) { + if (not) { + return new BasicDBObject("$not", dbo); + } + return dbo; + } + DBObject queryCriteria = new BasicDBObject(); if (!NOT_SET.equals(isValue)) { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/CriteriaTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/CriteriaTests.java index 5676f30a0b..a4fea2457c 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/CriteriaTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/CriteriaTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2013 the original author or authors. + * Copyright 2010-2014 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. @@ -22,12 +22,14 @@ import org.springframework.data.mongodb.InvalidMongoDbApiUsageException; import com.mongodb.BasicDBObject; +import com.mongodb.BasicDBObjectBuilder; import com.mongodb.DBObject; -/** - * @author Oliver Gierke - * @author Thomas Darimont - */ +/** + * @author Oliver Gierke + * @author Thomas Darimont + * @author Christoph Strobl + */ public class CriteriaTests { @Test @@ -72,50 +74,94 @@ public void equalIfCriteriaMatches() { assertThat(left, is(not(right))); assertThat(right, is(not(left))); } - - /** - * @see DATAMONGO-507 - */ - @Test(expected = IllegalArgumentException.class) - public void shouldThrowExceptionWhenTryingToNegateAndOperation() { - - new Criteria() // - .not() // - .andOperator(Criteria.where("delete").is(true).and("_id").is(42)); // - } - - /** - * @see DATAMONGO-507 - */ - @Test(expected = IllegalArgumentException.class) - public void shouldThrowExceptionWhenTryingToNegateOrOperation() { - - new Criteria() // - .not() // - .orOperator(Criteria.where("delete").is(true).and("_id").is(42)); // - } - - /** - * @see DATAMONGO-507 - */ - @Test(expected = IllegalArgumentException.class) - public void shouldThrowExceptionWhenTryingToNegateNorOperation() { - - new Criteria() // - .not() // - .norOperator(Criteria.where("delete").is(true).and("_id").is(42)); // - } - - /** - * @see DATAMONGO-507 - */ - @Test - public void shouldNegateFollowingSimpleExpression() { - - Criteria c = Criteria.where("age").not().gt(18).and("status").is("student"); - DBObject co = c.getCriteriaObject(); - - assertThat(co, is(notNullValue())); - assertThat(co.toString(), is("{ \"age\" : { \"$not\" : { \"$gt\" : 18}} , \"status\" : \"student\"}")); - } + + /** + * @see DATAMONGO-507 + */ + @Test(expected = IllegalArgumentException.class) + public void shouldThrowExceptionWhenTryingToNegateAndOperation() { + + new Criteria() // + .not() // + .andOperator(Criteria.where("delete").is(true).and("_id").is(42)); // + } + + /** + * @see DATAMONGO-507 + */ + @Test(expected = IllegalArgumentException.class) + public void shouldThrowExceptionWhenTryingToNegateOrOperation() { + + new Criteria() // + .not() // + .orOperator(Criteria.where("delete").is(true).and("_id").is(42)); // + } + + /** + * @see DATAMONGO-507 + */ + @Test(expected = IllegalArgumentException.class) + public void shouldThrowExceptionWhenTryingToNegateNorOperation() { + + new Criteria() // + .not() // + .norOperator(Criteria.where("delete").is(true).and("_id").is(42)); // + } + + /** + * @see DATAMONGO-507 + */ + @Test + public void shouldNegateFollowingSimpleExpression() { + + Criteria c = Criteria.where("age").not().gt(18).and("status").is("student"); + DBObject co = c.getCriteriaObject(); + + assertThat(co, is(notNullValue())); + assertThat(co.toString(), is("{ \"age\" : { \"$not\" : { \"$gt\" : 18}} , \"status\" : \"student\"}")); + } + + /** + * @see DATAMONGO-1068 + */ + @Test + public void getCriteriaObjectShouldReturnEmptyDBOWhenNoCriteriaSpecified() { + + DBObject dbo = new Criteria().getCriteriaObject(); + + assertThat(dbo, equalTo(new BasicDBObjectBuilder().get())); + } + + /** + * @see DATAMONGO-1068 + */ + @Test + public void getCriteriaObjectShouldUseCritieraValuesWhenNoKeyIsPresent() { + + DBObject dbo = new Criteria().lt("foo").getCriteriaObject(); + + assertThat(dbo, equalTo(new BasicDBObjectBuilder().add("$lt", "foo").get())); + } + + /** + * @see DATAMONGO-1068 + */ + @Test + public void getCriteriaObjectShouldUseCritieraValuesWhenNoKeyIsPresentButMultipleCriteriasPresent() { + + DBObject dbo = new Criteria().lt("foo").gt("bar").getCriteriaObject(); + + assertThat(dbo, equalTo(new BasicDBObjectBuilder().add("$lt", "foo").add("$gt", "bar").get())); + } + + /** + * @see DATAMONGO-1068 + */ + @Test + public void getCriteriaObjectShouldRespectNotWhenNoKeyPresent() { + + DBObject dbo = new Criteria().lt("foo").not().getCriteriaObject(); + + assertThat(dbo, equalTo(new BasicDBObjectBuilder().add("$not", new BasicDBObject("$lt", "foo")).get())); + } }