summaryrefslogtreecommitdiff
path: root/share/www/script
diff options
context:
space:
mode:
Diffstat (limited to 'share/www/script')
-rw-r--r--share/www/script/couch.js18
-rw-r--r--share/www/script/couch_tests.js77
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) {