summaryrefslogtreecommitdiff
path: root/src/mongo/db/matcher/matcher.cpp
diff options
context:
space:
mode:
authorEliot Horowitz <eliot@10gen.com>2013-05-30 11:57:22 -0400
committerEliot Horowitz <eliot@10gen.com>2013-05-30 11:57:22 -0400
commit29623818ca553d7231a8eb7274ffb16f233670e8 (patch)
tree41ac2383ee2ec89f7311757e8c15365db2ff699f /src/mongo/db/matcher/matcher.cpp
parenta6d055026c3a13b423e099e9d080256ac040f706 (diff)
downloadmongo-29623818ca553d7231a8eb7274ffb16f233670e8.tar.gz
SERVER-9820: Introduce Path and iterators such that all bson walking logic is one place
Diffstat (limited to 'src/mongo/db/matcher/matcher.cpp')
-rw-r--r--src/mongo/db/matcher/matcher.cpp47
1 files changed, 9 insertions, 38 deletions
diff --git a/src/mongo/db/matcher/matcher.cpp b/src/mongo/db/matcher/matcher.cpp
index cfd482d3b33..f0b13ce0624 100644
--- a/src/mongo/db/matcher/matcher.cpp
+++ b/src/mongo/db/matcher/matcher.cpp
@@ -40,13 +40,7 @@ namespace mongo {
return _doc.replaceFieldNames( _pattern );
}
- virtual BSONElement getFieldDottedOrArray( const FieldRef& path,
- size_t* idxPath,
- bool* inArray ) const;
-
- virtual void getFieldsDotted( const StringData& name,
- BSONElementSet &ret,
- bool expandLastArray = true ) const;
+ virtual ElementIterator* getIterator( const ElementPath& path ) const;
private:
@@ -57,6 +51,14 @@ namespace mongo {
};
+ ElementIterator* IndexKeyMatchableDocument::getIterator( const ElementPath& path ) const {
+ BSONElement e = _getElement( path.fieldRef() );
+ if ( e.type() == Array )
+ return new SimpleArrayElementIterator( e, true );
+ return new SingleElementElementIterator( e );
+ }
+
+
BSONElement IndexKeyMatchableDocument::_getElement( const FieldRef& path ) const {
BSONObjIterator patternIterator( _pattern );
BSONObjIterator docIterator( _doc );
@@ -75,37 +77,6 @@ namespace mongo {
}
- BSONElement IndexKeyMatchableDocument::getFieldDottedOrArray( const FieldRef& path,
- size_t* idxPath,
- bool* inArray ) const {
- BSONElement res = _getElement( path );
- if ( !res.eoo() ) {
- *idxPath = path.numParts() - 1;
- *inArray = false;
- }
-
- return res;
- }
-
- void IndexKeyMatchableDocument::getFieldsDotted( const StringData& name,
- BSONElementSet &ret,
- bool expandLastArray ) const {
- BSONObjIterator patternIterator( _pattern );
- BSONObjIterator docIterator( _doc );
-
- while ( patternIterator.more() ) {
- BSONElement patternElement = patternIterator.next();
- verify( docIterator.more() );
- BSONElement docElement = docIterator.next();
-
- if ( name == patternElement.fieldName() ) {
- ret.insert( docElement );
- }
- }
-
- }
-
-
// -----------------
Matcher2::Matcher2( const BSONObj& pattern, bool nested )