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