summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Rassi <rassi@10gen.com>2015-05-14 07:35:11 -0400
committerRamon Fernandez <ramon.fernandez@mongodb.com>2015-05-19 15:38:12 -0400
commit137b088130d7f7fd4ebc8b09d79ed72de44925b5 (patch)
tree88adee924232e44342208a6a1a5ed7adb405c7a5
parenta029932768cdc12dd86a0afee4a7411065230c5a (diff)
downloadmongo-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.js34
-rw-r--r--jstests/core/geo_s2indexversion1.js25
-rw-r--r--src/mongo/db/index/index_descriptor.cpp4
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