From a7f063dc2178b6745cca289c68687cf6939805ca Mon Sep 17 00:00:00 2001 From: Eliot Horowitz Date: Mon, 21 Jun 2010 11:18:33 -0400 Subject: [PATCH] nicer way to create bson BSONField x("x"); BSONObj o = BSON( x(5) ); ASSERT_EQUALS( BSON( "x" << 5 ) , o ); o = BSON( x.gt(5) ); ASSERT_EQUALS( BSON( "x" << BSON( "$gt" << 5 ) ) , o ); --- bson/bsoninlines.h | 7 ++++++ bson/bsonobjbuilder.h | 55 ++++++++++++++++++++++++++++++++++++++++++ dbtests/jsobjtests.cpp | 28 +++++++++++++++++++++ 3 files changed, 90 insertions(+) diff --git a/bson/bsoninlines.h b/bson/bsoninlines.h index 0eeb1fe5cd539..6cd625b4ab074 100644 --- a/bson/bsoninlines.h +++ b/bson/bsoninlines.h @@ -572,4 +572,11 @@ namespace mongo { } inline void BSONElement::Val(BSONObj& v) const { v = Obj(); } + + template + inline BSONFieldValue BSONField::query( const char * q , const T& t ) const { + BSONObjBuilder b; + b.append( q , t ); + return BSONFieldValue( _name , b.obj() ); + } } diff --git a/bson/bsonobjbuilder.h b/bson/bsonobjbuilder.h index a6ae16633deb1..25b7d26f315a2 100644 --- a/bson/bsonobjbuilder.h +++ b/bson/bsonobjbuilder.h @@ -33,6 +33,48 @@ namespace mongo { #pragma warning( disable : 4355 ) #endif + template + class BSONFieldValue { + public: + BSONFieldValue( const string& name , const T& t ){ + _name = name; + _t = t; + } + + const T& value() const { return _t; } + const string& name() const { return _name; } + + private: + string _name; + T _t; + }; + + template + class BSONField { + public: + BSONField( const string& name , const string& longName="" ) + : _name(name), _longName(longName){} + const string& name() const { return _name; } + operator string() const { return _name; } + + BSONFieldValue make( const T& t ) const { + return BSONFieldValue( _name , t ); + } + + BSONFieldValue gt( const T& t ) const { return query( "$gt" , t ); } + BSONFieldValue lt( const T& t ) const { return query( "$lt" , t ); } + + BSONFieldValue query( const char * q , const T& t ) const; + + BSONFieldValue operator()( const T& t ) const { + return BSONFieldValue( _name , t ); + } + + private: + string _name; + string _longName; + }; + /** Utility for creating a BSONObj. See also the BSON() and BSON_ARRAY() macros. */ @@ -527,6 +569,19 @@ namespace mongo { return _s << l; } + template + BSONObjBuilderValueStream& operator<<( const BSONField& f ) { + _s.endField( f.name().c_str() ); + return _s; + } + + template + BSONObjBuilder& operator<<( const BSONFieldValue& v ) { + append( v.name().c_str() , v.value() ); + return *this; + } + + /** @return true if we are using our own bufbuilder, and not an alternate that was given to us in our constructor */ bool owned() const { return &_b == &_buf; } diff --git a/dbtests/jsobjtests.cpp b/dbtests/jsobjtests.cpp index aea51d7c841b5..3d1d9c4d973c7 100644 --- a/dbtests/jsobjtests.cpp +++ b/dbtests/jsobjtests.cpp @@ -1512,6 +1512,33 @@ namespace JsobjTests { } }; + class BSONFieldTests { + public: + void run(){ + { + BSONField x("x"); + BSONObj o = BSON( x << 5 ); + ASSERT_EQUALS( BSON( "x" << 5 ) , o ); + } + + { + BSONField x("x"); + BSONObj o = BSON( x.make(5) ); + ASSERT_EQUALS( BSON( "x" << 5 ) , o ); + } + + { + BSONField x("x"); + BSONObj o = BSON( x(5) ); + ASSERT_EQUALS( BSON( "x" << 5 ) , o ); + + o = BSON( x.gt(5) ); + ASSERT_EQUALS( BSON( "x" << BSON( "$gt" << 5 ) ) , o ); + } + + } + }; + class All : public Suite { public: All() : Suite( "jsobj" ){ @@ -1607,6 +1634,7 @@ namespace JsobjTests { add< ElementSetTest >(); add< EmbeddedNumbers >(); add< BuilderPartialItearte >(); + add< BSONFieldTests >(); } } myall;