Skip to content

Commit 5cd16db

Browse files
committed
Add "has"
1 parent 282427d commit 5cd16db

File tree

5 files changed

+30
-7
lines changed

5 files changed

+30
-7
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@
2020

2121
public interface MapExpression<T extends Expression> extends Expression {
2222

23+
BooleanExpression has(StringExpression key);
24+
25+
default BooleanExpression has(String key) {
26+
return has(of(key));
27+
}
28+
2329
// TODO-END doc "user asserts"
2430
T get(StringExpression key);
2531

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -777,6 +777,17 @@ public StringExpression substrBytes(final IntegerExpression start, final Integer
777777
return new MqlExpression<>(ast("$substrBytes", start, length));
778778
}
779779

780+
@Override
781+
public BooleanExpression has(StringExpression key) {
782+
return get(key).ne(ofRem());
783+
}
784+
785+
static <R extends Expression> R ofRem() {
786+
// $$REMOVE is intentionally not exposed to users
787+
return new MqlExpression<>((cr) -> new MqlExpression.AstPlaceholder(new BsonString("$$REMOVE")))
788+
.assertImplementsAllExpressions();
789+
}
790+
780791
/** @see MapExpression
781792
* @see EntryExpression */
782793

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,5 @@ public BsonValue readValue(final BsonReader reader, final DecoderContext decoder
126126
}
127127
}
128128

129-
130-
static <R extends Expression> R ofRem() {
131-
// $$REMOVE is intentionally not exposed to users
132-
return new MqlExpression<>((cr) -> new MqlExpression.AstPlaceholder(new BsonString("$$REMOVE")))
133-
.assertImplementsAllExpressions();
134-
}
135129
}
136130

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class ComparisonExpressionsFunctionalTest extends AbstractExpressionsFunctionalT
4040

4141
// https://www.mongodb.com/docs/manual/reference/bson-type-comparison-order/#std-label-bson-types-comparison-order
4242
private final List<Expression> sampleValues = Arrays.asList(
43-
ofRem(),
43+
MqlExpression.ofRem(),
4444
ofNull(),
4545
of(0),
4646
of(1),

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,18 @@ public void getSetMapTest() {
7676
ofMap(Document.parse("{ 'null': null }")).get("null", of(1)));
7777
}
7878

79+
@Test
80+
public void hasMapTest() {
81+
assertExpression(
82+
true,
83+
mapKey123.has(of("key")),
84+
"{'$ne': [{'$getField': {'input': {'$setField': {'field': 'key', 'input': " +
85+
"{'$literal': {}}, 'value': 123}}, 'field': 'key'}}, '$$REMOVE']}");
86+
assertExpression(
87+
false,
88+
mapKey123.has("not_key"));
89+
}
90+
7991
@Test
8092
public void getSetEntryTest() {
8193
EntryExpression<IntegerExpression> entryA1 = ofEntry(of("keyA"), of(1));

0 commit comments

Comments
 (0)