Skip to content

Commit 5d2faef

Browse files
gustavodegeuschristophstrobl
authored andcommitted
DATAMONGO-1327 - Added support for $stdDevSamp and $stdDevPop to aggregation $group stage.
Original Pull Request: #360 CLA: 171720160409030719 (Gustavo de Geus)
1 parent 2c3cbb3 commit 5d2faef

File tree

2 files changed

+55
-1
lines changed

2 files changed

+55
-1
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/GroupOperation.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
import org.springframework.util.Assert;
2828
import org.springframework.util.StringUtils;
2929

30+
import com.mongodb.BasicDBObject;
31+
import com.mongodb.DBObject;
32+
3033
/**
3134
* Encapsulates the aggregation framework {@code $group}-operation.
3235
* <p>
@@ -37,6 +40,7 @@
3740
* @author Sebastian Herold
3841
* @author Thomas Darimont
3942
* @author Oliver Gierke
43+
* @author Gustavo de Geus
4044
* @author Christoph Strobl
4145
* @since 1.3
4246
*/
@@ -311,6 +315,27 @@ public GroupOperationBuilder max(AggregationExpression expr) {
311315
return newBuilder(GroupOps.MAX, null, expr);
312316
}
313317

318+
/**
319+
* Generates an {@link GroupOperationBuilder} for an {@code $stdDevSamp}-expression that for the given
320+
* field-reference.
321+
*
322+
* @param reference
323+
* @return
324+
*/
325+
public GroupOperationBuilder stdDevSamp(String reference) {
326+
return newBuilder(GroupOps.STD_DEV_SAMP, reference, null);
327+
}
328+
329+
/**
330+
* Generates an {@link GroupOperationBuilder} for an {@code $stdDevPop}-expression that for the given field-reference.
331+
*
332+
* @param reference
333+
* @return
334+
*/
335+
public GroupOperationBuilder stdDevPop(String reference) {
336+
return newBuilder(GroupOps.STD_DEV_POP, reference, null);
337+
}
338+
314339
private GroupOperationBuilder newBuilder(Keyword keyword, String reference, Object value) {
315340
return new GroupOperationBuilder(this, new Operation(keyword, null, reference, value));
316341
}
@@ -375,7 +400,7 @@ interface Keyword {
375400

376401
private static enum GroupOps implements Keyword {
377402

378-
SUM, LAST, FIRST, PUSH, AVG, MIN, MAX, ADD_TO_SET, COUNT;
403+
SUM, LAST, FIRST, PUSH, AVG, MIN, MAX, ADD_TO_SET, COUNT, STD_DEV_SAMP, STD_DEV_POP;
379404

380405
@Override
381406
public String toString() {

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/GroupOperationUnitTests.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
*
3232
* @author Oliver Gierke
3333
* @author Thomas Darimont
34+
* @author Gustavo de Geus
3435
*/
3536
public class GroupOperationUnitTests {
3637

@@ -202,6 +203,34 @@ public void shouldRenderSizeExpressionInGroup() {
202203
assertThat(tagsCount.get("$first"), is((Object) new Document("$size", Arrays.asList("$tags"))));
203204
}
204205

206+
/**
207+
* @see DATAMONGO-1327
208+
*/
209+
@Test
210+
public void groupOperationStdDevSampWithValue() {
211+
212+
GroupOperation groupOperation = Aggregation.group("a", "b").stdDevSamp("field").as("fieldStdDevSamp");
213+
214+
Document groupClause = extractDocumentFromGroupOperation(groupOperation);
215+
Document push = DocumentTestUtils.getAsDocument(groupClause, "fieldStdDevSamp");
216+
217+
assertThat(push, is(new Document("$stdDevSamp", "$field")));
218+
}
219+
220+
/**
221+
* @see DATAMONGO-1327
222+
*/
223+
@Test
224+
public void groupOperationStdDevPopWithValue() {
225+
226+
GroupOperation groupOperation = Aggregation.group("a", "b").stdDevPop("field").as("fieldStdDevPop");
227+
228+
Document groupClause = extractDocumentFromGroupOperation(groupOperation);
229+
Document push = DocumentTestUtils.getAsDocument(groupClause, "fieldStdDevPop");
230+
231+
assertThat(push, is(new Document("$stdDevPop", "$field")));
232+
}
233+
205234
private Document extractDocumentFromGroupOperation(GroupOperation groupOperation) {
206235
Document document = groupOperation.toDocument(Aggregation.DEFAULT_CONTEXT);
207236
Document groupClause = DocumentTestUtils.getAsDocument(document, "$group");

0 commit comments

Comments
 (0)