Skip to content

Commit d0099cd

Browse files
committed
Add getMap, fix failing test
1 parent 6b6f2f7 commit d0099cd

File tree

6 files changed

+79
-1
lines changed

6 files changed

+79
-1
lines changed

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.time.Instant;
2222

2323
import static com.mongodb.client.model.expressions.Expressions.of;
24+
import static com.mongodb.client.model.expressions.Expressions.ofMap;
2425

2526
/**
2627
* Expresses a document value. A document is an ordered set of fields, where the
@@ -85,6 +86,13 @@ default DocumentExpression getDocument(final String fieldName, final Bson other)
8586
return getDocument(fieldName, of(other));
8687
}
8788

89+
<T extends Expression> MapExpression<T> getMap(String fieldName);
90+
<T extends Expression> MapExpression<T> getMap(String fieldName, MapExpression<T> other);
91+
92+
default <T extends Expression> MapExpression<T> getMap(final String fieldName, final Bson other) {
93+
return getMap(fieldName, ofMap(other));
94+
}
95+
8896
<T extends Expression> ArrayExpression<T> getArray(String fieldName);
8997

9098
<T extends Expression> ArrayExpression<T> getArray(String fieldName, ArrayExpression<? extends T> other);

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,5 +111,7 @@ public interface Expression {
111111
<T extends Expression> ArrayExpression<T> isArrayOr(ArrayExpression<? extends T> other);
112112
<T extends DocumentExpression> T isDocumentOr(T other);
113113

114+
<T extends Expression> MapExpression<T> isMapOr(MapExpression<T> other);
115+
114116
StringExpression asString();
115117
}

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,16 @@ public DocumentExpression getDocument(final String fieldName) {
237237
return new MqlExpression<>(getFieldInternal(fieldName));
238238
}
239239

240+
@Override
241+
public <R extends Expression> MapExpression<R> getMap(final String field) {
242+
return new MqlExpression<>(getFieldInternal(field));
243+
}
244+
245+
@Override
246+
public <R extends Expression> MapExpression<R> getMap(final String field, final MapExpression<R> other) {
247+
return getMap(field).isMapOr(other);
248+
}
249+
240250
@Override
241251
public DocumentExpression getDocument(final String fieldName, final DocumentExpression other) {
242252
return getDocument(fieldName).isDocumentOr(other);
@@ -381,6 +391,15 @@ public <R extends DocumentExpression> R isDocumentOr(final R other) {
381391
return this.isDocument().cond(this.assertImplementsAllExpressions(), other);
382392
}
383393

394+
public BooleanExpression isMap() {
395+
return new MqlExpression<>(ast("$type")).eq(of("object"));
396+
}
397+
398+
@Override
399+
public <R extends Expression> MapExpression<R> isMapOr(final MapExpression<R> other) {
400+
return this.isMap().cond(this.assertImplementsAllExpressions(), other);
401+
}
402+
384403
@Override
385404
public StringExpression asString() {
386405
return new MqlExpression<>(astWrapped("$toString"));

driver-core/src/test/functional/com/mongodb/client/model/expressions/DocumentExpressionsFunctionalTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
import static com.mongodb.client.model.expressions.Expressions.of;
2929
import static com.mongodb.client.model.expressions.Expressions.ofIntegerArray;
30+
import static com.mongodb.client.model.expressions.Expressions.ofMap;
3031
import static org.junit.jupiter.api.Assertions.assertThrows;
3132

3233
@SuppressWarnings("ConstantConditions")
@@ -120,6 +121,8 @@ public void getFieldOrTest() {
120121
// no convenience for arrays
121122
assertExpression(Document.parse("{b: 2}"), ofDoc("{a: {b: 2}}")
122123
.getDocument("a", Document.parse("{z: 99}")));
124+
assertExpression(Document.parse("{b: 2}"), ofDoc("{a: {b: 2}}")
125+
.getMap("a", Document.parse("{z: 99}")));
123126

124127
// normal
125128
assertExpression(true, ofDoc("{a: true}").getBoolean("a", of(false)));
@@ -131,6 +134,8 @@ public void getFieldOrTest() {
131134
assertExpression(Arrays.asList(3, 2), ofDoc("{a: [3, 2]}").getArray("a", ofIntegerArray(99, 88)));
132135
assertExpression(Document.parse("{b: 2}"), ofDoc("{a: {b: 2}}")
133136
.getDocument("a", of(Document.parse("{z: 99}"))));
137+
assertExpression(Document.parse("{b: 2}"), ofDoc("{a: {b: 2}}")
138+
.getMap("a", ofMap(Document.parse("{z: 99}"))));
134139

135140
// right branch (missing field)
136141
assertExpression(false, ofDoc("{}").getBoolean("a", false));
@@ -145,6 +150,8 @@ public void getFieldOrTest() {
145150
assertExpression(Arrays.asList(99, 88), ofDoc("{}").getArray("a", ofIntegerArray(99, 88)));
146151
assertExpression(Document.parse("{z: 99}"), ofDoc("{}")
147152
.getDocument("a", Document.parse("{z: 99}")));
153+
assertExpression(Document.parse("{z: 99}"), ofDoc("{}")
154+
.getMap("a", Document.parse("{z: 99}")));
148155

149156
// int vs num
150157
assertExpression(99, ofDoc("{a: 1.1}").getInteger("a", of(99)));

driver-core/src/test/functional/com/mongodb/client/model/expressions/MapExpressionsFunctionalTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,16 @@ public void entrySetTest() {
117117
.entrySet()
118118
.map(v -> v.setValue(v.getValue().add(1)))
119119
.asMap(v -> v));
120+
121+
// via getMap
122+
DocumentExpression doc = of(Document.parse("{ instock: { warehouse1: 2500, warehouse2: 500 } }"));
123+
assertExpression(
124+
Arrays.asList(
125+
Document.parse("{'k': 'warehouse1', 'v': 2500}"),
126+
Document.parse("{'k': 'warehouse2', 'v': 500}")),
127+
doc.getMap("instock").entrySet(),
128+
"{'$objectToArray': {'$getField': {'input': {'$literal': "
129+
+ "{'instock': {'warehouse1': 2500, 'warehouse2': 500}}}, 'field': 'instock'}}}");
120130
}
121131

122132
@Test

driver-core/src/test/functional/com/mongodb/client/model/expressions/TypeExpressionsFunctionalTest.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
import static com.mongodb.client.model.expressions.Expressions.of;
3232
import static com.mongodb.client.model.expressions.Expressions.ofIntegerArray;
33+
import static com.mongodb.client.model.expressions.Expressions.ofMap;
3334
import static com.mongodb.client.model.expressions.Expressions.ofNull;
3435
import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE_TIME;
3536
import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -103,13 +104,44 @@ public void isArrayOrTest() {
103104
@Test
104105
public void isDocumentOrTest() {
105106
BsonDocument doc = BsonDocument.parse("{a: 1}");
106-
assertExpression(doc,
107+
assertExpression(
108+
doc,
107109
of(doc).isDocumentOr(of(BsonDocument.parse("{b: 2}"))),
108110
"{'$cond': [{'$eq': [{'$type': {'$literal': {'a': 1}}}, 'object']}, "
109111
+ "{'$literal': {'a': 1}}, {'$literal': {'b': 2}}]}");
110112
// non-document:
111113
assertExpression(doc, ofIntegerArray(1).isDocumentOr(of(doc)));
112114
assertExpression(doc, ofNull().isDocumentOr(of(doc)));
115+
116+
// maps are documents
117+
assertExpression(doc, ofMap(doc).isDocumentOr(of(BsonDocument.parse("{x: 9}"))));
118+
119+
// conversion between maps and documents
120+
MapExpression<IntegerExpression> first = ofMap(doc);
121+
DocumentExpression second = first.isDocumentOr(of(BsonDocument.parse("{}")));
122+
MapExpression<IntegerExpression> third = second.isMapOr(ofMap(BsonDocument.parse("{}")));
123+
assertExpression(
124+
true,
125+
first.eq(second));
126+
assertExpression(
127+
true,
128+
second.eq(third));
129+
}
130+
131+
@Test
132+
public void isMapOrTest() {
133+
BsonDocument map = BsonDocument.parse("{a: 1}");
134+
assertExpression(
135+
map,
136+
ofMap(map).isMapOr(ofMap(BsonDocument.parse("{b: 2}"))),
137+
"{'$cond': [{'$eq': [{'$type': {'$literal': {'a': 1}}}, 'object']}, "
138+
+ "{'$literal': {'a': 1}}, {'$literal': {'b': 2}}]}");
139+
// non-map:
140+
assertExpression(map, ofIntegerArray(1).isMapOr(ofMap(map)));
141+
assertExpression(map, ofNull().isMapOr(ofMap(map)));
142+
143+
// documents are maps
144+
assertExpression(map, of(map).isMapOr(ofMap(BsonDocument.parse("{x: 9}"))));
113145
}
114146

115147
// conversions

0 commit comments

Comments
 (0)