diff options
author | Eliot Horowitz <eliot@10gen.com> | 2013-05-30 11:57:22 -0400 |
---|---|---|
committer | Eliot Horowitz <eliot@10gen.com> | 2013-05-30 11:57:22 -0400 |
commit | 29623818ca553d7231a8eb7274ffb16f233670e8 (patch) | |
tree | 41ac2383ee2ec89f7311757e8c15365db2ff699f /src/mongo/db/matcher/matcher.cpp | |
parent | a6d055026c3a13b423e099e9d080256ac040f706 (diff) | |
download | mongo-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.cpp | 47 |
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 ) |