Add possibility to use Collection<Criteria> as parameter in and/or/nor operators.
Closes #3286. Original pull request: #811.
This commit is contained in:
committed by
Mark Paluch
parent
198ebaa7d8
commit
0b27635d67
@@ -58,6 +58,7 @@ import com.mongodb.BasicDBList;
|
||||
* @author Christoph Strobl
|
||||
* @author Mark Paluch
|
||||
* @author Andreas Zink
|
||||
* @author Ziemowit Stolarczyk
|
||||
*/
|
||||
public class Criteria implements CriteriaDefinition {
|
||||
|
||||
@@ -678,6 +679,13 @@ public class Criteria implements CriteriaDefinition {
|
||||
* @return this.
|
||||
*/
|
||||
public Criteria orOperator(Criteria... criteria) {
|
||||
return orOperator(Arrays.asList(criteria));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link #orOperator(Criteria...)}
|
||||
*/
|
||||
public Criteria orOperator(Collection<Criteria> criteria) {
|
||||
BasicDBList bsonList = createCriteriaList(criteria);
|
||||
return registerCriteriaChainElement(new Criteria("$or").is(bsonList));
|
||||
}
|
||||
@@ -693,6 +701,13 @@ public class Criteria implements CriteriaDefinition {
|
||||
* @return this.
|
||||
*/
|
||||
public Criteria norOperator(Criteria... criteria) {
|
||||
return norOperator(Arrays.asList(criteria));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link #norOperator(Criteria...)}
|
||||
*/
|
||||
public Criteria norOperator(Collection<Criteria> criteria) {
|
||||
BasicDBList bsonList = createCriteriaList(criteria);
|
||||
return registerCriteriaChainElement(new Criteria("$nor").is(bsonList));
|
||||
}
|
||||
@@ -708,6 +723,13 @@ public class Criteria implements CriteriaDefinition {
|
||||
* @return this.
|
||||
*/
|
||||
public Criteria andOperator(Criteria... criteria) {
|
||||
return andOperator(Arrays.asList(criteria));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link #andOperator(Criteria...)}
|
||||
*/
|
||||
public Criteria andOperator(Collection<Criteria> criteria) {
|
||||
BasicDBList bsonList = createCriteriaList(criteria);
|
||||
return registerCriteriaChainElement(new Criteria("$and").is(bsonList));
|
||||
}
|
||||
@@ -801,7 +823,7 @@ public class Criteria implements CriteriaDefinition {
|
||||
return queryCriteria;
|
||||
}
|
||||
|
||||
private BasicDBList createCriteriaList(Criteria[] criteria) {
|
||||
private BasicDBList createCriteriaList(Collection<Criteria> criteria) {
|
||||
BasicDBList bsonList = new BasicDBList();
|
||||
for (Criteria c : criteria) {
|
||||
bsonList.add(c.getCriteriaObject());
|
||||
|
||||
@@ -18,6 +18,7 @@ package org.springframework.data.mongodb.core.query;
|
||||
import static org.springframework.data.mongodb.test.util.Assertions.*;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
|
||||
import org.bson.Document;
|
||||
@@ -34,6 +35,7 @@ import org.springframework.data.mongodb.core.schema.MongoJsonSchema;
|
||||
* @author Thomas Darimont
|
||||
* @author Christoph Strobl
|
||||
* @author Andreas Zink
|
||||
* @author Ziemowit Stolarczyk
|
||||
*/
|
||||
public class CriteriaUnitTests {
|
||||
|
||||
@@ -80,6 +82,54 @@ public class CriteriaUnitTests {
|
||||
assertThat(right).isNotEqualTo(left);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldBuildCorrectAndOperator() {
|
||||
//given
|
||||
Collection<Criteria> operatorCriteria = Arrays.asList(Criteria.where("x").is(true),
|
||||
Criteria.where("y").is(42),
|
||||
Criteria.where("z").is("value"));
|
||||
Document expectedResult = Document
|
||||
.parse("{\"$and\":[{\"x\":true}, {\"y\":42}, {\"z\":\"value\"}], \"foo\":\"bar\"}");
|
||||
|
||||
//when
|
||||
Criteria criteria = Criteria.where("foo").is("bar").andOperator(operatorCriteria);
|
||||
|
||||
//then
|
||||
assertThat(criteria.getCriteriaObject()).isEqualTo(expectedResult);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldBuildCorrectOrOperator() {
|
||||
//given
|
||||
Collection<Criteria> operatorCriteria = Arrays.asList(Criteria.where("x").is(true),
|
||||
Criteria.where("y").is(42),
|
||||
Criteria.where("z").is("value"));
|
||||
Document expectedResult = Document
|
||||
.parse("{\"$or\":[{\"x\":true}, {\"y\":42}, {\"z\":\"value\"}], \"foo\":\"bar\"}");
|
||||
|
||||
//when
|
||||
Criteria criteria = Criteria.where("foo").is("bar").orOperator(operatorCriteria);
|
||||
|
||||
//then
|
||||
assertThat(criteria.getCriteriaObject()).isEqualTo(expectedResult);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldBuildCorrectNorOperator() {
|
||||
//given
|
||||
Collection<Criteria> operatorCriteria = Arrays.asList(Criteria.where("x").is(true),
|
||||
Criteria.where("y").is(42),
|
||||
Criteria.where("z").is("value"));
|
||||
Document expectedResult = Document
|
||||
.parse("{\"$nor\":[{\"x\":true}, {\"y\":42}, {\"z\":\"value\"}], \"foo\":\"bar\"}");
|
||||
|
||||
//when
|
||||
Criteria criteria = Criteria.where("foo").is("bar").norOperator(operatorCriteria);
|
||||
|
||||
//then
|
||||
assertThat(criteria.getCriteriaObject()).isEqualTo(expectedResult);
|
||||
}
|
||||
|
||||
@Test // DATAMONGO-507
|
||||
public void shouldThrowExceptionWhenTryingToNegateAndOperation() {
|
||||
assertThatIllegalArgumentException().isThrownBy(() -> new Criteria() //
|
||||
|
||||
@@ -1200,6 +1200,7 @@ The `Criteria` class provides the following methods, all of which correspond to
|
||||
* `Criteria` *all* `(Object o)` Creates a criterion using the `$all` operator
|
||||
* `Criteria` *and* `(String key)` Adds a chained `Criteria` with the specified `key` to the current `Criteria` and returns the newly created one
|
||||
* `Criteria` *andOperator* `(Criteria... criteria)` Creates an and query using the `$and` operator for all of the provided criteria (requires MongoDB 2.0 or later)
|
||||
* `Criteria` *andOperator* `(Collection<Criteria> criteria)` Creates an and query using the `$and` operator for all of the provided criteria (requires MongoDB 2.0 or later)
|
||||
* `Criteria` *elemMatch* `(Criteria c)` Creates a criterion using the `$elemMatch` operator
|
||||
* `Criteria` *exists* `(boolean b)` Creates a criterion using the `$exists` operator
|
||||
* `Criteria` *gt* `(Object o)` Creates a criterion using the `$gt` operator
|
||||
@@ -1213,8 +1214,10 @@ The `Criteria` class provides the following methods, all of which correspond to
|
||||
* `Criteria` *ne* `(Object o)` Creates a criterion using the `$ne` operator
|
||||
* `Criteria` *nin* `(Object... o)` Creates a criterion using the `$nin` operator
|
||||
* `Criteria` *norOperator* `(Criteria... criteria)` Creates an nor query using the `$nor` operator for all of the provided criteria
|
||||
* `Criteria` *norOperator* `(Collection<Criteria> criteria)` Creates an nor query using the `$nor` operator for all of the provided criteria
|
||||
* `Criteria` *not* `()` Creates a criterion using the `$not` meta operator which affects the clause directly following
|
||||
* `Criteria` *orOperator* `(Criteria... criteria)` Creates an or query using the `$or` operator for all of the provided criteria
|
||||
* `Criteria` *orOperator* `(Collection<Criteria> criteria)` Creates an or query using the `$or` operator for all of the provided criteria
|
||||
* `Criteria` *regex* `(String re)` Creates a criterion using a `$regex`
|
||||
* `Criteria` *size* `(int s)` Creates a criterion using the `$size` operator
|
||||
* `Criteria` *type* `(int t)` Creates a criterion using the `$type` operator
|
||||
|
||||
Reference in New Issue
Block a user