summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/expression_convert_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/pipeline/expression_convert_test.cpp')
-rw-r--r--src/mongo/db/pipeline/expression_convert_test.cpp119
1 files changed, 113 insertions, 6 deletions
diff --git a/src/mongo/db/pipeline/expression_convert_test.cpp b/src/mongo/db/pipeline/expression_convert_test.cpp
index 678c29b5b16..c1cfd639ce1 100644
--- a/src/mongo/db/pipeline/expression_convert_test.cpp
+++ b/src/mongo/db/pipeline/expression_convert_test.cpp
@@ -67,10 +67,11 @@ TEST_F(ExpressionConvertTest, ParseAndSerializeWithoutOptionalArguments) {
auto convertExp = Expression::parseExpression(expCtx.get(), spec, expCtx->variablesParseState);
ASSERT_VALUE_EQ(Value(fromjson("{$convert: {input: '$path1', to: {$const: 'int'}}}")),
- convertExp->serialize(false));
+ convertExp->serialize());
ASSERT_VALUE_EQ(Value(fromjson("{$convert: {input: '$path1', to: {$const: 'int'}}}")),
- convertExp->serialize(true));
+ convertExp->serialize(SerializationOptions{
+ boost::make_optional(ExplainOptions::Verbosity::kQueryPlanner)}));
}
TEST_F(ExpressionConvertTest, ParseAndSerializeWithOnError) {
@@ -85,11 +86,12 @@ TEST_F(ExpressionConvertTest, ParseAndSerializeWithOnError) {
ASSERT_VALUE_EQ(
Value(fromjson("{$convert: {input: '$path1', to: {$const: 'int'}, onError: {$const: 0}}}")),
- convertExp->serialize(false));
+ convertExp->serialize());
ASSERT_VALUE_EQ(
Value(fromjson("{$convert: {input: '$path1', to: {$const: 'int'}, onError: {$const: 0}}}")),
- convertExp->serialize(true));
+ convertExp->serialize(
+ SerializationOptions{boost::make_optional(ExplainOptions::Verbosity::kQueryPlanner)}));
}
TEST_F(ExpressionConvertTest, ParseAndSerializeWithOnNull) {
@@ -104,11 +106,12 @@ TEST_F(ExpressionConvertTest, ParseAndSerializeWithOnNull) {
ASSERT_VALUE_EQ(
Value(fromjson("{$convert: {input: '$path1', to: {$const: 'int'}, onNull: {$const: 0}}}")),
- convertExp->serialize(false));
+ convertExp->serialize());
ASSERT_VALUE_EQ(
Value(fromjson("{$convert: {input: '$path1', to: {$const: 'int'}, onNull: {$const: 0}}}")),
- convertExp->serialize(true));
+ convertExp->serialize(
+ SerializationOptions{boost::make_optional(ExplainOptions::Verbosity::kQueryPlanner)}));
}
TEST_F(ExpressionConvertTest, ConvertWithoutInputFailsToParse) {
@@ -141,6 +144,32 @@ TEST_F(ExpressionConvertTest, ConvertWithoutToFailsToParse) {
});
}
+TEST_F(ExpressionConvertTest, RoundTripSerialization) {
+ auto expCtx = getExpCtx();
+
+ // Round-trip serialization of an argument that *looks* like an expression.
+ auto spec = BSON("$convert" << BSON("input" << BSON("$literal" << BSON("$toString"
+ << "this is a string"))
+ << "to"
+ << "string"));
+ auto convertExp = Expression::parseExpression(expCtx.get(), spec, expCtx->variablesParseState);
+
+ auto opts = SerializationOptions{LiteralSerializationPolicy::kToRepresentativeParseableValue};
+ auto serialized = convertExp->serialize(opts);
+ ASSERT_VALUE_EQ(Value(BSON("$convert" << BSON("input" << BSON("$const" << BSON("?"
+ << "?"))
+ << "to"
+ << BSON("$const"
+ << "string")))),
+ serialized);
+
+ auto roundTrip = Expression::parseExpression(expCtx.get(),
+ serialized.getDocument().toBson(),
+ expCtx->variablesParseState)
+ ->serialize(opts);
+ ASSERT_VALUE_EQ(roundTrip, serialized);
+}
+
TEST_F(ExpressionConvertTest, InvalidTypeNameFails) {
auto expCtx = getExpCtx();
@@ -3445,4 +3474,82 @@ TEST_F(ExpressionConvertShortcutsTest, ThrowsOnConversionFailure) {
}
} // namespace ExpressionConvertShortcutsTest
+
+namespace ExpressionConvertSerializationTest {
+
+using ExpressionConvertSerializationTest = AggregationContextFixture;
+
+TEST_F(ExpressionConvertSerializationTest, ConvertToTypeSerializesCorrectly) {
+ auto expCtx = getExpCtx();
+ auto spec = fromjson("{$convert: {input: '$funnyTest', to: 'bool'}}");
+ auto convertExp = Expression::parseExpression(expCtx.get(), spec, expCtx->variablesParseState);
+
+ ASSERT_VALUE_EQ(Value(fromjson("{$convert: {input: '$funnyTest', to: {$const: 'bool'}}}")),
+ convertExp->serialize(SerializationOptions{}));
+
+ ASSERT_VALUE_EQ(
+ Value(fromjson("{$convert: {input: '$funnyTest', to: {$const: 'bool'}}}")),
+ convertExp->serialize(SerializationOptions::kRepresentativeQueryShapeSerializeOptions));
+
+ ASSERT_VALUE_EQ(Value(fromjson("{$convert: {input: '$funnyTest', to: 'bool'}}")),
+ convertExp->serialize(SerializationOptions::kDebugQueryShapeSerializeOptions));
+}
+
+TEST_F(ExpressionConvertSerializationTest, ConvertToDollarSerializesCorrectly) {
+ auto expCtx = getExpCtx();
+ auto spec = fromjson("{$convert: {input: '$funnyTest', to: {$add: [7, 2]}}}");
+ auto convertExp = Expression::parseExpression(expCtx.get(), spec, expCtx->variablesParseState);
+
+ ASSERT_VALUE_EQ(
+ Value(
+ fromjson("{$convert: {input: '$funnyTest', to: {$add: [{$const: 7}, {$const: 2}]}}}")),
+ convertExp->serialize(SerializationOptions{}));
+
+ ASSERT_VALUE_EQ(
+ Value(fromjson("{$convert: {input: '$funnyTest', to: {$add: [1, 1]}}}")),
+ convertExp->serialize(SerializationOptions::kRepresentativeQueryShapeSerializeOptions));
+
+ ASSERT_VALUE_EQ(
+ Value(fromjson("{$convert: {input: '$funnyTest', to: {$add: '?array<?number>'}}}")),
+ convertExp->serialize(SerializationOptions::kDebugQueryShapeSerializeOptions));
+}
+
+TEST_F(ExpressionConvertSerializationTest, ToStringSerializesCorrectly) {
+ auto expCtx = getExpCtx();
+
+ auto spec = BSON("$toString"
+ << "$funnyTest");
+ auto convertExp = Expression::parseExpression(expCtx.get(), spec, expCtx->variablesParseState);
+
+ ASSERT_VALUE_EQ(Value(fromjson("{$convert: {input: '$funnyTest', to: {$const: 'string'}}}")),
+ convertExp->serialize(SerializationOptions{}));
+
+ ASSERT_VALUE_EQ(
+ Value(fromjson("{$convert: {input: '$funnyTest', to: {$const: 'string'}}}")),
+ convertExp->serialize(SerializationOptions::kRepresentativeQueryShapeSerializeOptions));
+
+ ASSERT_VALUE_EQ(Value(fromjson("{$convert: {input: '$funnyTest', to: 'string'}}")),
+ convertExp->serialize(SerializationOptions::kDebugQueryShapeSerializeOptions));
+}
+
+TEST_F(ExpressionConvertSerializationTest, ToBoolSerializesCorrectly) {
+ auto expCtx = getExpCtx();
+
+ auto spec = BSON("$toBool"
+ << "$funnyTest");
+ auto convertExp = Expression::parseExpression(expCtx.get(), spec, expCtx->variablesParseState);
+
+ ASSERT_VALUE_EQ(Value(fromjson("{$convert: {input: '$funnyTest', to: {$const: 'bool'}}}")),
+ convertExp->serialize(SerializationOptions{}));
+
+ ASSERT_VALUE_EQ(
+ Value(fromjson("{$convert: {input: '$funnyTest', to: {$const: 'bool'}}}")),
+ convertExp->serialize(SerializationOptions::kRepresentativeQueryShapeSerializeOptions));
+
+ ASSERT_VALUE_EQ(Value(fromjson("{$convert: {input: '$funnyTest', to: 'bool'}}")),
+ convertExp->serialize(SerializationOptions::kDebugQueryShapeSerializeOptions));
+}
+
+} // namespace ExpressionConvertSerializationTest
+
} // namespace mongo