Skip to content

Commit 854b893

Browse files
DATAMONGO-1536 - Add literal operators (aggregation).
1 parent 6f5075c commit 854b893

File tree

3 files changed

+95
-4
lines changed

3 files changed

+95
-4
lines changed

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

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -870,6 +870,42 @@ private boolean usesFieldRef() {
870870
}
871871
}
872872

873+
/**
874+
* @author Christoph Strobl
875+
*/
876+
class LiteralOperators {
877+
878+
/**
879+
* Take the value referenced by given {@literal value}.
880+
*
881+
* @param value must not be {@literal null}.
882+
* @return
883+
*/
884+
public static LiteralOperatorFactory valueOf(Object value) {
885+
886+
Assert.notNull(value, "Value must not be null!");
887+
return new LiteralOperatorFactory(value);
888+
}
889+
890+
public static class LiteralOperatorFactory {
891+
892+
private final Object value;
893+
894+
public LiteralOperatorFactory(Object value) {
895+
this.value = value;
896+
}
897+
898+
/**
899+
* Returns the associated value without parsing.
900+
*
901+
* @return
902+
*/
903+
public Literal asLiteral() {
904+
return Literal.asLiteral(value);
905+
}
906+
}
907+
}
908+
873909
/**
874910
* @author Christoph Strobl
875911
*/
@@ -2253,4 +2289,25 @@ public interface SliceElementsBuilder {
22532289
}
22542290
}
22552291

2292+
/**
2293+
* {@link AggregationExpression} for {@code $literal}.
2294+
*
2295+
* @author Christoph Strobl
2296+
*/
2297+
class Literal extends AbstractAggregationExpression {
2298+
2299+
private Literal(Object value) {
2300+
super(value);
2301+
}
2302+
2303+
@Override
2304+
public String getMongoMethod() {
2305+
return "$literal";
2306+
}
2307+
2308+
public static Literal asLiteral(Object value) {
2309+
return new Literal(value);
2310+
}
2311+
}
2312+
22562313
}

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1131,7 +1131,7 @@ public ProjectionOperationBuilder strCaseCmp(AggregationExpression expression) {
11311131
* @return
11321132
* @since 1.10
11331133
*/
1134-
ProjectionOperationBuilder arrayElementAt(int position) {
1134+
public ProjectionOperationBuilder arrayElementAt(int position) {
11351135
return project("arrayElemAt", position);
11361136
}
11371137

@@ -1143,7 +1143,7 @@ ProjectionOperationBuilder arrayElementAt(int position) {
11431143
* @return
11441144
* @since 1.10
11451145
*/
1146-
ProjectionOperationBuilder concatArrays(String... fields) {
1146+
public ProjectionOperationBuilder concatArrays(String... fields) {
11471147
return project("concatArrays", Fields.fields(fields));
11481148
}
11491149

@@ -1153,10 +1153,20 @@ ProjectionOperationBuilder concatArrays(String... fields) {
11531153
* @return
11541154
* @since 1.10
11551155
*/
1156-
ProjectionOperationBuilder isArray() {
1156+
public ProjectionOperationBuilder isArray() {
11571157
return this.operation.and(AggregationExpressions.IsArray.isArray(name));
11581158
}
11591159

1160+
/**
1161+
* Takes the value previously and uses it as literal.
1162+
*
1163+
* @return
1164+
* @since 1.10
1165+
*/
1166+
public ProjectionOperationBuilder asLiteral() {
1167+
return this.operation.and(AggregationExpressions.Literal.asLiteral(name));
1168+
}
1169+
11601170
/*
11611171
* (non-Javadoc)
11621172
* @see org.springframework.data.mongodb.core.aggregation.AggregationOperation#toDBObject(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
@@ -1345,7 +1355,7 @@ protected List<Object> getOperationArguments(AggregationOperationContext context
13451355
if (element instanceof Field) {
13461356
result.add(context.getReference((Field) element).toString());
13471357
} else if (element instanceof Fields) {
1348-
for(Field field : (Fields)element) {
1358+
for (Field field : (Fields) element) {
13491359
result.add(context.getReference(field).toString());
13501360
}
13511361
} else if (element instanceof AggregationExpression) {

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.springframework.data.mongodb.core.DBObjectTestUtils;
3131
import org.springframework.data.mongodb.core.aggregation.AggregationExpressions.ArithmeticOperators;
3232
import org.springframework.data.mongodb.core.aggregation.AggregationExpressions.ArrayOperators;
33+
import org.springframework.data.mongodb.core.aggregation.AggregationExpressions.LiteralOperators;
3334
import org.springframework.data.mongodb.core.aggregation.AggregationExpressions.SetOperators;
3435
import org.springframework.data.mongodb.core.aggregation.AggregationExpressions.StringOperators;
3536
import org.springframework.data.mongodb.core.aggregation.ProjectionOperation.ProjectionOperationBuilder;
@@ -1254,6 +1255,29 @@ public void shouldRenderSliceWithPositionAggregationExpression() {
12541255
assertThat(agg, is(JSON.parse("{ $project: { threeFavorites: { $slice: [ \"$favorites\", 2, 3 ] } } }")));
12551256
}
12561257

1258+
/**
1259+
* @see DATAMONGO-1536
1260+
*/
1261+
@Test
1262+
public void shouldRenderLiteral() {
1263+
1264+
DBObject agg = project().and("$1").asLiteral().as("literalOnly").toDBObject(Aggregation.DEFAULT_CONTEXT);
1265+
1266+
assertThat(agg, is(JSON.parse("{ $project: { literalOnly: { $literal: \"$1\"} } }")));
1267+
}
1268+
1269+
/**
1270+
* @see DATAMONGO-1536
1271+
*/
1272+
@Test
1273+
public void shouldRenderLiteralAggregationExpression() {
1274+
1275+
DBObject agg = project().and(LiteralOperators.valueOf("$1").asLiteral()).as("literalOnly")
1276+
.toDBObject(Aggregation.DEFAULT_CONTEXT);
1277+
1278+
assertThat(agg, is(JSON.parse("{ $project: { literalOnly: { $literal: \"$1\"} } }")));
1279+
}
1280+
12571281
private static DBObject exctractOperation(String field, DBObject fromProjectClause) {
12581282
return (DBObject) fromProjectClause.get(field);
12591283
}

0 commit comments

Comments
 (0)