summaryrefslogtreecommitdiff
path: root/jstests/core/index/geo/geo_s2indexversion1.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/core/index/geo/geo_s2indexversion1.js')
-rw-r--r--jstests/core/index/geo/geo_s2indexversion1.js213
1 files changed, 213 insertions, 0 deletions
diff --git a/jstests/core/index/geo/geo_s2indexversion1.js b/jstests/core/index/geo/geo_s2indexversion1.js
new file mode 100644
index 00000000000..2df90bb1235
--- /dev/null
+++ b/jstests/core/index/geo/geo_s2indexversion1.js
@@ -0,0 +1,213 @@
+// Cannot implicitly shard accessed collections because of collection existing when none
+// expected.
+// @tags: [
+// assumes_no_implicit_collection_creation_after_drop,
+// ]
+
+// Tests 2dsphere index option "2dsphereIndexVersion". Verifies that GeoJSON objects that are new
+// in version 2 are not allowed in version 1.
+
+var coll = db.getCollection("geo_s2indexversion1");
+coll.drop();
+
+//
+// Index build should fail for invalid values of "2dsphereIndexVersion".
+//
+
+var res;
+res = coll.createIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": -1});
+assert.commandFailed(res);
+coll.drop();
+
+res = coll.createIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": 0});
+assert.commandFailed(res);
+coll.drop();
+
+res = coll.createIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": 4});
+assert.commandFailed(res);
+coll.drop();
+
+res = coll.createIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": Infinity});
+assert.commandFailed(res);
+coll.drop();
+
+res = coll.createIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": "foo"});
+assert.commandFailed(res);
+coll.drop();
+
+res = coll.createIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": {a: 1}});
+assert.commandFailed(res);
+coll.drop();
+
+//
+// Index build should succeed for valid values of "2dsphereIndexVersion".
+//
+
+res = coll.createIndex({geo: "2dsphere"});
+assert.commandWorked(res);
+coll.drop();
+
+res = coll.createIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": 1});
+assert.commandWorked(res);
+coll.drop();
+
+res = coll.createIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": NumberInt(1)});
+assert.commandWorked(res);
+coll.drop();
+
+res = coll.createIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": NumberLong(1)});
+assert.commandWorked(res);
+coll.drop();
+
+res = coll.createIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": 2});
+assert.commandWorked(res);
+coll.drop();
+
+res = coll.createIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": NumberInt(2)});
+assert.commandWorked(res);
+coll.drop();
+
+res = coll.createIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": NumberLong(2)});
+assert.commandWorked(res);
+coll.drop();
+
+//
+// {2dsphereIndexVersion: 3} should be the default for new indexes.
+//
+
+res = coll.createIndex({geo: "2dsphere"});
+assert.commandWorked(res);
+var specObj = coll.getIndexes().filter(function(z) {
+ return z.name == "geo_2dsphere";
+})[0];
+assert.eq(3, specObj["2dsphereIndexVersion"]);
+coll.drop();
+
+//
+// Two index specs are considered equivalent if they differ only in '2dsphereIndexVersion', and
+// createIndex() 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.createIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": 1}));
+assert.eq(2, coll.getIndexes().length);
+assert.commandWorked(coll.createIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": 2}));
+assert.eq(2, coll.getIndexes().length);
+assert.commandWorked(coll.createIndex({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.createIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": 2}));
+assert.eq(2, coll.getIndexes().length);
+assert.commandWorked(coll.createIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": 1}));
+assert.eq(2, coll.getIndexes().length);
+assert.commandWorked(coll.createIndex({geo: "2dsphere"}));
+assert.eq(2, coll.getIndexes().length);
+coll.drop();
+
+//
+// Test compatibility of various GeoJSON objects with both 2dsphere index versions.
+//
+
+var pointDoc = {geo: {type: "Point", coordinates: [40, 5]}};
+var lineStringDoc = {geo: {type: "LineString", coordinates: [[40, 5], [41, 6]]}};
+var polygonDoc = {geo: {type: "Polygon", coordinates: [[[0, 0], [3, 6], [6, 1], [0, 0]]]}};
+var multiPointDoc = {
+ geo: {
+ type: "MultiPoint",
+ coordinates:
+ [[-73.9580, 40.8003], [-73.9498, 40.7968], [-73.9737, 40.7648], [-73.9814, 40.7681]]
+ }
+};
+var multiLineStringDoc = {
+ geo: {
+ type: "MultiLineString",
+ coordinates: [
+ [[-73.96943, 40.78519], [-73.96082, 40.78095]],
+ [[-73.96415, 40.79229], [-73.95544, 40.78854]],
+ [[-73.97162, 40.78205], [-73.96374, 40.77715]],
+ [[-73.97880, 40.77247], [-73.97036, 40.76811]]
+ ]
+ }
+};
+var multiPolygonDoc = {
+ geo: {
+ type: "MultiPolygon",
+ coordinates: [
+ [[
+ [-73.958, 40.8003],
+ [-73.9498, 40.7968],
+ [-73.9737, 40.7648],
+ [-73.9814, 40.7681],
+ [-73.958, 40.8003]
+ ]],
+ [[[-73.958, 40.8003], [-73.9498, 40.7968], [-73.9737, 40.7648], [-73.958, 40.8003]]]
+ ]
+ }
+};
+var geometryCollectionDoc = {
+ geo: {
+ type: "GeometryCollection",
+ geometries: [
+ {
+ type: "MultiPoint",
+ coordinates: [
+ [-73.9580, 40.8003],
+ [-73.9498, 40.7968],
+ [-73.9737, 40.7648],
+ [-73.9814, 40.7681]
+ ]
+ },
+ {
+ type: "MultiLineString",
+ coordinates: [
+ [[-73.96943, 40.78519], [-73.96082, 40.78095]],
+ [[-73.96415, 40.79229], [-73.95544, 40.78854]],
+ [[-73.97162, 40.78205], [-73.96374, 40.77715]],
+ [[-73.97880, 40.77247], [-73.97036, 40.76811]]
+ ]
+ }
+ ]
+ }
+};
+
+// {2dsphereIndexVersion: 2} indexes allow all supported GeoJSON objects.
+res = coll.createIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": 2});
+assert.commandWorked(res);
+res = coll.insert(pointDoc);
+assert.commandWorked(res);
+res = coll.insert(lineStringDoc);
+assert.commandWorked(res);
+res = coll.insert(polygonDoc);
+assert.commandWorked(res);
+res = coll.insert(multiPointDoc);
+assert.commandWorked(res);
+res = coll.insert(multiLineStringDoc);
+assert.commandWorked(res);
+res = coll.insert(multiPolygonDoc);
+assert.commandWorked(res);
+res = coll.insert(geometryCollectionDoc);
+assert.commandWorked(res);
+coll.drop();
+
+// {2dsphereIndexVersion: 1} indexes allow only Point, LineString, and Polygon.
+res = coll.createIndex({geo: "2dsphere"}, {"2dsphereIndexVersion": 1});
+assert.commandWorked(res);
+res = coll.insert(pointDoc);
+assert.commandWorked(res);
+res = coll.insert(lineStringDoc);
+assert.commandWorked(res);
+res = coll.insert(polygonDoc);
+assert.commandWorked(res);
+res = coll.insert(multiPointDoc);
+assert.writeError(res);
+res = coll.insert(multiLineStringDoc);
+assert.writeError(res);
+res = coll.insert(multiPolygonDoc);
+assert.writeError(res);
+res = coll.insert(geometryCollectionDoc);
+assert.writeError(res);
+coll.drop();