summaryrefslogtreecommitdiff
path: root/src/mongo/db/index/external_key_generator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/index/external_key_generator.cpp')
-rw-r--r--src/mongo/db/index/external_key_generator.cpp235
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, &params);
- 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, &params);
- 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, &params);
+ 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, &params);
+ 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