Skip to content

Commit 280ee4f

Browse files
committed
Fixes, added currentAsMap
1 parent c3a126d commit 280ee4f

File tree

2 files changed

+55
-7
lines changed

2 files changed

+55
-7
lines changed

driver-core/src/main/com/mongodb/client/model/expressions/Expressions.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,19 @@ public static <R extends DocumentExpression> R current() {
177177
.assertImplementsAllExpressions();
178178
}
179179

180+
/**
181+
* Returns the "current" value as a {@linkplain MapExpression map} value.
182+
* The "current" value is the top-level document currently being processed
183+
* in the aggregation pipeline stage.
184+
*
185+
* @return the resulting value
186+
* @param <R> the type of the resulting value
187+
*/
188+
public static <R extends Expression> MapExpression<R> currentAsMap() {
189+
return new MqlExpression<>((cr) -> new AstPlaceholder(new BsonString("$$CURRENT")))
190+
.assertImplementsAllExpressions();
191+
}
192+
180193
@SafeVarargs // nothing is stored in the array
181194
public static <T extends Expression> ArrayExpression<T> ofArray(final T... array) {
182195
Assertions.notNull("array", array);

driver-sync/src/test/functional/com/mongodb/client/model/expressions/InContextExpressionsFunctionalTest.java

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import com.mongodb.MongoClientSettings;
2020
import com.mongodb.client.AggregateIterable;
21+
import com.mongodb.client.FindIterable;
2122
import com.mongodb.client.MongoClient;
2223
import com.mongodb.client.MongoClients;
2324
import com.mongodb.client.MongoCollection;
@@ -36,14 +37,13 @@
3637
import static com.mongodb.client.model.Accumulators.sum;
3738
import static com.mongodb.client.model.Aggregates.match;
3839
import static com.mongodb.client.model.Aggregates.project;
40+
import static com.mongodb.client.model.Filters.expr;
3941
import static com.mongodb.client.model.Projections.computed;
4042
import static com.mongodb.client.model.Projections.excludeId;
4143
import static com.mongodb.client.model.Projections.fields;
4244
import static com.mongodb.client.model.Projections.include;
4345
import static com.mongodb.client.model.Sorts.ascending;
44-
import static com.mongodb.client.model.expressions.Expressions.current;
45-
import static com.mongodb.client.model.expressions.Expressions.of;
46-
import static com.mongodb.client.model.expressions.Expressions.ofArray;
46+
import static com.mongodb.client.model.expressions.Expressions.*;
4747
import static org.junit.jupiter.api.Assertions.assertEquals;
4848

4949
class InContextExpressionsFunctionalTest extends AbstractExpressionsFunctionalTest {
@@ -63,7 +63,7 @@ public void tearDown() {
6363
client.close();
6464
}
6565

66-
private String bsonToString(final Bson project) {
66+
private static String bsonToString(final Bson project) {
6767
return project.toBsonDocument(Document.class, MongoClientSettings.getDefaultCodecRegistry()).toString().replaceAll("\"", "'");
6868
}
6969

@@ -74,6 +74,23 @@ private List<Document> aggregate(final Bson... stages) {
7474
return results;
7575
}
7676

77+
@Test
78+
public void findTest() {
79+
col.insertMany(Arrays.asList(
80+
Document.parse("{_id: 1, x: 0, y: 2}"),
81+
Document.parse("{_id: 2, x: 0, y: 3}"),
82+
Document.parse("{_id: 3, x: 1, y: 3}")));
83+
84+
FindIterable<Document> iterable = col.find(expr(
85+
current().getInteger("x").eq(of(1))));
86+
List<Document> results = new ArrayList<>();
87+
iterable.forEach(r -> results.add(r));
88+
89+
assertEquals(
90+
Arrays.asList(Document.parse("{_id: 3, x: 1, y: 3}")),
91+
results);
92+
}
93+
7794
@Test
7895
public void matchTest() {
7996
col.insertMany(Arrays.asList(
@@ -82,7 +99,25 @@ public void matchTest() {
8299
Document.parse("{_id: 3, x: 1, y: 3}")));
83100

84101
List<Document> results = aggregate(
85-
match(Filters.expr(current().getInteger("x").eq(of(1)))));
102+
match(expr(current().getInteger("x").eq(of(1)))));
103+
104+
assertEquals(
105+
Arrays.asList(Document.parse("{_id: 3, x: 1, y: 3}")),
106+
results);
107+
}
108+
109+
@Test
110+
public void currentAsMapMatchTest() {
111+
col.insertMany(Arrays.asList(
112+
Document.parse("{_id: 1, x: 0, y: 2}"),
113+
Document.parse("{_id: 2, x: 0, y: 3}"),
114+
Document.parse("{_id: 3, x: 1, y: 3}")));
115+
116+
List<Document> results = aggregate(
117+
match(expr(Expressions.<NumberExpression>currentAsMap()
118+
.entrySet()
119+
.map(e -> e.getValue())
120+
.sum(v -> v).eq(of(7)))));
86121

87122
assertEquals(
88123
Arrays.asList(Document.parse("{_id: 3, x: 1, y: 3}")),
@@ -131,8 +166,8 @@ public void projectTest2() {
131166

132167
// new, document
133168
Bson projectDocument = project(fields(computed("nested",
134-
//BsonDocument.parse("{ x: {$max : ['$x', 4] }}")
135-
of(new Document()).setField("x", current().getInteger("x").max(of(4)))
169+
// the below is roughly: "{ x: {$max : ['$x', 4] }}"
170+
of(Document.parse("{x: 9}")).setField("x", current().getInteger("x").max(of(4)))
136171
)));
137172
assertEquals(
138173
Arrays.asList(Document.parse("{_id: 0, nested: { x: 4 } }")),

0 commit comments

Comments
 (0)