diff options
Diffstat (limited to 'src/mongo/db/index/btree_key_generator_test.cpp')
-rw-r--r-- | src/mongo/db/index/btree_key_generator_test.cpp | 85 |
1 files changed, 54 insertions, 31 deletions
diff --git a/src/mongo/db/index/btree_key_generator_test.cpp b/src/mongo/db/index/btree_key_generator_test.cpp index 3c7c0775255..b25f24a8b35 100644 --- a/src/mongo/db/index/btree_key_generator_test.cpp +++ b/src/mongo/db/index/btree_key_generator_test.cpp @@ -94,6 +94,16 @@ bool keysetsEqual(const KeyStringSet& expectedKeys, const KeyStringSet& actualKe return true; } +bool containsArrayElement(const BSONObj& obj) { + for (auto&& elem : obj) { + if (elem.type() == BSONType::Array || + (elem.type() == BSONType::Object && containsArrayElement(elem.Obj()))) { + return true; + } + } + return false; +} + bool testKeygen(const BSONObj& kp, const BSONObj& obj, const KeyStringSet& expectedKeys, @@ -103,8 +113,7 @@ bool testKeygen(const BSONObj& kp, invariant(expectedMultikeyPaths.size() == static_cast<size_t>(kp.nFields())); // - // Step 1: construct the btree key generator object, using the - // index key pattern. + // Construct the btree key generator object, using the index key pattern. // vector<const char*> fieldNames; vector<BSONElement> fixed; @@ -123,39 +132,53 @@ bool testKeygen(const BSONObj& kp, KeyString::Version::kLatestVersion, Ordering::make(BSONObj())); - // - // Step 2: ask 'keyGen' to generate index keys for the object 'obj' and report any prefixes of - // the indexed fields that would cause the index to be multikey as a result of inserting - // 'actualKeys'. - // - KeyStringSet actualKeys; - MultikeyPaths actualMultikeyPaths; - keyGen->getKeys(obj, &actualKeys, &actualMultikeyPaths); + auto runTest = [&](bool skipMultikey) { + // + // Ask 'keyGen' to generate index keys for the object 'obj' and report any prefixes of the + // indexed fields that would cause the index to be multikey as a result of inserting + // 'actualKeys'. + // + KeyStringSet actualKeys; + MultikeyPaths actualMultikeyPaths; + keyGen->getKeys(obj, skipMultikey, &actualKeys, &actualMultikeyPaths); + + // + // Check that the results match the expected result. + // + bool match = keysetsEqual(expectedKeys, actualKeys); + if (!match) { + LOGV2(20647, + "Expected: {dumpKeyset_expectedKeys}, Actual: {dumpKeyset_actualKeys}", + "dumpKeyset_expectedKeys"_attr = dumpKeyset(expectedKeys), + "dumpKeyset_actualKeys"_attr = dumpKeyset(actualKeys)); + return false; + } - // - // Step 3: check that the results match the expected result. - // - bool match = keysetsEqual(expectedKeys, actualKeys); - if (!match) { - LOGV2(20647, - "Expected: {dumpKeyset_expectedKeys}, Actual: {dumpKeyset_actualKeys}", - "dumpKeyset_expectedKeys"_attr = dumpKeyset(expectedKeys), - "dumpKeyset_actualKeys"_attr = dumpKeyset(actualKeys)); - return false; - } + match = (expectedMultikeyPaths == actualMultikeyPaths); + if (!match) { + LOGV2(20648, + "Expected: {dumpMultikeyPaths_expectedMultikeyPaths}, Actual: " + "{dumpMultikeyPaths_actualMultikeyPaths}", + "dumpMultikeyPaths_expectedMultikeyPaths"_attr = + dumpMultikeyPaths(expectedMultikeyPaths), + "dumpMultikeyPaths_actualMultikeyPaths"_attr = + dumpMultikeyPaths(actualMultikeyPaths)); + return false; + } + + return true; + }; - match = (expectedMultikeyPaths == actualMultikeyPaths); - if (!match) { - LOGV2(20648, - "Expected: {dumpMultikeyPaths_expectedMultikeyPaths}, Actual: " - "{dumpMultikeyPaths_actualMultikeyPaths}", - "dumpMultikeyPaths_expectedMultikeyPaths"_attr = - dumpMultikeyPaths(expectedMultikeyPaths), - "dumpMultikeyPaths_actualMultikeyPaths"_attr = - dumpMultikeyPaths(actualMultikeyPaths)); + // If it is correct to do so, then test that the fast key generation path for the non-multikey + // case works as expected. + if (!containsArrayElement(obj)) { + if (!runTest(true)) { + return false; + } } - return match; + // Test that fully general key generation path works as expected. + return runTest(false); } // |