summaryrefslogtreecommitdiff
path: root/src/mongo/db/field_parser-inl.h
diff options
context:
space:
mode:
authorGreg Studer <greg@10gen.com>2014-01-03 15:19:30 -0500
committerGreg Studer <greg@10gen.com>2014-01-07 13:37:09 -0500
commitedcfd827189045b8b64d38cf803d7555cc04132d (patch)
tree9f8ad63a34530ecebd98c41719a1b55120cd7c83 /src/mongo/db/field_parser-inl.h
parent133d28b56d04e67004aac22a18f068d70624393d (diff)
downloadmongo-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.h50
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;
}