diff options
author | Jason Rassi <rassi@10gen.com> | 2015-05-14 07:35:11 -0400 |
---|---|---|
committer | Ramon Fernandez <ramon.fernandez@mongodb.com> | 2015-05-19 15:38:12 -0400 |
commit | 137b088130d7f7fd4ebc8b09d79ed72de44925b5 (patch) | |
tree | 88adee924232e44342208a6a1a5ed7adb405c7a5 | |
parent | a029932768cdc12dd86a0afee4a7411065230c5a (diff) | |
download | mongo-137b088130d7f7fd4ebc8b09d79ed72de44925b5.tar.gz |
SERVER-13875 Spec equivalence check ignore text/geo index versions
(cherry picked from commit 20e130aceda766c646d123d8a853ea5aabbeab26)
-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 af927c86f48..88b1c5f9643 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 bfb70e3a16c..8907142f84a 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 e227be9e914..b2b1b9b41de 100644 --- a/src/mongo/db/index/index_descriptor.cpp +++ b/src/mongo/db/index/index_descriptor.cpp @@ -44,7 +44,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 a creation time option only fieldName == "sparse" || // checked specially |