(changesHandler, opts)
| 3961 | } |
| 3962 | |
| 3963 | function filter(changesHandler, opts) { |
| 3964 | var callback = opts.complete; |
| 3965 | if (opts.filter === '_view') { |
| 3966 | if (!opts.view || typeof opts.view !== 'string') { |
| 3967 | var err = createError(BAD_REQUEST, |
| 3968 | '`view` filter parameter not found or invalid.'); |
| 3969 | return callback(err); |
| 3970 | } |
| 3971 | // fetch a view from a design doc, make it behave like a filter |
| 3972 | var viewName = parseDesignDocFunctionName(opts.view); |
| 3973 | changesHandler.db.get('_design/' + viewName[0], function (err, ddoc) { |
| 3974 | /* istanbul ignore if */ |
| 3975 | if (changesHandler.isCancelled) { |
| 3976 | return callback(null, {status: 'cancelled'}); |
| 3977 | } |
| 3978 | /* istanbul ignore next */ |
| 3979 | if (err) { |
| 3980 | return callback(generateErrorFromResponse(err)); |
| 3981 | } |
| 3982 | var mapFun = ddoc && ddoc.views && ddoc.views[viewName[1]] && |
| 3983 | ddoc.views[viewName[1]].map; |
| 3984 | if (!mapFun) { |
| 3985 | return callback(createError(MISSING_DOC, |
| 3986 | (ddoc.views ? 'missing json key: ' + viewName[1] : |
| 3987 | 'missing json key: views'))); |
| 3988 | } |
| 3989 | opts.filter = evalView(mapFun); |
| 3990 | changesHandler.doChanges(opts); |
| 3991 | }); |
| 3992 | } else if (opts.selector) { |
| 3993 | opts.filter = function (doc) { |
| 3994 | return matchesSelector(doc, opts.selector); |
| 3995 | }; |
| 3996 | changesHandler.doChanges(opts); |
| 3997 | } else { |
| 3998 | // fetch a filter from a design doc |
| 3999 | var filterName = parseDesignDocFunctionName(opts.filter); |
| 4000 | changesHandler.db.get('_design/' + filterName[0], function (err, ddoc) { |
| 4001 | /* istanbul ignore if */ |
| 4002 | if (changesHandler.isCancelled) { |
| 4003 | return callback(null, {status: 'cancelled'}); |
| 4004 | } |
| 4005 | /* istanbul ignore next */ |
| 4006 | if (err) { |
| 4007 | return callback(generateErrorFromResponse(err)); |
| 4008 | } |
| 4009 | var filterFun = ddoc && ddoc.filters && ddoc.filters[filterName[1]]; |
| 4010 | if (!filterFun) { |
| 4011 | return callback(createError(MISSING_DOC, |
| 4012 | ((ddoc && ddoc.filters) ? 'missing json key: ' + filterName[1] |
| 4013 | : 'missing json key: filters'))); |
| 4014 | } |
| 4015 | opts.filter = evalFilter(filterFun); |
| 4016 | changesHandler.doChanges(opts); |
| 4017 | }); |
| 4018 | } |
| 4019 | } |
| 4020 |
no test coverage detected
searching dependent graphs…