diff options
Diffstat (limited to 'src/mongo/db/update/update_object_node_test.cpp')
-rw-r--r-- | src/mongo/db/update/update_object_node_test.cpp | 629 |
1 files changed, 316 insertions, 313 deletions
diff --git a/src/mongo/db/update/update_object_node_test.cpp b/src/mongo/db/update/update_object_node_test.cpp index 1e699326587..c410553eb9d 100644 --- a/src/mongo/db/update/update_object_node_test.cpp +++ b/src/mongo/db/update/update_object_node_test.cpp @@ -33,6 +33,7 @@ #include "mongo/bson/mutable/algorithm.h" #include "mongo/bson/mutable/mutable_bson_test_utils.h" #include "mongo/db/json.h" +#include "mongo/db/pipeline/expression_context_for_test.h" #include "mongo/db/query/collation/collator_interface_mock.h" #include "mongo/db/update/conflict_placeholder_node.h" #include "mongo/db/update/rename_node.h" @@ -49,14 +50,14 @@ using mongo::mutablebson::Element; TEST(UpdateObjectNodeTest, InvalidPathFailsToParse) { auto update = fromjson("{$set: {'': 5}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"][""], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -66,42 +67,42 @@ TEST(UpdateObjectNodeTest, InvalidPathFailsToParse) { TEST(UpdateObjectNodeTest, ValidIncPathParsesSuccessfully) { auto update = fromjson("{$inc: {'a.b': 5}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_INC, update["$inc"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); } TEST(UpdateObjectNodeTest, ValidMulPathParsesSuccessfully) { auto update = fromjson("{$mul: {'a.b': 5}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_MUL, update["$mul"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); } TEST(UpdateObjectNodeTest, ValidRenamePathParsesSuccessfully) { auto update = fromjson("{$rename: {'a.b': 'c.d'}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_RENAME, update["$rename"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -122,140 +123,140 @@ TEST(UpdateObjectNodeTest, ValidRenamePathParsesSuccessfully) { TEST(UpdateObjectNodeTest, ValidSetPathParsesSuccessfully) { auto update = fromjson("{$set: {'a.b': 5}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); } TEST(UpdateObjectNodeTest, ValidUnsetPathParsesSuccessfully) { auto update = fromjson("{$unset: {'a.b': 5}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_UNSET, update["$unset"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); } TEST(UpdateObjectNodeTest, ValidAddToSetPathParsesSuccessfully) { auto update = fromjson("{$addToSet: {'a.b': 5}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_ADD_TO_SET, update["$addToSet"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); } TEST(UpdateObjectNodeTest, ValidPopPathParsesSuccessfully) { auto update = fromjson("{$pop: {'a.b': 1}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_POP, update["$pop"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); } TEST(UpdateObjectNodeTest, ValidMaxPathParsesSuccessfully) { auto update = fromjson("{$max: {'a.b': 1}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_MAX, update["$max"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); } TEST(UpdateObjectNodeTest, ValidMinPathParsesSuccessfully) { auto update = fromjson("{$min: {'a.b': 1}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_MIN, update["$min"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); } TEST(UpdateObjectNodeTest, ValidCurrentDatePathParsesSuccessfully) { auto update = fromjson("{$currentDate: {'a.b': true}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_CURRENTDATE, update["$currentDate"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); } TEST(UpdateObjectNodeTest, ValidSetOnInsertPathParsesSuccessfully) { auto update = fromjson("{$setOnInsert: {'a.b': true}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET_ON_INSERT, update["$setOnInsert"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); } TEST(UpdateObjectNodeTest, ValidPushParsesSuccessfully) { auto update = fromjson("{$push: {'a.b': {$each: [0, 1], $sort: 1, $position: 0, $slice: 10}}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_PUSH, update["$push"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); } TEST(UpdateObjectNodeTest, MultiplePositionalElementsFailToParse) { auto update = fromjson("{$set: {'a.$.b.$': 5}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$.b.$"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -266,14 +267,14 @@ TEST(UpdateObjectNodeTest, MultiplePositionalElementsFailToParse) { TEST(UpdateObjectNodeTest, ParsingSetsPositionalTrue) { auto update = fromjson("{$set: {'a.$.b': 5}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$.b"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_OK(result); @@ -282,14 +283,14 @@ TEST(UpdateObjectNodeTest, ParsingSetsPositionalTrue) { TEST(UpdateObjectNodeTest, ParsingSetsPositionalFalse) { auto update = fromjson("{$set: {'a.b': 5}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_OK(result); @@ -298,14 +299,14 @@ TEST(UpdateObjectNodeTest, ParsingSetsPositionalFalse) { TEST(UpdateObjectNodeTest, PositionalElementFirstPositionFailsToParse) { auto update = fromjson("{$set: {'$': 5}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["$"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -316,20 +317,20 @@ TEST(UpdateObjectNodeTest, PositionalElementFirstPositionFailsToParse) { TEST(UpdateObjectNodeTest, TwoModifiersOnSameFieldFailToParse) { auto update = fromjson("{$set: {a: 5}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers)); auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -339,40 +340,40 @@ TEST(UpdateObjectNodeTest, TwoModifiersOnSameFieldFailToParse) { TEST(UpdateObjectNodeTest, TwoModifiersOnDifferentFieldsParseSuccessfully) { auto update = fromjson("{$set: {a: 5, b: 6}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); } TEST(UpdateObjectNodeTest, TwoModifiersWithSameDottedPathFailToParse) { auto update = fromjson("{$set: {'a.b': 5}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -383,20 +384,20 @@ TEST(UpdateObjectNodeTest, TwoModifiersWithSameDottedPathFailToParse) { TEST(UpdateObjectNodeTest, FirstModifierPrefixOfSecondFailToParse) { auto update = fromjson("{$set: {a: 5, 'a.b': 6}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers)); auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -407,20 +408,20 @@ TEST(UpdateObjectNodeTest, FirstModifierPrefixOfSecondFailToParse) { TEST(UpdateObjectNodeTest, FirstModifierDottedPrefixOfSecondFailsToParse) { auto update = fromjson("{$set: {'a.b': 5, 'a.b.c': 6}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.b.c"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -431,20 +432,20 @@ TEST(UpdateObjectNodeTest, FirstModifierDottedPrefixOfSecondFailsToParse) { TEST(UpdateObjectNodeTest, SecondModifierPrefixOfFirstFailsToParse) { auto update = fromjson("{$set: {'a.b': 5, a: 6}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -454,20 +455,20 @@ TEST(UpdateObjectNodeTest, SecondModifierPrefixOfFirstFailsToParse) { TEST(UpdateObjectNodeTest, SecondModifierDottedPrefixOfFirstFailsToParse) { auto update = fromjson("{$set: {'a.b.c': 5, 'a.b': 6}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.b.c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -478,80 +479,80 @@ TEST(UpdateObjectNodeTest, SecondModifierDottedPrefixOfFirstFailsToParse) { TEST(UpdateObjectNodeTest, ModifiersWithCommonPrefixParseSuccessfully) { auto update = fromjson("{$set: {'a.b': 5, 'a.c': 6}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); } TEST(UpdateObjectNodeTest, ModifiersWithCommonDottedPrefixParseSuccessfully) { auto update = fromjson("{$set: {'a.b.c': 5, 'a.b.d': 6}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.b.c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.b.d"], - collator, + expCtx, arrayFilters, foundIdentifiers)); } TEST(UpdateObjectNodeTest, ModifiersWithCommonPrefixDottedSuffixParseSuccessfully) { auto update = fromjson("{$set: {'a.b.c': 5, 'a.d.e': 6}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.b.c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.d.e"], - collator, + expCtx, arrayFilters, foundIdentifiers)); } TEST(UpdateObjectNodeTest, TwoModifiersOnSamePositionalFieldFailToParse) { auto update = fromjson("{$set: {'a.$': 5}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$"], - collator, + expCtx, arrayFilters, foundIdentifiers)); auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -562,60 +563,60 @@ TEST(UpdateObjectNodeTest, TwoModifiersOnSamePositionalFieldFailToParse) { TEST(UpdateObjectNodeTest, PositionalFieldsWithDifferentPrefixesParseSuccessfully) { auto update = fromjson("{$set: {'a.$': 5, 'b.$': 6}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["b.$"], - collator, + expCtx, arrayFilters, foundIdentifiers)); } TEST(UpdateObjectNodeTest, PositionalAndNonpositionalFieldWithCommonPrefixParseSuccessfully) { auto update = fromjson("{$set: {'a.$': 5, 'a.0': 6}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.0"], - collator, + expCtx, arrayFilters, foundIdentifiers)); } TEST(UpdateObjectNodeTest, TwoModifiersWithSamePositionalDottedPathFailToParse) { auto update = fromjson("{$set: {'a.$.b': 5}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$.b"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -626,20 +627,20 @@ TEST(UpdateObjectNodeTest, TwoModifiersWithSamePositionalDottedPathFailToParse) TEST(UpdateObjectNodeTest, FirstModifierPositionalPrefixOfSecondFailsToParse) { auto update = fromjson("{$set: {'a.$': 5, 'a.$.b': 6}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$"], - collator, + expCtx, arrayFilters, foundIdentifiers)); auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$.b"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -650,20 +651,20 @@ TEST(UpdateObjectNodeTest, FirstModifierPositionalPrefixOfSecondFailsToParse) { TEST(UpdateObjectNodeTest, SecondModifierPositionalPrefixOfFirstFailsToParse) { auto update = fromjson("{$set: {'a.$.b': 5, 'a.$': 6}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -674,54 +675,54 @@ TEST(UpdateObjectNodeTest, SecondModifierPositionalPrefixOfFirstFailsToParse) { TEST(UpdateObjectNodeTest, FirstModifierFieldPrefixOfSecondParsesSuccessfully) { auto update = fromjson("{$set: {'a': 5, 'ab': 6}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["ab"], - collator, + expCtx, arrayFilters, foundIdentifiers)); } TEST(UpdateObjectNodeTest, SecondModifierFieldPrefixOfSecondParsesSuccessfully) { auto update = fromjson("{$set: {'ab': 5, 'a': 6}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["ab"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers)); } TEST(UpdateObjectNodeTest, IdentifierWithoutArrayFilterFailsToParse) { auto update = fromjson("{$set: {'a.$[i]': 5}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$[i]"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -732,14 +733,14 @@ TEST(UpdateObjectNodeTest, IdentifierWithoutArrayFilterFailsToParse) { TEST(UpdateObjectNodeTest, IdentifierInMiddleOfPathWithoutArrayFilterFailsToParse) { auto update = fromjson("{$set: {'a.$[i].b': 5}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$[i].b"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -750,14 +751,14 @@ TEST(UpdateObjectNodeTest, IdentifierInMiddleOfPathWithoutArrayFilterFailsToPars TEST(UpdateObjectNodeTest, EmptyIdentifierParsesSuccessfully) { auto update = fromjson("{$set: {'a.$[]': 5}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$[]"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_TRUE(foundIdentifiers.empty()); @@ -765,14 +766,14 @@ TEST(UpdateObjectNodeTest, EmptyIdentifierParsesSuccessfully) { TEST(UpdateObjectNodeTest, EmptyIdentifierInMiddleOfPathParsesSuccessfully) { auto update = fromjson("{$set: {'a.$[].b': 5}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$[].b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_TRUE(foundIdentifiers.empty()); @@ -781,15 +782,15 @@ TEST(UpdateObjectNodeTest, EmptyIdentifierInMiddleOfPathParsesSuccessfully) { TEST(UpdateObjectNodeTest, IdentifierWithArrayFilterParsesSuccessfully) { auto update = fromjson("{$set: {'a.$[i]': 5}}"); auto arrayFilter = fromjson("{i: 0}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; - arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, collator)); + arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, expCtx)); std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$[i]"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_EQ(foundIdentifiers.size(), 1U); @@ -799,15 +800,15 @@ TEST(UpdateObjectNodeTest, IdentifierWithArrayFilterParsesSuccessfully) { TEST(UpdateObjectNodeTest, IdentifierWithArrayFilterInMiddleOfPathParsesSuccessfully) { auto update = fromjson("{$set: {'a.$[i].b': 5}}"); auto arrayFilter = fromjson("{i: 0}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; - arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, collator)); + arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, expCtx)); std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$[i].b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_EQ(foundIdentifiers.size(), 1U); @@ -817,15 +818,15 @@ TEST(UpdateObjectNodeTest, IdentifierWithArrayFilterInMiddleOfPathParsesSuccessf TEST(UpdateObjectNodeTest, IdentifierInFirstPositionFailsToParse) { auto update = fromjson("{$set: {'$[i]': 5}}"); auto arrayFilter = fromjson("{i: 0}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; - arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, collator)); + arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, expCtx)); std::set<std::string> foundIdentifiers; UpdateObjectNode root; auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["$[i]"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -838,15 +839,15 @@ TEST(UpdateObjectNodeTest, IdentifierInFirstPositionFailsToParse) { TEST(UpdateObjectNodeTest, IdentifierInFirstPositionWithSuffixFailsToParse) { auto update = fromjson("{$set: {'$[i].a': 5}}"); auto arrayFilter = fromjson("{i: 0}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; - arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, collator)); + arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, expCtx)); std::set<std::string> foundIdentifiers; UpdateObjectNode root; auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["$[i].a"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -859,15 +860,15 @@ TEST(UpdateObjectNodeTest, IdentifierInFirstPositionWithSuffixFailsToParse) { TEST(UpdateObjectNodeTest, CreateObjectNodeInSamePositionAsArrayNodeFailsToParse) { auto update = fromjson("{$set: {'a.$[i]': 5, 'a.0': 6}}"); auto arrayFilter = fromjson("{i: 0}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; - arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, collator)); + arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, expCtx)); std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$[i]"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_EQ(foundIdentifiers.size(), 1U); @@ -875,7 +876,7 @@ TEST(UpdateObjectNodeTest, CreateObjectNodeInSamePositionAsArrayNodeFailsToParse auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.0"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -887,21 +888,21 @@ TEST(UpdateObjectNodeTest, CreateObjectNodeInSamePositionAsArrayNodeFailsToParse TEST(UpdateObjectNodeTest, CreateArrayNodeInSamePositionAsObjectNodeFailsToParse) { auto update = fromjson("{$set: {'a.0': 5, 'a.$[i]': 6}}"); auto arrayFilter = fromjson("{i: 0}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; - arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, collator)); + arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, expCtx)); std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.0"], - collator, + expCtx, arrayFilters, foundIdentifiers)); auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$[i]"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -913,15 +914,15 @@ TEST(UpdateObjectNodeTest, CreateArrayNodeInSamePositionAsObjectNodeFailsToParse TEST(UpdateObjectNodeTest, CreateLeafNodeInSamePositionAsArrayNodeFailsToParse) { auto update = fromjson("{$set: {'a.$[i]': 5, a: 6}}"); auto arrayFilter = fromjson("{i: 0}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; - arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, collator)); + arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, expCtx)); std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$[i]"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_EQ(foundIdentifiers.size(), 1U); @@ -929,7 +930,7 @@ TEST(UpdateObjectNodeTest, CreateLeafNodeInSamePositionAsArrayNodeFailsToParse) auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -940,21 +941,21 @@ TEST(UpdateObjectNodeTest, CreateLeafNodeInSamePositionAsArrayNodeFailsToParse) TEST(UpdateObjectNodeTest, CreateArrayNodeInSamePositionAsLeafNodeFailsToParse) { auto update = fromjson("{$set: {a: 5, 'a.$[i]': 6}}"); auto arrayFilter = fromjson("{i: 0}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; - arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, collator)); + arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, expCtx)); std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers)); auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$[i]"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -967,16 +968,16 @@ TEST(UpdateObjectNodeTest, CreateTwoChildrenOfArrayNodeParsesSuccessfully) { auto update = fromjson("{$set: {'a.$[i]': 5, 'a.$[j]': 6}}"); auto arrayFilterI = fromjson("{i: 0}"); auto arrayFilterJ = fromjson("{j: 0}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; - arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterI, collator)); - arrayFilters["j"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterJ, collator)); + arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterI, expCtx)); + arrayFilters["j"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterJ, expCtx)); std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$[i]"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_EQ(foundIdentifiers.size(), 1U); @@ -984,7 +985,7 @@ TEST(UpdateObjectNodeTest, CreateTwoChildrenOfArrayNodeParsesSuccessfully) { ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$[j]"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_EQ(foundIdentifiers.size(), 2U); @@ -996,15 +997,15 @@ TEST(UpdateObjectNodeTest, ConflictAtArrayNodeChildFailsToParse) { auto update1 = fromjson("{$set: {'a.$[i]': 5}}"); auto update2 = fromjson("{$set: {'a.$[i]': 6}}"); auto arrayFilterI = fromjson("{i: 0}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; - arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterI, collator)); + arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterI, expCtx)); std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update1["$set"]["a.$[i]"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_EQ(foundIdentifiers.size(), 1U); @@ -1012,7 +1013,7 @@ TEST(UpdateObjectNodeTest, ConflictAtArrayNodeChildFailsToParse) { auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update2["$set"]["a.$[i]"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -1024,15 +1025,15 @@ TEST(UpdateObjectNodeTest, ConflictAtArrayNodeChildFailsToParse) { TEST(UpdateObjectNodeTest, ConflictThroughArrayNodeChildFailsToParse) { auto update = fromjson("{$set: {'a.$[i].b': 5, 'a.$[i].b.c': 6}}"); auto arrayFilterI = fromjson("{i: 0}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; - arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterI, collator)); + arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterI, expCtx)); std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$[i].b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_EQ(foundIdentifiers.size(), 1U); @@ -1040,7 +1041,7 @@ TEST(UpdateObjectNodeTest, ConflictThroughArrayNodeChildFailsToParse) { auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$[i].b.c"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -1053,16 +1054,16 @@ TEST(UpdateObjectNodeTest, NoConflictDueToDifferentArrayNodeChildrenParsesSucces auto update = fromjson("{$set: {'a.$[i].b': 5, 'a.$[j].b.c': 6}}"); auto arrayFilterI = fromjson("{i: 0}"); auto arrayFilterJ = fromjson("{j: 0}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; - arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterI, collator)); - arrayFilters["j"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterJ, collator)); + arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterI, expCtx)); + arrayFilters["j"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterJ, expCtx)); std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$[i].b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_EQ(foundIdentifiers.size(), 1U); @@ -1070,7 +1071,7 @@ TEST(UpdateObjectNodeTest, NoConflictDueToDifferentArrayNodeChildrenParsesSucces ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$[j].b.c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_EQ(foundIdentifiers.size(), 2U); @@ -1082,16 +1083,16 @@ TEST(UpdateObjectNodeTest, MultipleArrayNodesAlongPathParsesSuccessfully) { auto update = fromjson("{$set: {'a.$[i].$[j].$[i]': 5}}"); auto arrayFilterI = fromjson("{i: 0}"); auto arrayFilterJ = fromjson("{j: 0}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; - arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterI, collator)); - arrayFilters["j"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterJ, collator)); + arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterI, expCtx)); + arrayFilters["j"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterJ, expCtx)); std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.$[i].$[j].$[i]"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_EQ(foundIdentifiers.size(), 2U); @@ -1121,20 +1122,20 @@ TEST(UpdateObjectNodeTest, DistinctFieldsMergeCorrectly) { auto setUpdate1 = fromjson("{$set: {'a': 5}}"); auto setUpdate2 = fromjson("{$set: {'ab': 6}}"); FieldRef fakeFieldRef("root"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode setRoot1, setRoot2; ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot1, modifiertable::ModifierType::MOD_SET, setUpdate1["$set"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot2, modifiertable::ModifierType::MOD_SET, setUpdate2["$set"]["ab"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1151,20 +1152,20 @@ TEST(UpdateObjectNodeTest, NestedMergeSucceeds) { auto setUpdate1 = fromjson("{$set: {'a.c': 5}}"); auto setUpdate2 = fromjson("{$set: {'a.d': 6}}"); FieldRef fakeFieldRef("root"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode setRoot1, setRoot2; ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot1, modifiertable::ModifierType::MOD_SET, setUpdate1["$set"]["a.c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot2, modifiertable::ModifierType::MOD_SET, setUpdate2["$set"]["a.d"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1187,20 +1188,20 @@ TEST(UpdateObjectNodeTest, DoublyNestedMergeSucceeds) { auto setUpdate1 = fromjson("{$set: {'a.b.c': 5}}"); auto setUpdate2 = fromjson("{$set: {'a.b.d': 6}}"); FieldRef fakeFieldRef("root"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode setRoot1, setRoot2; ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot1, modifiertable::ModifierType::MOD_SET, setUpdate1["$set"]["a.b.c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot2, modifiertable::ModifierType::MOD_SET, setUpdate2["$set"]["a.b.d"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1229,20 +1230,20 @@ TEST(UpdateObjectNodeTest, FieldAndPositionalMergeCorrectly) { auto setUpdate1 = fromjson("{$set: {'a.b': 5}}"); auto setUpdate2 = fromjson("{$set: {'a.$': 6}}"); FieldRef fakeFieldRef("root"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode setRoot1, setRoot2; ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot1, modifiertable::ModifierType::MOD_SET, setUpdate1["$set"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot2, modifiertable::ModifierType::MOD_SET, setUpdate2["$set"]["a.$"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1266,20 +1267,20 @@ TEST(UpdateObjectNodeTest, MergeThroughPositionalSucceeds) { auto setUpdate1 = fromjson("{$set: {'a.$.b': 5}}"); auto setUpdate2 = fromjson("{$set: {'a.$.c': 6}}"); FieldRef fakeFieldRef("root"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode setRoot1, setRoot2; ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot1, modifiertable::ModifierType::MOD_SET, setUpdate1["$set"]["a.$.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot2, modifiertable::ModifierType::MOD_SET, setUpdate2["$set"]["a.$.c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1308,20 +1309,20 @@ TEST(UpdateObjectNodeTest, TopLevelConflictFails) { auto setUpdate1 = fromjson("{$set: {'a': 5}}"); auto setUpdate2 = fromjson("{$set: {'a': 6}}"); FieldRef fakeFieldRef("root"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode setRoot1, setRoot2; ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot1, modifiertable::ModifierType::MOD_SET, setUpdate1["$set"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot2, modifiertable::ModifierType::MOD_SET, setUpdate2["$set"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1337,20 +1338,20 @@ TEST(UpdateObjectNodeTest, NestedConflictFails) { auto setUpdate1 = fromjson("{$set: {'a.b': 5}}"); auto setUpdate2 = fromjson("{$set: {'a.b': 6}}"); FieldRef fakeFieldRef("root"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode setRoot1, setRoot2; ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot1, modifiertable::ModifierType::MOD_SET, setUpdate1["$set"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot2, modifiertable::ModifierType::MOD_SET, setUpdate2["$set"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1366,20 +1367,20 @@ TEST(UpdateObjectNodeTest, LeftPrefixMergeFails) { auto setUpdate1 = fromjson("{$set: {'a.b': 5}}"); auto setUpdate2 = fromjson("{$set: {'a.b.c': 6}}"); FieldRef fakeFieldRef("root"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode setRoot1, setRoot2; ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot1, modifiertable::ModifierType::MOD_SET, setUpdate1["$set"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot2, modifiertable::ModifierType::MOD_SET, setUpdate2["$set"]["a.b.c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1395,20 +1396,20 @@ TEST(UpdateObjectNodeTest, RightPrefixMergeFails) { auto setUpdate1 = fromjson("{$set: {'a.b.c': 5}}"); auto setUpdate2 = fromjson("{$set: {'a.b': 6}}"); FieldRef fakeFieldRef("root"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode setRoot1, setRoot2; ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot1, modifiertable::ModifierType::MOD_SET, setUpdate1["$set"]["a.b.c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot2, modifiertable::ModifierType::MOD_SET, setUpdate2["$set"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1424,20 +1425,20 @@ TEST(UpdateObjectNodeTest, LeftPrefixMergeThroughPositionalFails) { auto setUpdate1 = fromjson("{$set: {'a.$.c': 5}}"); auto setUpdate2 = fromjson("{$set: {'a.$.c.d': 6}}"); FieldRef fakeFieldRef("root"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode setRoot1, setRoot2; ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot1, modifiertable::ModifierType::MOD_SET, setUpdate1["$set"]["a.$.c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot2, modifiertable::ModifierType::MOD_SET, setUpdate2["$set"]["a.$.c.d"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1453,20 +1454,20 @@ TEST(UpdateObjectNodeTest, RightPrefixMergeThroughPositionalFails) { auto setUpdate1 = fromjson("{$set: {'a.$.c.d': 5}}"); auto setUpdate2 = fromjson("{$set: {'a.$.c': 6}}"); FieldRef fakeFieldRef("root"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode setRoot1, setRoot2; ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot1, modifiertable::ModifierType::MOD_SET, setUpdate1["$set"]["a.$.c.d"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot2, modifiertable::ModifierType::MOD_SET, setUpdate2["$set"]["a.$.c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1482,20 +1483,20 @@ TEST(UpdateObjectNodeTest, MergeWithConflictingPositionalFails) { auto setUpdate1 = fromjson("{$set: {'a.$': 5}}"); auto setUpdate2 = fromjson("{$set: {'a.$': 6}}"); FieldRef fakeFieldRef("root"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode setRoot1, setRoot2; ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot1, modifiertable::ModifierType::MOD_SET, setUpdate1["$set"]["a.$"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot2, modifiertable::ModifierType::MOD_SET, setUpdate2["$set"]["a.$"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1513,25 +1514,25 @@ DEATH_TEST(UpdateObjectNodeTest, auto setUpdate1 = fromjson("{$set: {'a.$[i]': 5}}"); auto setUpdate2 = fromjson("{$set: {'a.$[j]': 6}}"); FieldRef fakeFieldRef("root"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); auto arrayFilterI = fromjson("{i: 0}"); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters1; - arrayFilters1["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterI, collator)); + arrayFilters1["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterI, expCtx)); auto arrayFilterJ = fromjson("{j: 0}"); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters2; - arrayFilters2["j"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterJ, collator)); + arrayFilters2["j"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterJ, expCtx)); std::set<std::string> foundIdentifiers; UpdateObjectNode setRoot1, setRoot2; ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot1, modifiertable::ModifierType::MOD_SET, setUpdate1["$set"]["a.$[i]"], - collator, + expCtx, arrayFilters1, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot2, modifiertable::ModifierType::MOD_SET, setUpdate2["$set"]["a.$[j]"], - collator, + expCtx, arrayFilters2, foundIdentifiers)); @@ -1542,22 +1543,22 @@ TEST(UpdateObjectNodeTest, MergingArrayNodeWithObjectNodeFails) { auto setUpdate1 = fromjson("{$set: {'a.$[i]': 5}}"); auto setUpdate2 = fromjson("{$set: {'a.b': 6}}"); FieldRef fakeFieldRef("root"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); auto arrayFilter = fromjson("{i: 0}"); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; - arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, collator)); + arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, expCtx)); std::set<std::string> foundIdentifiers; UpdateObjectNode setRoot1, setRoot2; ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot1, modifiertable::ModifierType::MOD_SET, setUpdate1["$set"]["a.$[i]"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot2, modifiertable::ModifierType::MOD_SET, setUpdate2["$set"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1573,22 +1574,22 @@ TEST(UpdateObjectNodeTest, MergingArrayNodeWithLeafNodeFails) { auto setUpdate1 = fromjson("{$set: {'a.$[i]': 5}}"); auto setUpdate2 = fromjson("{$set: {'a': 6}}"); FieldRef fakeFieldRef("root"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); auto arrayFilter = fromjson("{i: 0}"); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; - arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, collator)); + arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, expCtx)); std::set<std::string> foundIdentifiers; UpdateObjectNode setRoot1, setRoot2; ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot1, modifiertable::ModifierType::MOD_SET, setUpdate1["$set"]["a.$[i]"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot2, modifiertable::ModifierType::MOD_SET, setUpdate2["$set"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1604,24 +1605,24 @@ TEST(UpdateObjectNodeTest, MergingTwoArrayNodesSucceeds) { auto setUpdate1 = fromjson("{$set: {'a.$[i]': 5}}"); auto setUpdate2 = fromjson("{$set: {'a.$[j]': 6}}"); FieldRef fakeFieldRef("root"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); auto arrayFilterI = fromjson("{i: 0}"); auto arrayFilterJ = fromjson("{j: 0}"); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; - arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterI, collator)); - arrayFilters["j"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterJ, collator)); + arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterI, expCtx)); + arrayFilters["j"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilterJ, expCtx)); std::set<std::string> foundIdentifiers; UpdateObjectNode setRoot1, setRoot2; ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot1, modifiertable::ModifierType::MOD_SET, setUpdate1["$set"]["a.$[i]"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot2, modifiertable::ModifierType::MOD_SET, setUpdate2["$set"]["a.$[j]"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1644,22 +1645,22 @@ TEST(UpdateObjectNodeTest, MergeConflictThroughArrayNodesFails) { auto setUpdate1 = fromjson("{$set: {'a.$[i].b.c': 5}}"); auto setUpdate2 = fromjson("{$set: {'a.$[i].b': 6}}"); FieldRef fakeFieldRef("root"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); auto arrayFilter = fromjson("{i: 0}"); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; - arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, collator)); + arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, expCtx)); std::set<std::string> foundIdentifiers; UpdateObjectNode setRoot1, setRoot2; ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot1, modifiertable::ModifierType::MOD_SET, setUpdate1["$set"]["a.$[i].b.c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot2, modifiertable::ModifierType::MOD_SET, setUpdate2["$set"]["a.$[i].b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1675,22 +1676,22 @@ TEST(UpdateObjectNodeTest, NoMergeConflictThroughArrayNodesSucceeds) { auto setUpdate1 = fromjson("{$set: {'a.$[i].b': 5}}"); auto setUpdate2 = fromjson("{$set: {'a.$[i].c': 6}}"); FieldRef fakeFieldRef("root"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); auto arrayFilter = fromjson("{i: 0}"); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; - arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, collator)); + arrayFilters["i"] = uassertStatusOK(ExpressionWithPlaceholder::parse(arrayFilter, expCtx)); std::set<std::string> foundIdentifiers; UpdateObjectNode setRoot1, setRoot2; ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot1, modifiertable::ModifierType::MOD_SET, setUpdate1["$set"]["a.$[i].b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&setRoot2, modifiertable::ModifierType::MOD_SET, setUpdate2["$set"]["a.$[i].c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1717,14 +1718,14 @@ TEST(UpdateObjectNodeTest, NoMergeConflictThroughArrayNodesSucceeds) { TEST_F(UpdateObjectNodeTest, ApplyCreateField) { auto setUpdate = fromjson("{$set: {b: 6}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1740,14 +1741,14 @@ TEST_F(UpdateObjectNodeTest, ApplyCreateField) { TEST_F(UpdateObjectNodeTest, ApplyExistingField) { auto setUpdate = fromjson("{$set: {a: 6}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1763,32 +1764,32 @@ TEST_F(UpdateObjectNodeTest, ApplyExistingField) { TEST_F(UpdateObjectNodeTest, ApplyExistingAndNonexistingFields) { auto setUpdate = fromjson("{$set: {a: 5, b: 6, c: 7, d: 8}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["d"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1804,32 +1805,32 @@ TEST_F(UpdateObjectNodeTest, ApplyExistingAndNonexistingFields) { TEST_F(UpdateObjectNodeTest, ApplyExistingNestedPaths) { auto setUpdate = fromjson("{$set: {'a.b': 6, 'a.c': 7, 'b.d': 8, 'b.e': 9}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["b.d"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["b.e"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1846,32 +1847,32 @@ TEST_F(UpdateObjectNodeTest, ApplyExistingNestedPaths) { TEST_F(UpdateObjectNodeTest, ApplyCreateNestedPaths) { auto setUpdate = fromjson("{$set: {'a.b': 6, 'a.c': 7, 'b.d': 8, 'b.e': 9}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["b.d"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["b.e"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1888,26 +1889,26 @@ TEST_F(UpdateObjectNodeTest, ApplyCreateNestedPaths) { TEST_F(UpdateObjectNodeTest, ApplyCreateDeeplyNestedPaths) { auto setUpdate = fromjson("{$set: {'a.b.c.d': 6, 'a.b.c.e': 7, 'a.f': 8}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.b.c.d"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.b.c.e"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.f"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1924,38 +1925,38 @@ TEST_F(UpdateObjectNodeTest, ApplyCreateDeeplyNestedPaths) { TEST_F(UpdateObjectNodeTest, ChildrenShouldBeAppliedInAlphabeticalOrder) { auto setUpdate = fromjson("{$set: {a: 5, d: 6, c: 7, b: 8, z: 9}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["d"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["z"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -1972,19 +1973,21 @@ TEST_F(UpdateObjectNodeTest, ChildrenShouldBeAppliedInAlphabeticalOrder) { TEST_F(UpdateObjectNodeTest, CollatorShouldNotAffectUpdateOrder) { auto setUpdate = fromjson("{$set: {abc: 5, cba: 6}}"); CollatorInterfaceMock collator(CollatorInterfaceMock::MockType::kReverseString); + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); + expCtx->setCollator(&collator); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["abc"], - &collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["cba"], - &collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -2000,26 +2003,26 @@ TEST_F(UpdateObjectNodeTest, CollatorShouldNotAffectUpdateOrder) { TEST_F(UpdateObjectNodeTest, ApplyNoop) { auto setUpdate = fromjson("{$set: {a: 5, b: 6, c: 7}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -2037,26 +2040,26 @@ TEST_F(UpdateObjectNodeTest, ApplyNoop) { TEST_F(UpdateObjectNodeTest, ApplySomeChildrenNoops) { auto setUpdate = fromjson("{$set: {a: 5, b: 6, c: 7}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -2074,14 +2077,14 @@ TEST_F(UpdateObjectNodeTest, ApplySomeChildrenNoops) { TEST_F(UpdateObjectNodeTest, ApplyBlockingElement) { auto setUpdate = fromjson("{$set: {'a.b': 5}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -2095,20 +2098,20 @@ TEST_F(UpdateObjectNodeTest, ApplyBlockingElement) { TEST_F(UpdateObjectNodeTest, ApplyBlockingElementFromReplication) { auto setUpdate = fromjson("{$set: {'a.b': 5, b: 6}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -2125,14 +2128,14 @@ TEST_F(UpdateObjectNodeTest, ApplyBlockingElementFromReplication) { TEST_F(UpdateObjectNodeTest, ApplyPositionalMissingMatchedField) { auto setUpdate = fromjson("{$set: {'a.$': 5}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.$"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -2147,20 +2150,20 @@ TEST_F(UpdateObjectNodeTest, ApplyPositionalMissingMatchedField) { TEST_F(UpdateObjectNodeTest, ApplyMergePositionalChild) { auto setUpdate = fromjson("{$set: {'a.0.b': 5, 'a.$.c': 6}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.0.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.$.c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -2177,32 +2180,32 @@ TEST_F(UpdateObjectNodeTest, ApplyMergePositionalChild) { TEST_F(UpdateObjectNodeTest, ApplyOrderMergedPositionalChild) { auto setUpdate = fromjson("{$set: {'a.2': 5, 'a.1.b': 6, 'a.0': 7, 'a.$.c': 8}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.2"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.1.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.0"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.$.c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -2220,20 +2223,20 @@ TEST_F(UpdateObjectNodeTest, ApplyOrderMergedPositionalChild) { TEST_F(UpdateObjectNodeTest, ApplyMergeConflictWithPositionalChild) { auto setUpdate = fromjson("{$set: {'a.0': 5, 'a.$': 6}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.0"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.$"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -2248,26 +2251,26 @@ TEST_F(UpdateObjectNodeTest, ApplyMergeConflictWithPositionalChild) { TEST_F(UpdateObjectNodeTest, ApplyDoNotMergePositionalChild) { auto setUpdate = fromjson("{$set: {'a.0': 5, 'a.2': 6, 'a.$': 7}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.0"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.2"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.$"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -2284,26 +2287,26 @@ TEST_F(UpdateObjectNodeTest, ApplyDoNotMergePositionalChild) { TEST_F(UpdateObjectNodeTest, ApplyPositionalChildLast) { auto setUpdate = fromjson("{$set: {'a.$': 5, 'a.0': 6, 'a.1': 7}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.$"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.0"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.1"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -2320,20 +2323,20 @@ TEST_F(UpdateObjectNodeTest, ApplyPositionalChildLast) { TEST_F(UpdateObjectNodeTest, ApplyUseStoredMergedPositional) { auto setUpdate = fromjson("{$set: {'a.0.b': 5, 'a.$.c': 6}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.0.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.$.c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -2361,26 +2364,26 @@ TEST_F(UpdateObjectNodeTest, ApplyUseStoredMergedPositional) { TEST_F(UpdateObjectNodeTest, ApplyDoNotUseStoredMergedPositional) { auto setUpdate = fromjson("{$set: {'a.0.b': 5, 'a.$.c': 6, 'a.1.d': 7}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.0.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.$.c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.1.d"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -2415,14 +2418,14 @@ TEST_F(UpdateObjectNodeTest, ApplyDoNotUseStoredMergedPositional) { */ TEST_F(UpdateObjectNodeTest, ApplyToArrayByIndexWithLeadingZero) { auto setUpdate = fromjson("{$set: {'a.02': 2}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.02"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -2444,20 +2447,20 @@ TEST_F(UpdateObjectNodeTest, ApplyToArrayByIndexWithLeadingZero) { */ TEST_F(UpdateObjectNodeTest, ApplyMultipleArrayUpdates) { auto setUpdate = fromjson("{$set: {'a.2': 2, 'a.10': 10}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.2"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.10"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -2475,14 +2478,14 @@ TEST_F(UpdateObjectNodeTest, ApplyMultipleArrayUpdates) { TEST_F(UpdateObjectNodeTest, ApplyUpdateToNonViablePathInArray) { auto setUpdate = fromjson("{$set: {'a.b': 3}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, setUpdate["$set"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -2496,20 +2499,20 @@ TEST_F(UpdateObjectNodeTest, ApplyUpdateToNonViablePathInArray) { TEST_F(UpdateObjectNodeTest, SetAndPopModifiersWithCommonPrefixApplySuccessfully) { auto update = fromjson("{$set: {'a.b': 5}, $pop: {'a.c': -1}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_POP, update["$pop"]["a.c"], - collator, + expCtx, arrayFilters, foundIdentifiers)); @@ -2523,7 +2526,7 @@ TEST_F(UpdateObjectNodeTest, SetAndPopModifiersWithCommonPrefixApplySuccessfully } TEST(ParseRenameTest, RenameToStringWithEmbeddedNullFails) { - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; @@ -2535,7 +2538,7 @@ TEST(ParseRenameTest, RenameToStringWithEmbeddedNullFails) { auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_RENAME, update["$rename"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -2550,7 +2553,7 @@ TEST(ParseRenameTest, RenameToStringWithEmbeddedNullFails) { auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_RENAME, update["$rename"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -2565,7 +2568,7 @@ TEST(ParseRenameTest, RenameToStringWithEmbeddedNullFails) { auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_RENAME, update["$rename"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -2580,7 +2583,7 @@ TEST(ParseRenameTest, RenameToStringWithEmbeddedNullFails) { auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_RENAME, update["$rename"]["a.b"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -2590,14 +2593,14 @@ TEST(ParseRenameTest, RenameToStringWithEmbeddedNullFails) { TEST(ParseRenameTest, RenameToNonUpdatablePathFails) { auto update = fromjson("{$rename: {'a': 'b.'}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_RENAME, update["$rename"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -2608,14 +2611,14 @@ TEST(ParseRenameTest, RenameToNonUpdatablePathFails) { TEST(ParseRenameTest, RenameFromNonUpdatablePathFails) { auto update = fromjson("{$rename: {'.a': 'b'}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_RENAME, update["$rename"][".a"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -2626,14 +2629,14 @@ TEST(ParseRenameTest, RenameFromNonUpdatablePathFails) { TEST(ParseRenameTest, RenameToNonStringPathFails) { auto update = fromjson("{$rename: {'a': 5}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_RENAME, update["$rename"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -2650,14 +2653,14 @@ TEST(ParseRenameTest, RenameToNonStringPathFails) { */ TEST(ParseRenameTest, RenameWithSameNameFails) { auto update = fromjson("{$rename: {'a': 'a'}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_RENAME, update["$rename"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -2668,14 +2671,14 @@ TEST(ParseRenameTest, RenameWithSameNameFails) { TEST(ParseRenameTest, RenameUpwardFails) { auto update = fromjson("{$rename: {'b.a': 'b'}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_RENAME, update["$rename"]["b.a"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -2686,14 +2689,14 @@ TEST(ParseRenameTest, RenameUpwardFails) { TEST(ParseRenameTest, RenameDownwardFails) { auto update = fromjson("{$rename: {'b': 'b.a'}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_RENAME, update["$rename"]["b"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -2704,20 +2707,20 @@ TEST(ParseRenameTest, RenameDownwardFails) { TEST(ParseRenameTest, ConflictWithRenameSourceFailsToParse) { auto update = fromjson("{$set: {a: 5}, $rename: {a: 'b'}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers)); auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_RENAME, update["$rename"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); @@ -2727,20 +2730,20 @@ TEST(ParseRenameTest, ConflictWithRenameSourceFailsToParse) { TEST(ParseRenameTest, ConflictWithRenameDestinationFailsToParse) { auto update = fromjson("{$set: {b: 5}, $rename: {a: 'b'}}"); - const CollatorInterface* collator = nullptr; + boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest()); std::map<StringData, std::unique_ptr<ExpressionWithPlaceholder>> arrayFilters; std::set<std::string> foundIdentifiers; UpdateObjectNode root; ASSERT_OK(UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_SET, update["$set"]["b"], - collator, + expCtx, arrayFilters, foundIdentifiers)); auto result = UpdateObjectNode::parseAndMerge(&root, modifiertable::ModifierType::MOD_RENAME, update["$rename"]["a"], - collator, + expCtx, arrayFilters, foundIdentifiers); ASSERT_NOT_OK(result); |