diff options
author | Greg Studer <greg@10gen.com> | 2014-01-03 15:19:30 -0500 |
---|---|---|
committer | Greg Studer <greg@10gen.com> | 2014-01-07 13:37:09 -0500 |
commit | edcfd827189045b8b64d38cf803d7555cc04132d (patch) | |
tree | 9f8ad63a34530ecebd98c41719a1b55120cd7c83 /src/mongo/db/field_parser-inl.h | |
parent | 133d28b56d04e67004aac22a18f068d70624393d (diff) | |
download | mongo-edcfd827189045b8b64d38cf803d7555cc04132d.tar.gz |
SERVER-12139 allow BSONElement parsing for single-pass parse speedup
Diffstat (limited to 'src/mongo/db/field_parser-inl.h')
-rw-r--r-- | src/mongo/db/field_parser-inl.h | 50 |
1 files changed, 32 insertions, 18 deletions
diff --git a/src/mongo/db/field_parser-inl.h b/src/mongo/db/field_parser-inl.h index 41ab4e1683d..67a8ef4b436 100644 --- a/src/mongo/db/field_parser-inl.h +++ b/src/mongo/db/field_parser-inl.h @@ -34,14 +34,14 @@ namespace mongo { using mongoutils::str::stream; template<class T> - void _genFieldErrMsg(const BSONObj& doc, + void _genFieldErrMsg(const BSONElement& elem, const BSONField<T>& field, const string expected, string* errMsg) { if (!errMsg) return; *errMsg = stream() << "wrong type for '" << field() << "' field, expected " << expected - << ", found " << doc[field.name()].toString(); + << ", found " << elem.toString(); } template<typename T> @@ -62,7 +62,7 @@ namespace mongo { } if (elem.type() != Object && elem.type() != Array) { - _genFieldErrMsg(doc, field, "Object/Array", errMsg); + _genFieldErrMsg(elem, field, "Object/Array", errMsg); return FIELD_INVALID; } @@ -94,7 +94,7 @@ namespace mongo { } if (elem.type() != Object && elem.type() != Array) { - _genFieldErrMsg(doc, field, "Object/Array", errMsg); + _genFieldErrMsg(elem, field, "Object/Array", errMsg); return FIELD_INVALID; } @@ -145,12 +145,19 @@ namespace mongo { // Extracts an array into a vector template<typename T> - FieldParser::FieldState FieldParser::extract(BSONObj doc, - const BSONField<vector<T> >& field, - vector<T>* out, - string* errMsg) + FieldParser::FieldState FieldParser::extract( BSONObj doc, + const BSONField<vector<T> >& field, + vector<T>* out, + string* errMsg ) { + return extract( doc[field.name()], field, out, errMsg ); + } + + template<typename T> + FieldParser::FieldState FieldParser::extract( BSONElement elem, + const BSONField<vector<T> >& field, + vector<T>* out, + string* errMsg ) { - BSONElement elem = doc[field.name()]; if (elem.eoo()) { if (field.hasDefault()) { *out = field.getDefault(); @@ -175,7 +182,7 @@ namespace mongo { BSONElement next = objIt.next(); BSONField<T> fieldFor(next.fieldName(), out->at(initialSize + i)); - if (!FieldParser::extract(arr, + if (!FieldParser::extract(next, fieldFor, &out->at(initialSize + i), &elErrMsg)) @@ -194,7 +201,7 @@ namespace mongo { if (errMsg) { *errMsg = stream() << "wrong type for '" << field() << "' field, expected " - << "vector array" << ", found " << doc[field.name()].toString(); + << "vector array" << ", found " << elem.toString(); } return FIELD_INVALID; } @@ -305,12 +312,19 @@ namespace mongo { // Extracts an object into a map template<typename K, typename T> - FieldParser::FieldState FieldParser::extract(BSONObj doc, - const BSONField<map<K, T> >& field, - map<K, T>* out, - string* errMsg) + FieldParser::FieldState FieldParser::extract( BSONObj doc, + const BSONField<map<K, T> >& field, + map<K, T>* out, + string* errMsg ) { + return extract( doc[field.name()], field, out, errMsg ); + } + + template<typename K, typename T> + FieldParser::FieldState FieldParser::extract( BSONElement elem, + const BSONField<map<K, T> >& field, + map<K, T>* out, + string* errMsg ) { - BSONElement elem = doc[field.name()]; if (elem.eoo()) { if (field.hasDefault()) { *out = field.getDefault(); @@ -331,7 +345,7 @@ namespace mongo { T& value = (*out)[next.fieldName()]; BSONField<T> fieldFor(next.fieldName(), value); - if (!FieldParser::extract(obj, fieldFor, &value, &elErrMsg)) { + if (!FieldParser::extract(next, fieldFor, &value, &elErrMsg)) { if (errMsg) { *errMsg = stream() << "error parsing map element " << next.fieldName() << " of field " << field() << causedBy(elErrMsg); @@ -345,7 +359,7 @@ namespace mongo { if (errMsg) { *errMsg = stream() << "wrong type for '" << field() << "' field, expected " - << "vector array" << ", found " << doc[field.name()].toString(); + << "vector array" << ", found " << elem.toString(); } return FIELD_INVALID; } |