diff options
Diffstat (limited to 'jstests/core/mr1.js')
-rw-r--r-- | jstests/core/mr1.js | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/jstests/core/mr1.js b/jstests/core/mr1.js new file mode 100644 index 00000000000..33390a6187a --- /dev/null +++ b/jstests/core/mr1.js @@ -0,0 +1,184 @@ + +t = db.mr1; +t.drop(); + +t.save( { x : 1 , tags : [ "a" , "b" ] } ); +t.save( { x : 2 , tags : [ "b" , "c" ] } ); +t.save( { x : 3 , tags : [ "c" , "a" ] } ); +t.save( { x : 4 , tags : [ "b" , "c" ] } ); + +emit = printjson; + +function d( x ){ + printjson( x ); +} + +ks = "_id"; +if ( db.version() == "1.1.1" ) + ks = "key"; + + +m = function(){ + this.tags.forEach( + function(z){ + emit( z , { count : 1 } ); + } + ); +}; + +m2 = function(){ + for ( var i=0; i<this.tags.length; i++ ){ + emit( this.tags[i] , 1 ); + } +}; + + +r = function( key , values ){ + var total = 0; + for ( var i=0; i<values.length; i++ ){ + total += values[i].count; + } + return { count : total }; +}; + +r2 = function( key , values ){ + var total = 0; + for ( var i=0; i<values.length; i++ ){ + total += values[i]; + } + return total; +}; + +res = db.runCommand( { mapreduce : "mr1" , map : m , reduce : r , out : "mr1_out" } ); +d( res ); +if ( ks == "_id" ) assert( res.ok , "not ok" ); +assert.eq( 4 , res.counts.input , "A" ); +x = db[res.result]; + +assert.eq( 3 , x.find().count() , "B" ); +x.find().forEach( d ); +z = {}; +x.find().forEach( function(a){ z[a[ks]] = a.value.count; } ); +d( z ); +assert.eq( 3 , Object.keySet( z ).length , "C" ); +assert.eq( 2 , z.a , "D" ); +assert.eq( 3 , z.b , "E" ); +assert.eq( 3 , z.c , "F" ); +x.drop(); + +res = db.runCommand( { mapreduce : "mr1" , map : m , reduce : r , query : { x : { "$gt" : 2 } } , out : "mr1_out" } ); +d( res ); +assert.eq( 2 , res.counts.input , "B" ); +x = db[res.result]; +z = {}; +x.find().forEach( function(a){ z[a[ks]] = a.value.count; } ); +assert.eq( 1 , z.a , "C1" ); +assert.eq( 1 , z.b , "C2" ); +assert.eq( 2 , z.c , "C3" ); +x.drop(); + +res = db.runCommand( { mapreduce : "mr1" , map : m2 , reduce : r2 , query : { x : { "$gt" : 2 } } , out : "mr1_out" } ); +d( res ); +assert.eq( 2 , res.counts.input , "B" ); +x = db[res.result]; +z = {}; +x.find().forEach( function(a){ z[a[ks]] = a.value; } ); +assert.eq( 1 , z.a , "C1z" ); +assert.eq( 1 , z.b , "C2z" ); +assert.eq( 2 , z.c , "C3z" ); +x.drop(); + +res = db.runCommand( { mapreduce : "mr1" , out : "mr1_foo" , map : m , reduce : r , query : { x : { "$gt" : 2 } } } ); +d( res ); +assert.eq( 2 , res.counts.input , "B2" ); +assert.eq( "mr1_foo" , res.result , "B2-c" ); +x = db[res.result]; +z = {}; +x.find().forEach( function(a){ z[a[ks]] = a.value.count; } ); +assert.eq( 1 , z.a , "C1a" ); +assert.eq( 1 , z.b , "C2a" ); +assert.eq( 2 , z.c , "C3a" ); +x.drop(); + +for ( i=5; i<1000; i++ ){ + t.save( { x : i , tags : [ "b" , "d" ] } ); +} + +res = db.runCommand( { mapreduce : "mr1" , map : m , reduce : r , out : "mr1_out" } ); +d( res ); +assert.eq( 999 , res.counts.input , "Z1" ); +x = db[res.result]; +x.find().forEach( d ) +assert.eq( 4 , x.find().count() , "Z2" ); +assert.eq( "a,b,c,d" , x.distinct( ks ) , "Z3" ); + +function getk( k ){ + var o = {}; + o[ks] = k; + return x.findOne( o ); +} + +assert.eq( 2 , getk( "a" ).value.count , "ZA" ); +assert.eq( 998 , getk( "b" ).value.count , "ZB" ); +assert.eq( 3 , getk( "c" ).value.count , "ZC" ); +assert.eq( 995 , getk( "d" ).value.count , "ZD" ); +x.drop(); + +if ( true ){ + printjson( db.runCommand( { mapreduce : "mr1" , map : m , reduce : r , verbose : true , out : "mr1_out" } ) ); +} + +print( "t1: " + Date.timeFunc( + function(){ + var out = db.runCommand( { mapreduce : "mr1" , map : m , reduce : r , out : "mr1_out" } ); + if ( ks == "_id" ) assert( out.ok , "XXX : " + tojson( out ) ); + db[out.result].drop(); + } , 10 ) + " (~500 on 2.8ghz) - itcount: " + Date.timeFunc( function(){ db.mr1.find().itcount(); } , 10 ) ); + + + +// test doesn't exist +res = db.runCommand( { mapreduce : "lasjdlasjdlasjdjasldjalsdj12e" , map : m , reduce : r , out : "mr1_out" } ); +assert( ! res.ok , "should be not ok" ); + +if ( true ){ + correct = {}; + + for ( i=0; i<20000; i++ ){ + k = "Z" + i % 10000; + if ( correct[k] ) + correct[k]++; + else + correct[k] = 1; + t.save( { x : i , tags : [ k ] } ); + } + + res = db.runCommand( { mapreduce : "mr1" , out : "mr1_foo" , map : m , reduce : r } ); + d( res ); + print( "t2: " + res.timeMillis + " (~3500 on 2.8ghz) - itcount: " + Date.timeFunc( function(){ db.mr1.find().itcount(); } ) ); + x = db[res.result]; + z = {}; + x.find().forEach( function(a){ z[a[ks]] = a.value.count; } ); + for ( zz in z ){ + if ( zz.indexOf( "Z" ) == 0 ){ + assert.eq( correct[zz] , z[zz] , "ZZ : " + zz ); + } + } + x.drop(); + + res = db.runCommand( { mapreduce : "mr1" , out : "mr1_foo" , map : m2 , reduce : r2 , out : "mr1_out" } ); + d(res); + print( "t3: " + res.timeMillis + " (~3500 on 2.8ghz)" ); + + res = db.runCommand( { mapreduce : "mr1" , map : m2 , reduce : r2 , out : { inline : true } } ); + print( "t4: " + res.timeMillis ); + +} + + +res = db.runCommand( { mapreduce : "mr1" , map : m , reduce : r , out : "mr1_out" } ); +assert( res.ok , "should be ok" ); + +t.drop(); +t1 = db.mr1_out; +t1.drop();
\ No newline at end of file |