Add support for $documentNumber aggregation operator.
Closes: #3717 Original pull request: #3741.
This commit is contained in:
committed by
Mark Paluch
parent
30da62181f
commit
1a86761e2e
@@ -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 {
|
||||
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 {
|
||||
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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"));
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user