diff options
author | Eliot Horowitz <eliot@10gen.com> | 2009-09-09 12:25:02 -0400 |
---|---|---|
committer | Eliot Horowitz <eliot@10gen.com> | 2009-09-09 12:25:02 -0400 |
commit | 0cb4b01795614185bcc308d64cf282181d3a0a5e (patch) | |
tree | 18409519b7438ee02914d8ebff60c6ec8ab99a8d | |
parent | 927078af784a2867e9851367b8e0975c3c024e29 (diff) | |
download | mongo-0cb4b01795614185bcc308d64cf282181d3a0a5e.tar.gz |
fix SERVER-282 - BSONObj::extractFields
-rw-r--r-- | db/jsobj.cpp | 5 | ||||
-rw-r--r-- | dbtests/jsobjtests.cpp | 62 | ||||
-rw-r--r-- | jstests/sort4.js | 16 |
3 files changed, 71 insertions, 12 deletions
diff --git a/db/jsobj.cpp b/db/jsobj.cpp index 22b7051c9a0..374a7269f62 100644 --- a/db/jsobj.cpp +++ b/db/jsobj.cpp @@ -925,8 +925,9 @@ namespace mongo { break; BSONElement x = getFieldDotted(e.fieldName()); if ( x.eoo() ) - return BSONObj(); - b.append(x); + b.appendNull( e.fieldName() ); + else + b.append(x); } return b.obj(); } diff --git a/dbtests/jsobjtests.cpp b/dbtests/jsobjtests.cpp index 0dfd0f62ebf..3a43e569566 100644 --- a/dbtests/jsobjtests.cpp +++ b/dbtests/jsobjtests.cpp @@ -722,6 +722,66 @@ namespace JsobjTests { }; + class ExtractFieldsTest { + public: + void run(){ + BSONObj x = BSON( "a" << 10 << "b" << 11 ); + assert( BSON( "a" << 10 ).woCompare( x.extractFields( BSON( "a" << 1 ) ) ) == 0 ); + assert( BSON( "b" << 11 ).woCompare( x.extractFields( BSON( "b" << 1 ) ) ) == 0 ); + assert( x.woCompare( x.extractFields( BSON( "a" << 1 << "b" << 1 ) ) ) == 0 ); + + assert( (string)"a" == x.extractFields( BSON( "a" << 1 << "c" << 1 ) ).firstElement().fieldName() ); + } + }; + + class ComparatorTest { + public: + BSONObj one( string s ){ + return BSON( "x" << s ); + } + BSONObj two( string x , string y ){ + BSONObjBuilder b; + b.append( "x" , x ); + if ( y.size() ) + b.append( "y" , y ); + else + b.appendNull( "y" ); + return b.obj(); + } + + void test( BSONObj order , BSONObj l , BSONObj r , bool wanted ){ + BSONObjCmp c( order ); + bool got = c(l,r); + if ( got == wanted ) + return; + cout << " order: " << order << " l: " << l << "r: " << r << " wanted: " << wanted << " got: " << got << endl; + } + + void lt( BSONObj order , BSONObj l , BSONObj r ){ + test( order , l , r , 1 ); + } + + void run(){ + BSONObj s = BSON( "x" << 1 ); + BSONObj c = BSON( "x" << 1 << "y" << 1 ); + test( s , one( "A" ) , one( "B" ) , 1 ); + test( s , one( "B" ) , one( "A" ) , 0 ); + + test( c , two( "A" , "A" ) , two( "A" , "B" ) , 1 ); + test( c , two( "A" , "A" ) , two( "B" , "A" ) , 1 ); + test( c , two( "B" , "A" ) , two( "A" , "B" ) , 0 ); + + lt( c , one("A") , two( "A" , "A" ) ); + lt( c , one("A") , one( "B" ) ); + lt( c , two("A","") , two( "B" , "A" ) ); + + lt( c , two("B","A") , two( "C" , "A" ) ); + lt( c , two("B","A") , one( "C" ) ); + lt( c , two("B","A") , two( "C" , "" ) ); + + } + }; + class All : public Suite { public: All() { @@ -784,6 +844,8 @@ namespace JsobjTests { add< ValueStreamTests::ElementAppend >(); add< SubObjectBuilder >(); add< MinMaxElementTest >(); + add< ComparatorTest >(); + add< ExtractFieldsTest >(); } }; diff --git a/jstests/sort4.js b/jstests/sort4.js index e7c987f3bbc..5174b46f41f 100644 --- a/jstests/sort4.js +++ b/jstests/sort4.js @@ -33,15 +33,11 @@ t.save({name: 'A'}) nice( {name:1, prename:1} , "A,AB,AC,BB,BD" , "e1" ); t.save({name: 'C'}) +nice( {name:1, prename:1} , "A,AB,AC,BB,BD,C" , "e2" ); // SERVER-282 -//nice({name:1, prename:1}) -//nice( {name:1, prename:1} , "A,AB,AC,BB,BD,C" , "e2" ); // SERVER-282 +t.ensureIndex( { name : 1 , prename : 1 } ); +nice( {name:1, prename:1} , "A,AB,AC,BB,BD,C" , "e2ia" ); // SERVER-282 -//t.ensureIndex( { name : 1 , prename : 1 } ); -//nice({name:1, prename:1}) -//nice( {name:1, prename:1} , "A,AB,AC,BB,BD,C" , "e2ia" ); // SERVER-282 - -//t.dropIndexes(); -//t.ensureIndex( { name : 1 } ); -//nice({name:1, prename:1}) -//nice( {name:1, prename:1} , "A,AB,AC,BB,BD,C" , "e2ib" ); // SERVER-282 +t.dropIndexes(); +t.ensureIndex( { name : 1 } ); +nice( {name:1, prename:1} , "A,AB,AC,BB,BD,C" , "e2ib" ); // SERVER-282 |