changeset 16:53b9f2e988da

Refactored reduce implementation so it'll be parallelizable/chunkable like map currently is.
author Atul Varma <varmaa@toolness.com>
date Fri, 10 Apr 2009 17:25:57 -0700
parents 01237459756d
children 4edbac0644f9
files browser-couch.js
diffstat 1 files changed, 18 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/browser-couch.js	Fri Apr 10 17:03:33 2009 -0700
+++ b/browser-couch.js	Fri Apr 10 17:25:57 2009 -0700
@@ -205,20 +205,22 @@
   _mapReduce: function BC__mapReduce(map, reduce, dict, progress,
                                      finished, chunkSize) {
     var len = dict.getLength();
-    var mapKeys = {};
-    var mapValues = {};
+    var mapKeyIndex = {};
+    var mapKeys = [];
+    var mapValues = [];
     var currDoc;
 
     function emit(key, value) {
       // TODO: This assumes that the key will always be
       // an indexable value. We may have to hash the value,
       // though, if it's e.g. an Object.
-      if (!mapKeys[key]) {
-        mapKeys[key] = [];
-        mapValues[key] = [];
+      if (typeof(mapKeyIndex[key]) == "undefined") {
+        mapKeys.push([]);
+        mapKeyIndex[key] = mapValues.push([]) - 1;
       }
-      mapKeys[key].push([key, currDoc.id]);
-      mapValues[key].push(value);
+      var index = mapKeyIndex[key];
+      mapKeys[index].push([key, currDoc.id]);
+      mapValues[index].push(value);
     }
 
     // Maximum number of items to process before giving the UI a chance
@@ -260,15 +262,18 @@
       var reduceResult;
       if (reduce) {
         reduceResult = {};
-        for (key in mapKeys) {
-          reduceResult[key] = reduce(mapKeys[key],
-                                     mapValues[key]);
+        for (var i = 0; i < mapKeys.length; i++) {
+          var key = mapKeys[i][0][0];
+          reduceResult[key] = reduce(mapKeys[i],
+                                     mapValues[i]);
         }
       } else {
         reduceResult = [];
-        for (key in mapValues)
-          for (var i = 0; i < mapValues[key].length; i++)
-            reduceResult.push([key, mapValues[key][i]]);
+        for (i = 0; i < mapKeys.length; i++) {
+          var key = mapKeys[i][0][0];
+          for (var j = 0; j < mapValues[i].length; j++)
+            reduceResult.push([key, mapValues[i][j]]);
+        }
       }
       finished(reduceResult);
     }