summaryrefslogtreecommitdiff
path: root/src/mongo/db/exec/add_fields_projection_executor_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/exec/add_fields_projection_executor_test.cpp')
-rw-r--r--src/mongo/db/exec/add_fields_projection_executor_test.cpp57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/mongo/db/exec/add_fields_projection_executor_test.cpp b/src/mongo/db/exec/add_fields_projection_executor_test.cpp
index 0c5fd22c5f6..7230c6495c8 100644
--- a/src/mongo/db/exec/add_fields_projection_executor_test.cpp
+++ b/src/mongo/db/exec/add_fields_projection_executor_test.cpp
@@ -681,5 +681,62 @@ TEST(AddFieldsProjectionExecutorExecutionTest, DoNotExtractComputedProjectionWit
addFields.serializeTransformation(boost::none));
}
+TEST(AddFieldsProjectionExecutorExecutionTest,
+ ExtractComputedProjectionShouldNotHideDependentSubFields) {
+ boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest());
+ AddFieldsProjectionExecutor addFields(expCtx);
+ addFields.parse(BSON("obj"
+ << "$myMeta"
+ << "b" << BSON("$add" << BSON_ARRAY("$obj.a" << 1))));
+
+ const std::set<StringData> reservedNames{};
+ auto [extractedAddFields, deleteFlag] =
+ addFields.extractComputedProjections("myMeta", "meta", reservedNames);
+
+ ASSERT_EQ(extractedAddFields.nFields(), 0);
+ ASSERT_EQ(deleteFlag, false);
+
+ auto expectedProjection =
+ Document(fromjson("{obj: '$myMeta', b: {$add: ['$obj.a', {$const: 1}]}}"));
+ ASSERT_DOCUMENT_EQ(expectedProjection, addFields.serializeTransformation(boost::none));
+}
+
+TEST(AddFieldsProjectionExecutorExecutionTest,
+ ExtractComputedProjectionShouldNotHideDependentFieldsWithDottedSibling) {
+ boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest());
+ AddFieldsProjectionExecutor addFields(expCtx);
+ addFields.parse(BSON("a"
+ << "$myMeta"
+ << "c.b"
+ << "$a.x"));
+
+ const std::set<StringData> reservedNames{};
+ auto [extractedAddFields, deleteFlag] =
+ addFields.extractComputedProjections("myMeta", "meta", reservedNames);
+
+ ASSERT_EQ(extractedAddFields.nFields(), 0);
+ ASSERT_EQ(deleteFlag, false);
+
+ auto expectedProjection = Document(fromjson("{a: '$myMeta', c: {b: '$a.x'}}"));
+ ASSERT_DOCUMENT_EQ(expectedProjection, addFields.serializeTransformation(boost::none));
+}
+
+TEST(AddFieldsProjectionExecutorExecutionTest, ExtractComputedProjectionShouldNotIncludeId) {
+ boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest());
+ AddFieldsProjectionExecutor addFields(expCtx);
+ addFields.parse(BSON("a" << BSON("$sum" << BSON_ARRAY("$myMeta"
+ << "$_id"))));
+
+ const std::set<StringData> reservedNames{};
+ auto [extractedAddFields, deleteFlag] =
+ addFields.extractComputedProjections("myMeta", "meta", reservedNames);
+
+ ASSERT_EQ(extractedAddFields.nFields(), 0);
+ ASSERT_EQ(deleteFlag, false);
+
+ auto expectedProjection = Document(fromjson("{a: {$sum: ['$myMeta', '$_id']}}"));
+ ASSERT_DOCUMENT_EQ(expectedProjection, addFields.serializeTransformation(boost::none));
+}
+
} // namespace
} // namespace mongo::projection_executor