Skip to content

Commit 92cc2a5

Browse files
Mushtaq Ahmedmp911de
Mushtaq Ahmed
authored andcommitted
Add support for $rand aggregation operator.
Closes #3724 Original pull request: #3759
1 parent 24171b3 commit 92cc2a5

File tree

4 files changed

+36
-0
lines changed

4 files changed

+36
-0
lines changed

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

+25
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.List;
2020
import java.util.Locale;
2121

22+
import org.bson.Document;
2223
import org.springframework.data.mongodb.core.aggregation.AccumulatorOperators.Avg;
2324
import org.springframework.data.mongodb.core.aggregation.AccumulatorOperators.CovariancePop;
2425
import org.springframework.data.mongodb.core.aggregation.AccumulatorOperators.CovarianceSamp;
@@ -63,6 +64,16 @@ public static ArithmeticOperatorFactory valueOf(AggregationExpression expression
6364
return new ArithmeticOperatorFactory(expression);
6465
}
6566

67+
/**
68+
* Creates new {@link AggregationExpression} that returns a random float between 0 and 1 each time it is called.
69+
*
70+
* @return new instance of {@link Rand}.
71+
* @since 3.3
72+
*/
73+
public static Rand rand() {
74+
return new Rand();
75+
}
76+
6677
/**
6778
* @author Christoph Strobl
6879
*/
@@ -2671,4 +2682,18 @@ protected String getMongoMethod() {
26712682
return "$tanh";
26722683
}
26732684
}
2685+
2686+
/**
2687+
* {@link Rand} returns a floating value between 0 and 1.
2688+
*
2689+
* @author Mushtaq Ahmed
2690+
* @since 3.3
2691+
*/
2692+
public static class Rand implements AggregationExpression {
2693+
2694+
@Override
2695+
public Document toDocument(AggregationOperationContext context) {
2696+
return new Document("$rand", new Document());
2697+
}
2698+
}
26742699
}

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/spel/MethodReferenceNode.java

+1
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ public class MethodReferenceNode extends ExpressionNode {
9999
map.put("cosh", singleArgRef().forOperator("$cosh"));
100100
map.put("tan", singleArgRef().forOperator("$tan"));
101101
map.put("tanh", singleArgRef().forOperator("$tanh"));
102+
map.put("rand", emptyRef().forOperator("$rand"));
102103

103104
// STRING OPERATORS
104105
map.put("concat", arrayArgRef().forOperator("$concat"));

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

+5
Original file line numberDiff line numberDiff line change
@@ -166,4 +166,9 @@ void rendersTanhWithValueInDegrees() {
166166
.isEqualTo("{ $tanh : { $degreesToRadians : \"$angle\" } }");
167167
}
168168

169+
170+
@Test // GH-3724
171+
void rendersRank() {
172+
assertThat(rand().toDocument(Aggregation.DEFAULT_CONTEXT)).isEqualTo(new Document("$rand", new Document()));
173+
}
169174
}

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

+5
Original file line numberDiff line numberDiff line change
@@ -1044,6 +1044,11 @@ void shouldRenderDateDiff() {
10441044
assertThat(transform("dateDiff(purchaseDate, delivered, 'day')")).isEqualTo(Document.parse("{ $dateDiff: { startDate: \"$purchaseDate\", endDate: \"$delivered\", unit: \"day\" } }"));
10451045
}
10461046

1047+
@Test // GH-3724
1048+
void shouldRenderRand() {
1049+
assertThat(transform("rand()")).isEqualTo(Document.parse("{ $rand : {} }"));
1050+
}
1051+
10471052
private Document transform(String expression, Object... params) {
10481053
return (Document) transformer.transform(expression, Aggregation.DEFAULT_CONTEXT, params);
10491054
}

0 commit comments

Comments
 (0)