diff --git a/lib/nano.js b/lib/nano.js index 9ca51376..31b15023 100644 --- a/lib/nano.js +++ b/lib/nano.js @@ -38,6 +38,7 @@ module.exports = exports = nano = function dbScope(cfg) { serverScope.config = cfg; cfg.requestDefaults = cfg.requestDefaults || {jar: false}; + cfg.searchVendor = cfg.searchVendor || nano.SEARCH_CLOUDANT; var httpAgent = (typeof cfg.request === 'function') ? cfg.request : request.defaults(cfg.requestDefaults); @@ -45,6 +46,13 @@ module.exports = exports = nano = function dbScope(cfg) { var log = typeof cfg.log === 'function' ? cfg.log : logger(cfg); var parseUrl = 'parseUrl' in cfg ? cfg.parseUrl : true; + function searchVendor(searchVendor) { + if (searchVendor) { + cfg.searchVendor = searchVendor; + } + return cfg.searchVendor; + } + function maybeExtractDatabaseComponent() { if (!parseUrl) { return; @@ -545,10 +553,37 @@ module.exports = exports = nano = function dbScope(cfg) { } // cloudant - function viewSearch(ddoc, viewName, qs, callback) { + function searchCloudant(ddoc, viewName, qs, callback) { return view(ddoc, viewName, {type: 'search'}, qs, callback); } + // couchdb-lucene + function searchLucene(ddoc, viewName, qs, callback) { + if (typeof qs.sort !== 'undefined') { + qs.sort = qs.sort + .replace(/^(")/g, '') + .replace(/(")$/g, '') + .replace(/^(-)/, '\\') + .replace('', '') + .replace('', 'score'); + } + + return relax({ + path: '_fti/local/' + dbName + '/_design/' + ddoc + '/' + viewName, + method: 'GET', + qs: qs + }, callback); + } + + function viewSearch(ddoc, viewName, qs, callback) { + switch (cfg.searchVendor) { + case nano.SEARCH_LUCENE: + return searchLucene(ddoc, viewName, qs, callback); + default: + return searchCloudant(ddoc, viewName, qs, callback); + } + } + // http://docs.couchdb.org/en/latest/api/ddoc/render.html#get--db-_design-ddoc-_show-func function showDoc(ddoc, viewName, docName, qs, callback) { return view(ddoc, viewName + '/' + docName, {type: 'show'}, qs, callback); @@ -763,7 +798,8 @@ module.exports = exports = nano = function dbScope(cfg) { auth: auth, session: session, updates: updates, - followUpdates: followUpdates + followUpdates: followUpdates, + searchVendor: searchVendor, }); var db = maybeExtractDatabaseComponent(); @@ -784,6 +820,9 @@ module.exports = exports = nano = function dbScope(cfg) { nano.version = require('../package.json').version; nano.path = __dirname; +nano.SEARCH_CLOUDANT = 'cloudant'; +nano.SEARCH_LUCENE = 'lucene'; + function urlResolveFix(couchUrl, dbName) { if (/[^\/]$/.test(couchUrl)) { couchUrl += '/';