summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Rassi <rassi@10gen.com>2015-05-14 07:35:11 -0400
committerJason Rassi <rassi@10gen.com>2015-05-15 13:19:40 -0400
commit20e130aceda766c646d123d8a853ea5aabbeab26 (patch)
tree33934384bd628d2944989c4a72fc897f3e7aeabe
parente9c4cdcaf03d2a3828f21dd1d84eb69e7b91b204 (diff)
downloadmongo-20e130aceda766c646d123d8a853ea5aabbeab26.tar.gz
SERVER-13875 Spec equivalence check ignore text/geo index versions
-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 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