diff options
-rw-r--r-- | jstests/core/fts_index.js | 34 | ||||
-rw-r--r-- | jstests/core/geo_s2indexversion1.js | 25 | ||||
-rw-r--r-- | src/mongo/db/index/index_descriptor.cpp | 4 |
3 files changed, 59 insertions, 4 deletions
diff --git a/jstests/core/fts_index.js b/jstests/core/fts_index.js index 7e52b761df3..5af6156af4d 100644 --- a/jstests/core/fts_index.js +++ b/jstests/core/fts_index.js @@ -62,10 +62,12 @@ coll.drop(); // // 3. Collections may have at most one text index. // -assert.commandWorked(coll.ensureIndex({a: 1, b: "text", c: 1})); -assert.eq(2, coll.getIndexes().length); // ensureIndex() becomes a no-op on an equivalent index spec. +assert.commandWorked(coll.getDB().createCollection(coll.getName())); +assert.eq(1, coll.getIndexes().length); +assert.commandWorked(coll.ensureIndex({a: 1, b: "text", c: 1})); +assert.eq(2, coll.getIndexes().length); assert.commandWorked(coll.ensureIndex({a: 1, b: "text", c: 1})); assert.eq(2, coll.getIndexes().length); assert.commandWorked(coll.ensureIndex({a: 1, b: "text", c: 1}, {background: true})); @@ -78,11 +80,37 @@ assert.commandWorked(coll.ensureIndex({a: 1, b: "text", c: 1}, {textIndexVersion assert.eq(2, coll.getIndexes().length); assert.commandWorked(coll.ensureIndex({a: 1, b: "text", c: 1}, {language_override: "language"})); assert.eq(2, coll.getIndexes().length); +coll.drop(); + +// Two index specs are also considered equivalent if they differ only in 'textIndexVersion', and +// ensureIndex() becomes a no-op on repeated requests that only differ in this way. +assert.commandWorked(coll.getDB().createCollection(coll.getName())); +assert.eq(1, coll.getIndexes().length); +assert.commandWorked(coll.ensureIndex({a: "text"}, {textIndexVersion: 1})); +assert.eq(2, coll.getIndexes().length); +assert.commandWorked(coll.ensureIndex({a: "text"}, {textIndexVersion: 2})); +assert.eq(2, coll.getIndexes().length); +assert.commandWorked(coll.ensureIndex({a: "text"})); +assert.eq(2, coll.getIndexes().length); +coll.drop(); + +assert.commandWorked(coll.getDB().createCollection(coll.getName())); +assert.eq(1, coll.getIndexes().length); +assert.commandWorked(coll.ensureIndex({a: "text"}, {textIndexVersion: 2})); +assert.eq(2, coll.getIndexes().length); +assert.commandWorked(coll.ensureIndex({a: "text"}, {textIndexVersion: 1})); +assert.eq(2, coll.getIndexes().length); +assert.commandWorked(coll.ensureIndex({a: "text"})); +assert.eq(2, coll.getIndexes().length); +coll.drop(); // ensureIndex() fails if a second text index would be built. +assert.commandWorked(coll.getDB().createCollection(coll.getName())); +assert.eq(1, coll.getIndexes().length); +assert.commandWorked(coll.ensureIndex({a: 1, b: "text", c: 1})); +assert.eq(2, coll.getIndexes().length); assert.commandFailed(coll.ensureIndex({a: 1, _fts: "text", _ftsx: 1, c: 1}, {weights: {d: 1}})); assert.commandFailed(coll.ensureIndex({a: 1, b: "text", c: 1}, {default_language: "none"})); -assert.commandFailed(coll.ensureIndex({a: 1, b: "text", c: 1}, {textIndexVersion: 1})); assert.commandFailed(coll.ensureIndex({a: 1, b: "text", c: 1}, {language_override: "idioma"})); assert.commandFailed(coll.ensureIndex({a: 1, b: "text", c: 1}, {weights: {d: 1}})); assert.commandFailed(coll.ensureIndex({a: 1, b: "text", d: 1})); diff --git a/jstests/core/geo_s2indexversion1.js b/jstests/core/geo_s2indexversion1.js index 3d17fee9333..5a2e0877d9e 100644 --- a/jstests/core/geo_s2indexversion1.js +++ b/jstests/core/geo_s2indexversion1.js @@ -76,6 +76,31 @@ assert.eq(2, specObj["2dsphereIndexVersion"]); coll.drop(); // +// Two index specs are considered equivalent if they differ only in '2dsphereIndexVersion', and +// ensureIndex() should become a no-op on repeated requests that only differ in this way. +// + +assert.commandWorked(coll.getDB().createCollection(coll.getName())); +assert.eq(1, coll.getIndexes().length); +assert.commandWorked(coll.ensureIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": 1})); +assert.eq(2, coll.getIndexes().length); +assert.commandWorked(coll.ensureIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": 2})); +assert.eq(2, coll.getIndexes().length); +assert.commandWorked(coll.ensureIndex({geo: "2dsphere"})); +assert.eq(2, coll.getIndexes().length); +coll.drop(); + +assert.commandWorked(coll.getDB().createCollection(coll.getName())); +assert.eq(1, coll.getIndexes().length); +assert.commandWorked(coll.ensureIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": 2})); +assert.eq(2, coll.getIndexes().length); +assert.commandWorked(coll.ensureIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": 1})); +assert.eq(2, coll.getIndexes().length); +assert.commandWorked(coll.ensureIndex({geo: "2dsphere"})); +assert.eq(2, coll.getIndexes().length); +coll.drop(); + +// // Test compatibility of various GeoJSON objects with both 2dsphere index versions. // diff --git a/src/mongo/db/index/index_descriptor.cpp b/src/mongo/db/index/index_descriptor.cpp index 05e2994008b..523b778163d 100644 --- a/src/mongo/db/index/index_descriptor.cpp +++ b/src/mongo/db/index/index_descriptor.cpp @@ -47,7 +47,9 @@ namespace mongo { if ( fieldName == "key" || fieldName == "ns" || fieldName == "name" || - fieldName == "v" || + fieldName == "v" || // not considered for equivalence + fieldName == "textIndexVersion" || // same as "v" + fieldName == "2dsphereIndexVersion" || // same as "v" fieldName == "background" || // this is a creation time option only fieldName == "dropDups" || // this is now ignored fieldName == "sparse" || // checked specially |