Add possibility to use Collection<Criteria> as parameter in and/or/nor operators.

Closes #3286.
Original pull request: #811.
This commit is contained in:
Ziemowit Stolarczyk
2021-02-19 09:49:04 +01:00
committed by Mark Paluch
parent 198ebaa7d8
commit 0b27635d67
3 changed files with 76 additions and 1 deletions

View File

@@ -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());

View File

@@ -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() //

View File

@@ -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