changeset 20:1d8e0d388549

reduce phase now supports progress callbacks/asynchronous behavior.
author Atul Varma <varmaa@toolness.com>
date Mon, 13 Apr 2009 11:55:53 -0700
parents 3dd04250a3d2
children 029b3e094e67
files browser-couch.js tests.js
diffstat 2 files changed, 36 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/browser-couch.js	Mon Apr 13 11:39:26 2009 -0700
+++ b/browser-couch.js	Mon Apr 13 11:55:53 2009 -0700
@@ -192,6 +192,7 @@
     var mapDict = {};
     var mapKeys = [];
     var keys = dict.getKeys();
+    var rows = [];
     var currDoc;
 
     function emit(key, value) {
@@ -233,7 +234,7 @@
         doReduce();
       else {
         if (progress)
-          progress(i / keys.length, continueMap);
+          progress("map", i / keys.length, continueMap);
         else
           window.setTimeout(continueMap, DEFAULT_UI_BREATHE_TIME);
       }
@@ -242,14 +243,32 @@
     continueMap();
 
     function doReduce() {
-      var rows = [];
       if (reduce) {
-        for (var i = 0; i < mapKeys.length; i++) {
-          var key = mapKeys[i];
-          var item = mapDict[key];
-          rows.push({key: key,
-                     value: reduce(item.keys, item.values)});
+        var i = 0;
+
+        function continueReduce() {
+          var iAtStart = i;
+
+          do {
+            var key = mapKeys[i];
+            var item = mapDict[key];
+            rows.push({key: key,
+                       value: reduce(item.keys, item.values)});
+            i++;
+          } while (i - iAtStart < chunkSize &&
+                   i < mapKeys.length)
+
+          if (i == mapKeys.length)
+            doSort();
+          else {
+            if (progress)
+              progress("reduce", i / mapKeys.length, continueReduce);
+            else
+              window.setTimeout(continueReduce, DEFAULT_UI_BREATHE_TIME);
+          }
         }
+
+        continueReduce();
       } else {
         for (i = 0; i < mapKeys.length; i++) {
           var key = mapKeys[i];
@@ -262,7 +281,12 @@
                        value: value});
           }
         }
+
+        doSort();
       }
+    }
+
+    function doSort() {
       rows.sort(function compare(a, b) {
                   if (a.key < b.key)
                     return -1;
--- a/tests.js	Mon Apr 13 11:39:26 2009 -0700
+++ b/tests.js	Mon Apr 13 11:55:53 2009 -0700
@@ -82,9 +82,11 @@
                  return sum;
                },
                chunkSize: 1,
-               progress: function(percentDone, resume) {
-                 self.assertEqual(percentDone, 0.5);
-                 progressCalled = true;
+               progress: function(phase, percentDone, resume) {
+                 if (phase == "map") {
+                   self.assertEqual(percentDone, 0.5);
+                   progressCalled = true;
+                 }
                  resume();
                },
                finished: function(result) {