Browse Source

Add support for `$documentNumber` aggregation operator.

Closes: #3717
Original pull request: #3741.
pull/3765/head
Christoph Strobl 4 years ago committed by Mark Paluch
parent
commit
1a86761e2e
No known key found for this signature in database
GPG Key ID: 4406B84C1661DCD1
  1. 26
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/DocumentOperators.java
  2. 1
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/spel/MethodReferenceNode.java
  3. 5
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/DocumentOperatorsUnitTests.java
  4. 5
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/SpelExpressionTransformerUnitTests.java

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

@ -18,6 +18,8 @@ package org.springframework.data.mongodb.core.aggregation; @@ -18,6 +18,8 @@ package org.springframework.data.mongodb.core.aggregation;
import org.bson.Document;
/**
* Gateway to {@literal document expressions} such as {@literal $rank, $documentNumber, etc.}
*
* @author Christoph Strobl
* @since 3.3
*/
@ -43,6 +45,16 @@ public class DocumentOperators { @@ -43,6 +45,16 @@ public class DocumentOperators {
return new DenseRank();
}
/**
* Obtain the current document position.
*
* @return new instance of {@link DocumentNumber}.
* @since 3.3
*/
public static DocumentNumber documentNumber() {
return new DocumentNumber();
}
/**
* {@link Rank} resolves the current document position (the rank) relative to other documents. If multiple documents
* occupy the same rank, {@literal $rank} places the document with the subsequent value at a rank with a gap.
@ -73,4 +85,18 @@ public class DocumentOperators { @@ -73,4 +85,18 @@ public class DocumentOperators {
return new Document("$denseRank", new Document());
}
}
/**
* {@link DocumentNumber} resolves the current document position.
*
* @author Christoph Strobl
* @since 3.3
*/
public static class DocumentNumber implements AggregationExpression {
@Override
public Document toDocument(AggregationOperationContext context) {
return new Document("$documentNumber", new Document());
}
}
}

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

@ -71,6 +71,7 @@ public class MethodReferenceNode extends ExpressionNode { @@ -71,6 +71,7 @@ public class MethodReferenceNode extends ExpressionNode {
// DOCUMENT OPERATORS
map.put("rank", emptyRef().forOperator("$rank"));
map.put("denseRank", emptyRef().forOperator("$denseRank"));
map.put("documentNumber", emptyRef().forOperator("$documentNumber"));
// ARITHMETIC OPERATORS
map.put("abs", singleArgRef().forOperator("$abs"));

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

@ -36,4 +36,9 @@ class DocumentOperatorsUnitTests { @@ -36,4 +36,9 @@ class DocumentOperatorsUnitTests {
assertThat(denseRank().toDocument(Aggregation.DEFAULT_CONTEXT))
.isEqualTo(new Document("$denseRank", new Document()));
}
@Test // GH-3717
void rendersDocumentNumber() {
assertThat(documentNumber().toDocument(Aggregation.DEFAULT_CONTEXT)).isEqualTo(new Document("$documentNumber", new Document()));
}
}

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

@ -966,6 +966,11 @@ public class SpelExpressionTransformerUnitTests { @@ -966,6 +966,11 @@ public class SpelExpressionTransformerUnitTests {
assertThat(transform("denseRank()")).isEqualTo(Document.parse("{ $denseRank : {} }"));
}
@Test // GH-3717
void shouldRenderDocumentNumber() {
assertThat(transform("documentNumber()")).isEqualTo(Document.parse("{ $documentNumber : {} }"));
}
private Object transform(String expression, Object... params) {
Object result = transformer.transform(expression, Aggregation.DEFAULT_CONTEXT, params);
return result == null ? null : (!(result instanceof org.bson.Document) ? result.toString() : result);

Loading…
Cancel
Save