mongo/jstests/libs/index_utils.js

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,
};
})();