summaryrefslogtreecommitdiff
path: root/src/mongo/db/projection.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/projection.h')
-rw-r--r--src/mongo/db/projection.h225
1 files changed, 112 insertions, 113 deletions
diff --git a/src/mongo/db/projection.h b/src/mongo/db/projection.h
index b9424cec3e9..de495ce327f 100644
--- a/src/mongo/db/projection.h
+++ b/src/mongo/db/projection.h
@@ -39,136 +39,135 @@
namespace mongo {
- /**
- * given a document and a projection specification
- * can transform the document
- * currently supports specifying which fields and $slice
- */
- class Projection {
+/**
+ * given a document and a projection specification
+ * can transform the document
+ * currently supports specifying which fields and $slice
+ */
+class Projection {
+public:
+ class KeyOnly {
public:
+ KeyOnly() : _stringSize(0) {}
- class KeyOnly {
- public:
-
- KeyOnly() : _stringSize(0) {}
+ BSONObj hydrate(const BSONObj& key) const;
- BSONObj hydrate( const BSONObj& key ) const;
-
- void addNo() { _add( false , "" ); }
- void addYes( const std::string& name ) { _add( true , name ); }
-
- private:
+ void addNo() {
+ _add(false, "");
+ }
+ void addYes(const std::string& name) {
+ _add(true, name);
+ }
- void _add( bool b , const std::string& name ) {
- _include.push_back( b );
- _names.push_back( name );
- _stringSize += name.size();
- }
+ private:
+ void _add(bool b, const std::string& name) {
+ _include.push_back(b);
+ _names.push_back(name);
+ _stringSize += name.size();
+ }
- std::vector<bool> _include; // one entry per field in key. true iff should be in output
- std::vector<std::string> _names; // name of field since key doesn't have names
+ std::vector<bool> _include; // one entry per field in key. true iff should be in output
+ std::vector<std::string> _names; // name of field since key doesn't have names
- int _stringSize;
- };
+ int _stringSize;
+ };
- enum ArrayOpType {
- ARRAY_OP_NORMAL = 0,
- ARRAY_OP_ELEM_MATCH,
- ARRAY_OP_POSITIONAL
- };
+ enum ArrayOpType { ARRAY_OP_NORMAL = 0, ARRAY_OP_ELEM_MATCH, ARRAY_OP_POSITIONAL };
- Projection() :
- _include(true) ,
- _special(false) ,
- _includeID(true) ,
- _skip(0) ,
- _limit(-1) ,
- _arrayOpType(ARRAY_OP_NORMAL),
- _hasNonSimple(false) {
- }
+ Projection()
+ : _include(true),
+ _special(false),
+ _includeID(true),
+ _skip(0),
+ _limit(-1),
+ _arrayOpType(ARRAY_OP_NORMAL),
+ _hasNonSimple(false) {}
- /**
- * called once per lifetime
- * e.g. { "x" : 1 , "a.y" : 1 }
- */
- void init(const BSONObj& spec, const MatchExpressionParser::WhereCallback& whereCallback);
-
- /**
- * @return the spec init was called with
- */
- BSONObj getSpec() const { return _source; }
-
- /**
- * transforms in according to spec
- */
- BSONObj transform( const BSONObj& in, const MatchDetails* details = NULL ) const;
-
-
- /**
- * transforms in according to spec
- */
- void transform( const BSONObj& in , BSONObjBuilder& b, const MatchDetails* details = NULL ) const;
-
-
- /**
- * @return if the keyPattern has all the information needed to return then
- * return a new KeyOnly otherwise null
- * NOTE: a key may have modified the actual data
- * which has to be handled above this (arrays, geo)
- */
- KeyOnly* checkKey( const BSONObj& keyPattern ) const;
-
- bool includeID() const { return _includeID; }
-
- /**
- * get the type of array operator for the projection
- * @return ARRAY_OP_NORMAL if no array projection modifier,
- * ARRAY_OP_ELEM_MATCH if one or more $elemMatch specifier,
- * ARRAY_OP_POSITIONAL if one '.$' projection specified
- */
- ArrayOpType getArrayOpType() const;
-
- /**
- * Validate the given query satisfies this projection's positional operator.
- * NOTE: this function is only used to validate projections with a positional operator.
- * @param query User-supplied query specifier
- * @return Field name if found, empty std::string otherwise.
- */
- void validateQuery( const BSONObj query ) const;
+ /**
+ * called once per lifetime
+ * e.g. { "x" : 1 , "a.y" : 1 }
+ */
+ void init(const BSONObj& spec, const MatchExpressionParser::WhereCallback& whereCallback);
- private:
+ /**
+ * @return the spec init was called with
+ */
+ BSONObj getSpec() const {
+ return _source;
+ }
- /**
- * appends e to b if user wants it
- * will descend into e if needed
- */
- void append( BSONObjBuilder& b , const BSONElement& e, const MatchDetails* details = NULL,
- const ArrayOpType arrayOpType = ARRAY_OP_NORMAL ) const;
+ /**
+ * transforms in according to spec
+ */
+ BSONObj transform(const BSONObj& in, const MatchDetails* details = NULL) const;
- void add( const std::string& field, bool include );
- void add( const std::string& field, int skip, int limit );
- void appendArray( BSONObjBuilder& b , const BSONObj& a , bool nested=false) const;
- bool _include; // true if default at this level is to include
- bool _special; // true if this level can't be skipped or included without recursing
+ /**
+ * transforms in according to spec
+ */
+ void transform(const BSONObj& in, BSONObjBuilder& b, const MatchDetails* details = NULL) const;
- //TODO: benchmark std::vector<pair> vs map
- typedef StringMap<boost::shared_ptr<Projection> > FieldMap;
- FieldMap _fields;
- BSONObj _source;
- bool _includeID;
- // used for $slice operator
- int _skip;
- int _limit;
+ /**
+ * @return if the keyPattern has all the information needed to return then
+ * return a new KeyOnly otherwise null
+ * NOTE: a key may have modified the actual data
+ * which has to be handled above this (arrays, geo)
+ */
+ KeyOnly* checkKey(const BSONObj& keyPattern) const;
- // used for $elemMatch and positional operator ($)
- typedef StringMap<boost::shared_ptr<Matcher> > Matchers;
- Matchers _matchers;
- ArrayOpType _arrayOpType;
+ bool includeID() const {
+ return _includeID;
+ }
- bool _hasNonSimple;
- };
+ /**
+ * get the type of array operator for the projection
+ * @return ARRAY_OP_NORMAL if no array projection modifier,
+ * ARRAY_OP_ELEM_MATCH if one or more $elemMatch specifier,
+ * ARRAY_OP_POSITIONAL if one '.$' projection specified
+ */
+ ArrayOpType getArrayOpType() const;
+ /**
+ * Validate the given query satisfies this projection's positional operator.
+ * NOTE: this function is only used to validate projections with a positional operator.
+ * @param query User-supplied query specifier
+ * @return Field name if found, empty std::string otherwise.
+ */
+ void validateQuery(const BSONObj query) const;
+private:
+ /**
+ * appends e to b if user wants it
+ * will descend into e if needed
+ */
+ void append(BSONObjBuilder& b,
+ const BSONElement& e,
+ const MatchDetails* details = NULL,
+ const ArrayOpType arrayOpType = ARRAY_OP_NORMAL) const;
+
+ void add(const std::string& field, bool include);
+ void add(const std::string& field, int skip, int limit);
+ void appendArray(BSONObjBuilder& b, const BSONObj& a, bool nested = false) const;
+
+ bool _include; // true if default at this level is to include
+ bool _special; // true if this level can't be skipped or included without recursing
+
+ // TODO: benchmark std::vector<pair> vs map
+ typedef StringMap<boost::shared_ptr<Projection>> FieldMap;
+ FieldMap _fields;
+ BSONObj _source;
+ bool _includeID;
+
+ // used for $slice operator
+ int _skip;
+ int _limit;
+
+ // used for $elemMatch and positional operator ($)
+ typedef StringMap<boost::shared_ptr<Matcher>> Matchers;
+ Matchers _matchers;
+ ArrayOpType _arrayOpType;
+
+ bool _hasNonSimple;
+};
}