| import evalFunction from './evalFunction'; |
| import sum from './sum'; |
| import { NotFoundError } from 'pouchdb-mapreduce-utils'; |
| import createAbstractMapReduce from 'pouchdb-abstract-mapreduce'; |
| |
| var builtInReduce = { |
| _sum: function (keys, values) { |
| return sum(values); |
| }, |
| |
| _count: function (keys, values) { |
| return values.length; |
| }, |
| |
| _stats: function (keys, values) { |
| // no need to implement rereduce=true, because Pouch |
| // will never call it |
| function sumsqr(values) { |
| var _sumsqr = 0; |
| for (var i = 0, len = values.length; i < len; i++) { |
| var num = values[i]; |
| _sumsqr += (num * num); |
| } |
| return _sumsqr; |
| } |
| return { |
| sum : sum(values), |
| min : Math.min.apply(null, values), |
| max : Math.max.apply(null, values), |
| count : values.length, |
| sumsqr : sumsqr(values) |
| }; |
| } |
| }; |
| |
| function mapper(mapFun, emit) { |
| // for temp_views one can use emit(doc, emit), see #38 |
| if (typeof mapFun === "function" && mapFun.length === 2) { |
| var origMap = mapFun; |
| return function (doc) { |
| return origMap(doc, emit); |
| }; |
| } else { |
| return evalFunction(mapFun.toString(), emit); |
| } |
| } |
| |
| function reducer(reduceFun) { |
| if (builtInReduce[reduceFun]) { |
| return builtInReduce[reduceFun]; |
| } else { |
| return evalFunction(reduceFun.toString()); |
| } |
| } |
| |
| function ddocValidator(ddoc, viewName) { |
| var fun = ddoc.views && ddoc.views[viewName]; |
| if (typeof fun.map !== 'string') { |
| throw new NotFoundError('ddoc ' + ddoc._id + ' has no string view named ' + |
| viewName + ', instead found object of type: ' + typeof fun.map); |
| } |
| } |
| |
| var localDocName = 'mrviews'; |
| var abstract = createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator); |
| |
| function query(fun, opts, callback) { |
| return abstract.query.call(this, fun, opts, callback); |
| } |
| |
| function viewCleanup(callback) { |
| return abstract.viewCleanup.call(this, callback); |
| } |
| |
| export default { |
| query: query, |
| viewCleanup: viewCleanup |
| }; |