diff options
Diffstat (limited to 'src/mongo/db/index/external_key_generator.cpp')
-rw-r--r-- | src/mongo/db/index/external_key_generator.cpp | 235 |
1 files changed, 112 insertions, 123 deletions
diff --git a/src/mongo/db/index/external_key_generator.cpp b/src/mongo/db/index/external_key_generator.cpp index 4173880d00b..9f93bd6f439 100644 --- a/src/mongo/db/index/external_key_generator.cpp +++ b/src/mongo/db/index/external_key_generator.cpp @@ -42,75 +42,68 @@ namespace mongo { namespace { - void getKeysForUpgradeChecking(const BSONObj& infoObj, - const BSONObj& doc, - BSONObjSet* keys) { - - BSONObj keyPattern = infoObj.getObjectField("key"); - - string type = IndexNames::findPluginName(keyPattern); - - if (IndexNames::GEO_2D == type) { - TwoDIndexingParams params; - ExpressionParams::parseTwoDParams(infoObj, ¶ms); - ExpressionKeysPrivate::get2DKeys(doc, params, keys, NULL); - } - else if (IndexNames::GEO_HAYSTACK == type) { - string geoField; - vector<string> otherFields; - double bucketSize; - ExpressionParams::parseHaystackParams(infoObj, &geoField, &otherFields, &bucketSize); - ExpressionKeysPrivate::getHaystackKeys(doc, geoField, otherFields, bucketSize, keys); - } - else if (IndexNames::GEO_2DSPHERE == type) { - S2IndexingParams params; - ExpressionParams::parse2dsphereParams(infoObj, ¶ms); - ExpressionKeysPrivate::getS2Keys(doc, keyPattern, params, keys); +void getKeysForUpgradeChecking(const BSONObj& infoObj, const BSONObj& doc, BSONObjSet* keys) { + BSONObj keyPattern = infoObj.getObjectField("key"); + + string type = IndexNames::findPluginName(keyPattern); + + if (IndexNames::GEO_2D == type) { + TwoDIndexingParams params; + ExpressionParams::parseTwoDParams(infoObj, ¶ms); + ExpressionKeysPrivate::get2DKeys(doc, params, keys, NULL); + } else if (IndexNames::GEO_HAYSTACK == type) { + string geoField; + vector<string> otherFields; + double bucketSize; + ExpressionParams::parseHaystackParams(infoObj, &geoField, &otherFields, &bucketSize); + ExpressionKeysPrivate::getHaystackKeys(doc, geoField, otherFields, bucketSize, keys); + } else if (IndexNames::GEO_2DSPHERE == type) { + S2IndexingParams params; + ExpressionParams::parse2dsphereParams(infoObj, ¶ms); + ExpressionKeysPrivate::getS2Keys(doc, keyPattern, params, keys); + } else if (IndexNames::TEXT == type) { + fts::FTSSpec spec(infoObj); + ExpressionKeysPrivate::getFTSKeys(doc, spec, keys); + } else if (IndexNames::HASHED == type) { + HashSeed seed; + int version; + string field; + ExpressionParams::parseHashParams(infoObj, &seed, &version, &field); + ExpressionKeysPrivate::getHashKeys( + doc, field, seed, version, infoObj["sparse"].trueValue(), keys); + } else { + invariant(IndexNames::BTREE == type); + + std::vector<const char*> fieldNames; + std::vector<BSONElement> fixed; + BSONObjIterator keyIt(keyPattern); + while (keyIt.more()) { + BSONElement patternElt = keyIt.next(); + fieldNames.push_back(patternElt.fieldName()); + fixed.push_back(BSONElement()); } - else if (IndexNames::TEXT == type) { - fts::FTSSpec spec(infoObj); - ExpressionKeysPrivate::getFTSKeys(doc, spec, keys); - } - else if (IndexNames::HASHED == type) { - HashSeed seed; - int version; - string field; - ExpressionParams::parseHashParams(infoObj, &seed, &version, &field); - ExpressionKeysPrivate::getHashKeys(doc, field, seed, version, infoObj["sparse"].trueValue(), keys); - } - else { - invariant(IndexNames::BTREE == type); - - std::vector<const char *> fieldNames; - std::vector<BSONElement> fixed; - BSONObjIterator keyIt(keyPattern); - while (keyIt.more()) { - BSONElement patternElt = keyIt.next(); - fieldNames.push_back(patternElt.fieldName()); - fixed.push_back(BSONElement()); - } - // XXX: do we care about version - BtreeKeyGeneratorV1 keyGen(fieldNames, fixed, infoObj["sparse"].trueValue()); + // XXX: do we care about version + BtreeKeyGeneratorV1 keyGen(fieldNames, fixed, infoObj["sparse"].trueValue()); - keyGen.getKeys(doc, keys); - } + keyGen.getKeys(doc, keys); } - - // cloned from key.cpp to build the below set - const int binDataCodeLengths[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 32}; - const std::set<int> acceptableBinDataLengths( - binDataCodeLengths, - binDataCodeLengths + (sizeof(binDataCodeLengths) / sizeof(int))); - - // modified version of the KeyV1Owned constructor that returns the would-be-key's datasize() - int keyV1Size(const BSONObj& obj) { - BSONObj::iterator i(obj); - int size = 0; - const int traditionalSize = obj.objsize() + 1; - while (i.more()) { - BSONElement e = i.next(); - switch (e.type()) { +} + +// cloned from key.cpp to build the below set +const int binDataCodeLengths[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 32}; +const std::set<int> acceptableBinDataLengths(binDataCodeLengths, + binDataCodeLengths + + (sizeof(binDataCodeLengths) / sizeof(int))); + +// modified version of the KeyV1Owned constructor that returns the would-be-key's datasize() +int keyV1Size(const BSONObj& obj) { + BSONObj::iterator i(obj); + int size = 0; + const int traditionalSize = obj.objsize() + 1; + while (i.more()) { + BSONElement e = i.next(); + switch (e.type()) { case MinKey: case jstNULL: case MaxKey: @@ -121,86 +114,82 @@ namespace { size += 1; size += OID::kOIDSize; break; - case BinData: - { - int t = e.binDataType(); - // 0-7 and 0x80 to 0x87 are supported by Key - if( (t & 0x78) == 0 && t != ByteArrayDeprecated ) { - int len; - e.binData(len); - if (acceptableBinDataLengths.count(len)) { - size += 1; - size += 1; - size += len; - break; - } + case BinData: { + int t = e.binDataType(); + // 0-7 and 0x80 to 0x87 are supported by Key + if ((t & 0x78) == 0 && t != ByteArrayDeprecated) { + int len; + e.binData(len); + if (acceptableBinDataLengths.count(len)) { + size += 1; + size += 1; + size += len; + break; } - return traditionalSize; } + return traditionalSize; + } case Date: size += 1; size += sizeof(Date_t); break; - case String: - { - size += 1; - // note we do not store the terminating null, to save space. - unsigned x = (unsigned) e.valuestrsize() - 1; - if (x > 255) { - return traditionalSize; - } - size += 1; - size += x; - break; + case String: { + size += 1; + // note we do not store the terminating null, to save space. + unsigned x = (unsigned)e.valuestrsize() - 1; + if (x > 255) { + return traditionalSize; } + size += 1; + size += x; + break; + } case NumberInt: size += 1; size += sizeof(double); break; - case NumberLong: - { - long long n = e._numberLong(); - long long m = 2LL << 52; - if( n >= m || n <= -m ) { - // can't represent exactly as a double - return traditionalSize; - } - size += 1; - size += sizeof(double); - break; + case NumberLong: { + long long n = e._numberLong(); + long long m = 2LL << 52; + if (n >= m || n <= -m) { + // can't represent exactly as a double + return traditionalSize; } - case NumberDouble: - { - double d = e._numberDouble(); - if (std::isnan(d)) { - return traditionalSize; - } - size += 1; - size += sizeof(double); - break; + size += 1; + size += sizeof(double); + break; + } + case NumberDouble: { + double d = e._numberDouble(); + if (std::isnan(d)) { + return traditionalSize; } + size += 1; + size += sizeof(double); + break; + } default: // if other types involved, store as traditional BSON return traditionalSize; - } } - return size; } + return size; +} -} // namespace - - bool isAnyIndexKeyTooLarge(const BSONObj& index, const BSONObj& doc) { - BSONObjSet keys; - getKeysForUpgradeChecking(index, doc, &keys); +} // namespace - int largestKeySize = 0; +bool isAnyIndexKeyTooLarge(const BSONObj& index, const BSONObj& doc) { + BSONObjSet keys; + getKeysForUpgradeChecking(index, doc, &keys); - for (BSONObjSet::const_iterator it = keys.begin(); it != keys.end(); ++it) { - largestKeySize = std::max(largestKeySize, keyV1Size(*it)); - } + int largestKeySize = 0; - // BtreeData_V1::KeyMax is 1024 - return largestKeySize > 1024; + for (BSONObjSet::const_iterator it = keys.begin(); it != keys.end(); ++it) { + largestKeySize = std::max(largestKeySize, keyV1Size(*it)); } + // BtreeData_V1::KeyMax is 1024 + return largestKeySize > 1024; +} + } // namespace mongo |