diff options
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.cpp | 57 |
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 |