0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-11-30 17:10:48 +01:00

finish + switch to simpler+cleaner new object from mod code

This commit is contained in:
Eliot Horowitz 2009-12-10 16:38:47 -05:00
parent 4119148e97
commit 341cd83dd1
3 changed files with 47 additions and 17 deletions

View File

@ -81,6 +81,40 @@ namespace mongo {
bb.done();
break;
}
case PULL:
case PULL_ALL: {
uassert( "$pull/$pullAll can only be applied to an array" , in.type() == Array );
BSONObjBuilder bb( b.subarrayStart( shortFieldName ) );
int n = 0;
BSONObjIterator i( in.embeddedObject() );
while ( i.more() ){
BSONElement e = i.next();
bool allowed = true;
if ( op == PULL ){
allowed = e.woCompare( elt , false ) != 0;
}
else {
BSONObjIterator j( elt.embeddedObject() );
while( j.more() ) {
BSONElement arrJ = j.next();
if ( e.woCompare( arrJ, false ) == 0 ){
allowed = false;
break;
}
}
}
if ( allowed )
bb.appendAs( e , bb.numStr( n++ ) );
}
bb.done();
break;
}
case POP: {
uassert( "$pop can only be applied to an array" , in.type() == Array );
@ -117,7 +151,7 @@ namespace mongo {
bb.done();
break;
}
default:
stringstream ss;
ss << "Mod::apply can't handle type: " << op;
@ -269,7 +303,6 @@ namespace mongo {
ModHolder::iterator mend = _mods.lower_bound( root + "{" );
set<string> onedownseen;
list<Mod*> toadd; // TODO: remove. this is a hack to make new and old impls. identical. when testing is complete, we should remove
while ( e.type() && m != mend ){
string field = root + e.fieldName();
@ -290,7 +323,7 @@ namespace mongo {
continue;
}
case LEFT_BEFORE:
toadd.push_back( &(m->second) );
_appendNewFromMods( root , m->second , b , onedownseen );
m++;
continue;
case SAME:
@ -315,10 +348,6 @@ namespace mongo {
e = es.next();
}
for ( list<Mod*>::iterator i=toadd.begin(); i!=toadd.end(); i++ )
_appendNewFromMods( root , **i , b , onedownseen );
for ( ; m != mend; m++ ){
_appendNewFromMods( root , m->second , b , onedownseen );
}

View File

@ -226,7 +226,7 @@ namespace mongo {
BSONObj createNewFromMods_r( const BSONObj &obj );
BSONObj createNewFromMods( const BSONObj &obj ){
return createNewFromMods_l( obj );
return createNewFromMods_r( obj );
}
/**

View File

@ -550,17 +550,18 @@ namespace UpdateTests {
void test( BSONObj morig , BSONObj in , BSONObj wanted ){
int its = 1000;
double o = _test( morig , in , wanted , false , its );
double n = _test( morig , in , wanted , true , its );
double r = o / n;
cout << " new is : " << r << " x faster" << endl;
if ( false ){
int its = 1000;
double o = _test( morig , in , wanted , false , its );
double n = _test( morig , in , wanted , true , its );
double r = o / n;
cout << " new is : " << r << " x faster" << endl;
}
BSONObj m = morig.copy();
ModSet set;
set.getMods( m );
BSONObj out = set.createNewFromMods( in );
ASSERT_EQUALS( wanted , out );
}
@ -596,7 +597,7 @@ namespace UpdateTests {
BSONObj m = BSON( "$inc" << BSON( "x" << 1 ) );
test( m , BSON( "x" << 5 ) , BSON( "x" << 6 ) );
test( m , BSON( "a" << 5 ) , BSON( "a" << 5 << "x" << 1 ) );
test( m , BSON( "z" << 5 ) , BSON( "z" << 5 << "x" << 1 ) );
test( m , BSON( "z" << 5 ) , BSON( "x" << 1 << "z" << 5 ) );
}
};
@ -620,7 +621,7 @@ namespace UpdateTests {
test( BSON( "$set" << BSON( "x" << 17 ) ) , BSONObj() , BSON( "x" << 17 ) );
test( BSON( "$set" << BSON( "x" << 17 ) ) , BSON( "x" << 5 ) , BSON( "x" << 17 ) );
test( BSON( "$set" << BSON( "x.a" << 17 ) ) , BSON( "z" << 5 ) , BSON( "z" << 5 << "x" << BSON( "a" << 17 ) ) );
test( BSON( "$set" << BSON( "x.a" << 17 ) ) , BSON( "z" << 5 ) , BSON( "x" << BSON( "a" << 17 )<< "z" << 5 ) );
}
};