diff options
author | Damien F. Katz <damien@apache.org> | 2008-05-15 21:51:22 +0000 |
---|---|---|
committer | Damien F. Katz <damien@apache.org> | 2008-05-15 21:51:22 +0000 |
commit | a684f95cbcee7f2568a2ce04e7dc2bbb605a27b3 (patch) | |
tree | 3b2fafecde418e10834ec2e896efffb64b16a33a /share/www/script | |
parent | 41eeac05bff1b0a8b05f1110270c0beecd62991a (diff) |
Incremental reduce first checkin. Warning! Disk format change.
git-svn-id: https://svn.apache.org/repos/asf/incubator/couchdb/trunk@656861 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'share/www/script')
-rw-r--r-- | share/www/script/couch.js | 18 | ||||
-rw-r--r-- | share/www/script/couch_tests.js | 77 |
2 files changed, 87 insertions, 8 deletions
diff --git a/share/www/script/couch.js b/share/www/script/couch.js index 5f42ac38..f72fb712 100644 --- a/share/www/script/couch.js +++ b/share/www/script/couch.js @@ -99,7 +99,23 @@ function CouchDB(name) { mapFun = mapFun.toSource ? mapFun.toSource() : "(" + mapFun.toString() + ")"; var req = request("POST", this.uri + "_temp_view" + encodeOptions(options), { headers: {"Content-Type": "text/javascript"}, - body: mapFun + body: JSON.stringify(mapFun) + }); + var result = JSON.parse(req.responseText); + if (req.status != 200) + throw result; + return result; + } + + // Applies the map function to the contents of database and returns the results. + this.reduce_query = function(mapFun, reduceFun, options) { + if (typeof(mapFun) != "string") + mapFun = mapFun.toSource ? mapFun.toSource() : "(" + mapFun.toString() + ")"; + if (typeof(reduceFun) != "string") + reduceFun = reduceFun.toSource ? reduceFun.toSource() : "(" + reduceFun.toString() + ")"; + var req = request("POST", this.uri + "_temp_view" + encodeOptions(options), { + headers: {"Content-Type": "text/javascript"}, + body: JSON.stringify({map:mapFun, reduce:reduceFun}) }); var result = JSON.parse(req.responseText); if (req.status != 200) diff --git a/share/www/script/couch_tests.js b/share/www/script/couch_tests.js index 5f9cb5ae..72ed9f58 100644 --- a/share/www/script/couch_tests.js +++ b/share/www/script/couch_tests.js @@ -91,7 +91,15 @@ var tests = { // 1 more document should now be in the result. T(results.total_rows == 3); T(db.info().doc_count == 6); + + var reduceFunction = function(keys, values){ + return sum(values); + }; + + result = db.reduce_query(mapFunction, reduceFunction); + T(result.result == 33); + // delete a document T(db.deleteDoc(existingDoc).ok); @@ -219,6 +227,39 @@ var tests = { T(results.rows[numDocsToCreate-1-i].key==i); } }, + + reduce: function(debug) { + var db = new CouchDB("test_suite_db"); + db.deleteDb(); + db.createDb(); + if (debug) debugger; + var numDocs = 500 + var docs = makeDocs(1,numDocs + 1); + T(db.bulkSave(docs).ok); + var summate = function(N) {return (N+1)*N/2;}; + + var map = function (doc) {map(doc.integer, doc.integer)}; + var reduce = function (keys, values) { return sum(values); }; + var result = db.reduce_query(map, reduce).result; + T(result == summate(numDocs)); + + result = db.reduce_query(map, reduce, {startkey:4,endkey:4}).result; + + T(result == 4); + + result = db.reduce_query(map, reduce, {startkey:4,endkey:5}).result; + + T(result == 9); + + result = db.reduce_query(map, reduce, {startkey:4,endkey:6}).result; + + T(result == 15); + + for(var i=1; i<numDocs/2; i+=30) { + result = db.reduce_query(map, reduce, {startkey:i,endkey:numDocs-i}).result; + T(result == summate(numDocs-i) - summate(i-1)); + } + }, multiple_rows: function(debug) { var db = new CouchDB("test_suite_db"); @@ -391,7 +432,7 @@ var tests = { db.createDb(); if (debug) debugger; - var numDocs = 50; + var numDocs = 500; var designDoc = { _id:"_design/test", @@ -399,22 +440,46 @@ var tests = { views: { all_docs: "function(doc) { map(doc.integer, null) }", no_docs: "function(doc) {}", - single_doc: "function(doc) { if (doc._id == \"1\") { map(1, null) }}" + single_doc: "function(doc) { if (doc._id == \"1\") { map(1, null) }}", + summate: {map:"function (doc) {map(doc.integer, doc.integer)};", + reduce:"function (keys, values) { return sum(values); };"} } } T(db.save(designDoc).ok); - T(db.bulkSave(makeDocs(0, numDocs)).ok); + T(db.bulkSave(makeDocs(1, numDocs + 1)).ok); for (var loop = 0; loop < 2; loop++) { var rows = db.view("test/all_docs").rows; - for (var i = 0; i < numDocs; i++) { - T(rows[i].key == i); + for (var i = 1; i <= numDocs; i++) { + T(rows[i-1].key == i); } T(db.view("test/no_docs").total_rows == 0) T(db.view("test/single_doc").total_rows == 1) restartServer(); } + + + var summate = function(N) {return (N+1)*N/2;}; + var result = db.view("test/summate").result; + T(result == summate(numDocs)); + + result = db.view("test/summate", {startkey:4,endkey:4}).result; + + T(result == 4); + + result = db.view("test/summate", {startkey:4,endkey:5}).result; + + T(result == 9); + + result =db.view("test/summate", {startkey:4,endkey:6}).result; + + T(result == 15); + + for(var i=1; i<numDocs/2; i+=30) { + result = db.view("test/summate", {startkey:i,endkey:numDocs-i}).result; + T(result == summate(numDocs-i) - summate(i-1)); + } T(db.deleteDoc(designDoc).ok); T(db.open(designDoc._id) == null); @@ -424,8 +489,6 @@ var tests = { T(db.open(designDoc._id) == null); T(db.view("test/no_docs") == null); - - }, view_collation: function(debug) { |