summaryrefslogtreecommitdiff
path: root/src/mongo/db/index
diff options
context:
space:
mode:
authorKevin Albertson <kevin.albertson@10gen.com>2015-07-13 21:36:48 -0400
committerKevin Albertson <kevin.albertson@10gen.com>2015-07-17 12:07:33 -0400
commitc949bb6042e115cc0824701650610eaf00f6bd78 (patch)
tree2ab7a1e0f5b091bdbc96f8a2c581b782ac36dec4 /src/mongo/db/index
parentf4d695fcf382820c7ea082bd4b1beb84e15cf2c5 (diff)
downloadmongo-c949bb6042e115cc0824701650610eaf00f6bd78.tar.gz
SERVER-19168 Change default index levels for non-point geometries
Diffstat (limited to 'src/mongo/db/index')
-rw-r--r--src/mongo/db/index/expression_params.cpp48
1 files changed, 30 insertions, 18 deletions
diff --git a/src/mongo/db/index/expression_params.cpp b/src/mongo/db/index/expression_params.cpp
index 778f5c03010..872e9d921af 100644
--- a/src/mongo/db/index/expression_params.cpp
+++ b/src/mongo/db/index/expression_params.cpp
@@ -126,31 +126,14 @@ void ExpressionParams::parse2dsphereParams(const BSONObj& infoObj, S2IndexingPar
// Set up basic params.
out->maxKeysPerInsert = 200;
- // This is advisory.
- out->maxCellsInCovering = 50;
-
// Near distances are specified in meters...sometimes.
out->radius = kRadiusOfEarthInMeters;
-
static const std::string kIndexVersionFieldName("2dsphereIndexVersion");
static const std::string kFinestIndexedLevel("finestIndexedLevel");
static const std::string kCoarsestIndexedLevel("coarsestIndexedLevel");
- long long finestIndexedLevel, coarsestIndexedLevel, indexVersion;
-
- bsonExtractIntegerFieldWithDefault(infoObj,
- kFinestIndexedLevel,
- S2::kAvgEdge.GetClosestLevel(500.0 / out->radius),
- &finestIndexedLevel);
- bsonExtractIntegerFieldWithDefault(infoObj,
- kCoarsestIndexedLevel,
- S2::kAvgEdge.GetClosestLevel(100 * 1000.0 / out->radius),
- &coarsestIndexedLevel);
-
- // These are not advisory.
- out->finestIndexedLevel = finestIndexedLevel;
- out->coarsestIndexedLevel = coarsestIndexedLevel;
+ long long finestIndexedLevel, coarsestIndexedLevel, maxCellsInCovering, indexVersion;
// Determine which version of this index we're using. If none was set in the descriptor,
// assume S2_INDEX_VERSION_1 (alas, the first version predates the existence of the version
@@ -160,6 +143,35 @@ void ExpressionParams::parse2dsphereParams(const BSONObj& infoObj, S2IndexingPar
out->indexVersion = static_cast<S2IndexVersion>(indexVersion);
+
+ // Note: In version > 2, these levels are for non-points.
+ // Points are always indexed to the finest level.
+ // Default levels were optimized for buildings and state regions
+ long long defaultFinestIndexedLevel = S2::kAvgEdge.GetClosestLevel(110.0 / out->radius);
+ long long defaultCoarsestIndexedLevel =
+ S2::kAvgEdge.GetClosestLevel(2000 * 1000.0 / out->radius);
+ long long defaultMaxCellsInCovering = 20;
+
+ if (out->indexVersion <= S2_INDEX_VERSION_2) {
+ defaultFinestIndexedLevel = S2::kAvgEdge.GetClosestLevel(500.0 / out->radius);
+ defaultCoarsestIndexedLevel = S2::kAvgEdge.GetClosestLevel(100.0 * 1000 / out->radius);
+ defaultMaxCellsInCovering = 50;
+ }
+
+ bsonExtractIntegerFieldWithDefault(
+ infoObj, "finestIndexedLevel", defaultFinestIndexedLevel, &finestIndexedLevel);
+ bsonExtractIntegerFieldWithDefault(
+ infoObj, "coarsestIndexedLevel", defaultCoarsestIndexedLevel, &coarsestIndexedLevel);
+ bsonExtractIntegerFieldWithDefault(
+ infoObj, "maxCellsInCovering", defaultMaxCellsInCovering, &maxCellsInCovering);
+
+ // This is advisory.
+ out->maxCellsInCovering = maxCellsInCovering;
+
+ // These are not advisory.
+ out->finestIndexedLevel = finestIndexedLevel;
+ out->coarsestIndexedLevel = coarsestIndexedLevel;
+
uassert(16747, "coarsestIndexedLevel must be >= 0", out->coarsestIndexedLevel >= 0);
uassert(16748, "finestIndexedLevel must be <= 30", out->finestIndexedLevel <= 30);
uassert(16749,