mirror of https://github.com/mongodb/mongo
84 lines
3.3 KiB
JavaScript
84 lines
3.3 KiB
JavaScript
import {FixtureHelpers} from "jstests/libs/fixture_helpers.js";
|
|
|
|
export var IndexUtils = (function () {
|
|
/**
|
|
* Verifies that the indexes on 'coll' match those in 'expectedIndexes'.
|
|
*
|
|
* This function takes into account indexes that may have been created implicitly. For suites
|
|
* that implicitly shard collections, indexes such as the shard key or _id may exist. Similarly,
|
|
* for suites that implicitly create a wildcard index, those are also considered.
|
|
*/
|
|
function assertIndexes(coll, expectedIndexes, msg) {
|
|
const actualIndexes = coll.getIndexes().map((spec) => spec.key);
|
|
assertIndexesMatch(coll, expectedIndexes, actualIndexes, msg);
|
|
}
|
|
|
|
/**
|
|
* Verifies that the 'actualIndexes' match those in 'expectedIndexes' for the given collection.
|
|
*
|
|
* This function takes into account indexes that may have been created implicitly. For suites
|
|
* that implicitly shard collections, indexes such as the shard key or _id may exist. Similarly,
|
|
* for suites that implicitly create a wildcard index, those are also considered.
|
|
*/
|
|
function assertIndexesMatch(coll, expectedIndexes, actualIndexes, msg) {
|
|
assert(actualIndexes);
|
|
|
|
const addIfNotExists = (arr, value) => {
|
|
if (!arr.some((v) => v === value || bsonUnorderedFieldsCompare(v, value) === 0)) {
|
|
arr.push(value);
|
|
}
|
|
};
|
|
|
|
if (FixtureHelpers.isSharded(coll)) {
|
|
// If the collection has been dropped, it will be automatically recreated on 'sharded'
|
|
// suites. Hence, the index {_id: 1} will exist.
|
|
//
|
|
// Note that this doesn't affect unsharded tracked collections because the drop
|
|
// operation doesn't recreate the collection on suites that implicitly create
|
|
// unsplittable collections.
|
|
addIfNotExists(expectedIndexes, {_id: 1});
|
|
|
|
// If the shard key index exists, add it to the expected indexes.
|
|
const shardKey = coll.getShardKey();
|
|
if (coll.getIndexByKey(shardKey)) {
|
|
addIfNotExists(expectedIndexes, shardKey);
|
|
}
|
|
}
|
|
|
|
if (TestData.implicitWildcardIndexesEnabled) {
|
|
actualIndexes.forEach((index) => {
|
|
if (Object.keys(index).some((key) => key.endsWith("$**"))) {
|
|
addIfNotExists(expectedIndexes, index);
|
|
}
|
|
});
|
|
}
|
|
|
|
assert.sameMembers(expectedIndexes, actualIndexes, msg);
|
|
}
|
|
|
|
/**
|
|
* Checks whether the specified index exists.
|
|
*
|
|
* If `options` are provided, only the specified fields will be verified.
|
|
* To check that a field does not exist, you can use the syntax: { field: undefined }.
|
|
*/
|
|
function indexExists(coll, indexKey, options = undefined) {
|
|
return coll
|
|
.getIndexes()
|
|
.some(
|
|
(index) =>
|
|
bsonWoCompare(indexKey, index.key) === 0 &&
|
|
(!options ||
|
|
Object.keys(options).every(
|
|
(optionKey) => bsonWoCompare(options[optionKey], index[optionKey]) === 0,
|
|
)),
|
|
);
|
|
}
|
|
|
|
return {
|
|
assertIndexes: assertIndexes,
|
|
assertIndexesMatch: assertIndexesMatch,
|
|
indexExists: indexExists,
|
|
};
|
|
})();
|