summaryrefslogtreecommitdiff
path: root/src/mongo/shell/mr.js
diff options
context:
space:
mode:
authorEliot Horowitz <eliot@10gen.com>2011-12-24 15:33:26 -0500
committerEliot Horowitz <eliot@10gen.com>2011-12-24 15:33:45 -0500
commitae1ecd9c786911f9f1f0242f0f7d702b3e5dfeba (patch)
tree92f8e1649e6f080b251ff5f1763679a72eb59b34 /src/mongo/shell/mr.js
parentdfa4cd7e2cf109b072440155fabc08a93c8045a0 (diff)
downloadmongo-ae1ecd9c786911f9f1f0242f0f7d702b3e5dfeba.tar.gz
bulk move of code to src/ SERVER-4551
Diffstat (limited to 'src/mongo/shell/mr.js')
-rw-r--r--src/mongo/shell/mr.js95
1 files changed, 95 insertions, 0 deletions
diff --git a/src/mongo/shell/mr.js b/src/mongo/shell/mr.js
new file mode 100644
index 00000000000..7b0814dd557
--- /dev/null
+++ b/src/mongo/shell/mr.js
@@ -0,0 +1,95 @@
+// mr.js
+
+MR = {};
+
+MR.init = function(){
+ $max = 0;
+ $arr = [];
+ emit = MR.emit;
+ $numEmits = 0;
+ $numReduces = 0;
+ $numReducesToDB = 0;
+ gc(); // this is just so that keep memory size sane
+}
+
+MR.cleanup = function(){
+ MR.init();
+ gc();
+}
+
+MR.emit = function(k,v){
+ $numEmits++;
+ var num = nativeHelper.apply( get_num_ , [ k ] );
+ var data = $arr[num];
+ if ( ! data ){
+ data = { key : k , values : new Array(1000) , count : 0 };
+ $arr[num] = data;
+ }
+ data.values[data.count++] = v;
+ $max = Math.max( $max , data.count );
+}
+
+MR.doReduce = function( useDB ){
+ $numReduces++;
+ if ( useDB )
+ $numReducesToDB++;
+ $max = 0;
+ for ( var i=0; i<$arr.length; i++){
+ var data = $arr[i];
+ if ( ! data )
+ continue;
+
+ if ( useDB ){
+ var x = tempcoll.findOne( { _id : data.key } );
+ if ( x ){
+ data.values[data.count++] = x.value;
+ }
+ }
+
+ var r = $reduce( data.key , data.values.slice( 0 , data.count ) );
+ if ( r && r.length && r[0] ){
+ data.values = r;
+ data.count = r.length;
+ }
+ else{
+ data.values[0] = r;
+ data.count = 1;
+ }
+
+ $max = Math.max( $max , data.count );
+
+ if ( useDB ){
+ if ( data.count == 1 ){
+ tempcoll.save( { _id : data.key , value : data.values[0] } );
+ }
+ else {
+ tempcoll.save( { _id : data.key , value : data.values.slice( 0 , data.count ) } );
+ }
+ }
+ }
+}
+
+MR.check = function(){
+ if ( $max < 2000 && $arr.length < 1000 ){
+ return 0;
+ }
+ MR.doReduce();
+ if ( $max < 2000 && $arr.length < 1000 ){
+ return 1;
+ }
+ MR.doReduce( true );
+ $arr = [];
+ $max = 0;
+ reset_num();
+ gc();
+ return 2;
+}
+
+MR.finalize = function(){
+ tempcoll.find().forEach(
+ function(z){
+ z.value = $finalize( z._id , z.value );
+ tempcoll.save( z );
+ }
+ );
+}