Skip to content

Commit 6a973b2

Browse files
christophstroblmp911de
authored andcommitted
Add support for $tsIncrement aggregation operator.
See #4139 Original pull request: #4182.
1 parent 714b23e commit 6a973b2

File tree

4 files changed

+92
-2
lines changed

4 files changed

+92
-2
lines changed

Diff for: spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/DateOperators.java

+72
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,21 @@ public DateFromString fromString() {
818818
return applyTimezone(DateFromString.fromString(dateReference()), timezone);
819819
}
820820

821+
/**
822+
* Creates new {@link AggregationExpression} that returns the incrementing ordinal from a timestamp.
823+
*
824+
* @return new instance of {@link TsIncrement}.
825+
* @since 4.0
826+
*/
827+
public TsIncrement tsIncrement() {
828+
829+
if(timezone != null && !Timezone.none().equals(timezone)) {
830+
throw new IllegalArgumentException("$tsIncrement does not support timezones");
831+
}
832+
833+
return TsIncrement.tsIncrement(dateReference());
834+
}
835+
821836
private Object dateReference() {
822837

823838
if (usesFieldRef()) {
@@ -3182,6 +3197,63 @@ protected String getMongoMethod() {
31823197
}
31833198
}
31843199

3200+
/**
3201+
* {@link AggregationExpression} for {@code $tsIncrement}.
3202+
*
3203+
* @author Christoph Strobl
3204+
* @since 4.0
3205+
*/
3206+
public static class TsIncrement extends AbstractAggregationExpression {
3207+
3208+
private TsIncrement(Object value) {
3209+
super(value);
3210+
}
3211+
3212+
/**
3213+
* Creates new {@link TsIncrement} that returns the incrementing ordinal from a timestamp.
3214+
*
3215+
* @param value must not be {@literal null}.
3216+
* @return new instance of {@link TsIncrement}.
3217+
* @throws IllegalArgumentException if given {@literal value} is {@literal null}.
3218+
*/
3219+
public static TsIncrement tsIncrement(Object value) {
3220+
3221+
Assert.notNull(value, "Value must not be null");
3222+
return new TsIncrement(value);
3223+
}
3224+
3225+
/**
3226+
* Creates new {@link TsIncrement} that returns the incrementing ordinal from a timestamp.
3227+
*
3228+
* @param fieldReference must not be {@literal null}.
3229+
* @return new instance of {@link TsIncrement}.
3230+
* @throws IllegalArgumentException if given {@literal fieldReference} is {@literal null}.
3231+
*/
3232+
public static TsIncrement tsIncrementValueOf(String fieldReference) {
3233+
3234+
Assert.notNull(fieldReference, "FieldReference must not be null");
3235+
return tsIncrement(Fields.field(fieldReference));
3236+
}
3237+
3238+
/**
3239+
* Creates new {@link TsIncrement}.
3240+
*
3241+
* @param expression must not be {@literal null}.
3242+
* @return new instance of {@link TsIncrement}.
3243+
* @throws IllegalArgumentException if given {@literal expression} is {@literal null}.
3244+
*/
3245+
public static TsIncrement tsIncrementValueOf(AggregationExpression expression) {
3246+
3247+
Assert.notNull(expression, "Expression must not be null");
3248+
return tsIncrement(expression);
3249+
}
3250+
3251+
@Override
3252+
protected String getMongoMethod() {
3253+
return "$tsIncrement";
3254+
}
3255+
}
3256+
31853257
/**
31863258
* Interface defining a temporal unit for date operators.
31873259
*

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

+1
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ public class MethodReferenceNode extends ExpressionNode {
191191
map.put("isoDayOfWeek", singleArgRef().forOperator("$isoDayOfWeek"));
192192
map.put("isoWeek", singleArgRef().forOperator("$isoWeek"));
193193
map.put("isoWeekYear", singleArgRef().forOperator("$isoWeekYear"));
194+
map.put("tsIncrement", singleArgRef().forOperator("$tsIncrement"));
194195

195196
// CONDITIONAL OPERATORS
196197
map.put("cond", mapArgRef().forOperator("$cond") //

Diff for: spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/DateOperatorsUnitTests.java

+14-2
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@
2424
import java.util.TimeZone;
2525

2626
import org.junit.jupiter.api.Test;
27-
28-
import org.springframework.data.mongodb.core.aggregation.DateOperators.TemporalUnit;
2927
import org.springframework.data.mongodb.core.aggregation.DateOperators.Timezone;
3028

3129
/**
@@ -118,4 +116,18 @@ void rendersDateTruncWithTimezone() {
118116
assertThat(DateOperators.zonedDateOf("purchaseDate", Timezone.valueOf("America/Chicago")).truncate("week").binSize(2).startOfWeek(DayOfWeek.MONDAY).toDocument(Aggregation.DEFAULT_CONTEXT))
119117
.isEqualTo("{ $dateTrunc: { date: \"$purchaseDate\", unit: \"week\", binSize: 2, startOfWeek : \"monday\", timezone : \"America/Chicago\" } }");
120118
}
119+
120+
@Test // GH-4139
121+
void rendersTsIncrement() {
122+
123+
assertThat(DateOperators.dateOf("saleTimestamp").tsIncrement().toDocument(Aggregation.DEFAULT_CONTEXT)).isEqualTo(
124+
"{ $tsIncrement: \"$saleTimestamp\" }");
125+
}
126+
127+
@Test // GH-4139
128+
void tsIncrementErrorsOnTimezone() {
129+
130+
assertThatExceptionOfType(IllegalArgumentException.class)
131+
.isThrownBy(() -> DateOperators.zonedDateOf("purchaseDate", Timezone.valueOf("America/Chicago")).tsIncrement());
132+
}
121133
}

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

+5
Original file line numberDiff line numberDiff line change
@@ -1240,6 +1240,11 @@ void shouldRenderSortArray() {
12401240
assertThat(transform(
12411241
"sortArray(team, new org.bson.Document(\"name\" , 1))")).isEqualTo("{ $sortArray : { input : \"$team\", sortBy : {\"name\" : 1 } }}");
12421242
}
1243+
1244+
@Test // GH-4139
1245+
void shouldTsIncrement() {
1246+
assertThat(transform("tsIncrement(saleTimestamp)")).isEqualTo("{ $tsIncrement: \"$saleTimestamp\" }");
1247+
}
12431248

12441249
private Document transform(String expression, Object... params) {
12451250
return (Document) transformer.transform(expression, Aggregation.DEFAULT_CONTEXT, params);

0 commit comments

Comments
 (0)