Mercurial > browser-couch
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); }