Skip to content

Commit a40d15c

Browse files
committed
spring-projectsGH-3726: Add support for $sampleRate.
Closes spring-projects#3726
1 parent 4491301 commit a40d15c

File tree

3 files changed

+55
-21
lines changed

3 files changed

+55
-21
lines changed

Diff for: spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java

+29-14
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,7 @@
1515
*/
1616
package org.springframework.data.mongodb.core.query;
1717

18-
import static org.springframework.util.ObjectUtils.*;
19-
20-
import java.util.ArrayList;
21-
import java.util.Arrays;
22-
import java.util.Collection;
23-
import java.util.Iterator;
24-
import java.util.LinkedHashMap;
25-
import java.util.List;
26-
import java.util.Map;
27-
import java.util.Map.Entry;
28-
import java.util.regex.Pattern;
29-
import java.util.stream.Collectors;
30-
18+
import com.mongodb.BasicDBList;
3119
import org.bson.BsonRegularExpression;
3220
import org.bson.BsonType;
3321
import org.bson.Document;
@@ -50,7 +38,18 @@
5038
import org.springframework.util.ObjectUtils;
5139
import org.springframework.util.StringUtils;
5240

53-
import com.mongodb.BasicDBList;
41+
import java.util.ArrayList;
42+
import java.util.Arrays;
43+
import java.util.Collection;
44+
import java.util.Iterator;
45+
import java.util.LinkedHashMap;
46+
import java.util.List;
47+
import java.util.Map;
48+
import java.util.Map.Entry;
49+
import java.util.regex.Pattern;
50+
import java.util.stream.Collectors;
51+
52+
import static org.springframework.util.ObjectUtils.*;
5453

5554
/**
5655
* Central class for creating queries. It follows a fluent API style so that you can easily chain together multiple
@@ -64,6 +63,7 @@
6463
* @author Andreas Zink
6564
* @author Ziemowit Stolarczyk
6665
* @author Clément Petit
66+
* @author James McNee
6767
*/
6868
public class Criteria implements CriteriaDefinition {
6969

@@ -390,6 +390,21 @@ public Criteria exists(boolean value) {
390390
return this;
391391
}
392392

393+
/**
394+
* Creates a criterion using the {@literal $sampleRate} operator.
395+
*
396+
* @param sampleRate sample rate to determine number of documents to be randomly selected from the input.
397+
* @return this.
398+
* @see <a href="https://docs.mongodb.com/manual/reference/operator/aggregation/sampleRate/">MongoDB Query operator: $sampleRate</a>
399+
*/
400+
public Criteria sampleRate(double sampleRate) {
401+
Assert.isTrue(sampleRate >= 0, "The sample rate must be greater than zero!");
402+
Assert.isTrue(sampleRate <= 1, "The sample rate must not be greater than one!");
403+
404+
criteria.put("$sampleRate", sampleRate);
405+
return this;
406+
}
407+
393408
/**
394409
* Creates a criterion using the {@literal $type} operator.
395410
*

Diff for: spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/CriteriaUnitTests.java

+22-7
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,20 @@
1515
*/
1616
package org.springframework.data.mongodb.core.query;
1717

18-
import static org.springframework.data.mongodb.test.util.Assertions.*;
19-
20-
import java.util.Arrays;
21-
import java.util.Collection;
22-
import java.util.Collections;
23-
2418
import org.bson.Document;
2519
import org.junit.Test;
26-
2720
import org.springframework.data.geo.Point;
2821
import org.springframework.data.mongodb.InvalidMongoDbApiUsageException;
2922
import org.springframework.data.mongodb.core.geo.GeoJsonLineString;
3023
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
3124
import org.springframework.data.mongodb.core.schema.MongoJsonSchema;
3225

26+
import java.util.Arrays;
27+
import java.util.Collection;
28+
import java.util.Collections;
29+
30+
import static org.springframework.data.mongodb.test.util.Assertions.*;
31+
3332
/**
3433
* Unit tests for {@link Criteria}.
3534
*
@@ -156,6 +155,22 @@ public void shouldNegateFollowingSimpleExpression() {
156155
assertThat(co).isEqualTo(Document.parse("{ \"age\" : { \"$not\" : { \"$gt\" : 18}} , \"status\" : \"student\"}"));
157156
}
158157

158+
@Test // GH-3726
159+
public void shouldBuildCorrectSampleRateOperation() {
160+
Criteria c = new Criteria().sampleRate(0.4);
161+
assertThat(c.getCriteriaObject()).isEqualTo(Document.parse("{ \"$sampleRate\" : 0.4 }"));
162+
}
163+
164+
@Test // GH-3726
165+
public void shouldThrowExceptionWhenSampleRateIsNegative() {
166+
assertThatIllegalArgumentException().isThrownBy(() -> new Criteria().sampleRate(-1));
167+
}
168+
169+
@Test // GH-3726
170+
public void shouldThrowExceptionWhenSampleRateIsGreatedThanOne() {
171+
assertThatIllegalArgumentException().isThrownBy(() -> new Criteria().sampleRate(1.01));
172+
}
173+
159174
@Test // DATAMONGO-1068
160175
public void getCriteriaObjectShouldReturnEmptyDocumentWhenNoCriteriaSpecified() {
161176

Diff for: src/main/asciidoc/reference/mongo-repositories.adoc

+4
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,10 @@ lower / upper bounds (`$gt` / `$gte` & `$lt` / `$lte`) according to `Range`
281281
| `Exists`
282282
| `findByLocationExists(boolean exists)`
283283
| `{"location" : {"$exists" : exists }}`
284+
285+
| `SampleRate`
286+
| `sampleRate(double sampleRate)`
287+
| `{"$sampleRate" : sampleRate }`
284288
|===
285289

286290
NOTE: If the property criterion compares a document, the order of the fields and exact equality in the document matters.

0 commit comments

Comments
 (0)