diff options
author | Kevin Albertson <kevin.albertson@10gen.com> | 2015-07-13 21:36:48 -0400 |
---|---|---|
committer | Kevin Albertson <kevin.albertson@10gen.com> | 2015-07-17 12:07:33 -0400 |
commit | c949bb6042e115cc0824701650610eaf00f6bd78 (patch) | |
tree | 2ab7a1e0f5b091bdbc96f8a2c581b782ac36dec4 /src/mongo/db/index | |
parent | f4d695fcf382820c7ea082bd4b1beb84e15cf2c5 (diff) | |
download | mongo-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.cpp | 48 |
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, |