summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEliot Horowitz <eliot@10gen.com>2009-09-09 12:25:02 -0400
committerEliot Horowitz <eliot@10gen.com>2009-09-09 12:25:02 -0400
commit0cb4b01795614185bcc308d64cf282181d3a0a5e (patch)
tree18409519b7438ee02914d8ebff60c6ec8ab99a8d
parent927078af784a2867e9851367b8e0975c3c024e29 (diff)
downloadmongo-0cb4b01795614185bcc308d64cf282181d3a0a5e.tar.gz
fix SERVER-282 - BSONObj::extractFields
-rw-r--r--db/jsobj.cpp5
-rw-r--r--dbtests/jsobjtests.cpp62
-rw-r--r--jstests/sort4.js16
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