const bunyan = require('bunyan') const level = require('levelup') const down = require('memdown') const SearchIndexAdder = require('search-index-adder') const SearchIndexSearcher = require('search-index-searcher') module.exports = function (givenOptions, moduleReady) { const optionsLoaded = function (err, SearchIndex) { const siUtil = require('./siUtil.js')(SearchIndex.options) if (err) return moduleReady(err) SearchIndex.close = siUtil.close SearchIndex.countDocs = siUtil.countDocs getAdder(SearchIndex, adderLoaded) } const adderLoaded = function (err, SearchIndex) { if (err) return moduleReady(err) getSearcher(SearchIndex, searcherLoaded) } const searcherLoaded = function (err, SearchIndex) { if (err) return moduleReady(err) return moduleReady(err, SearchIndex) } getOptions(givenOptions, optionsLoaded) } const getAdder = function (SearchIndex, done) { SearchIndexAdder(SearchIndex.options, function (err, searchIndexAdder) { SearchIndex.add = searchIndexAdder.add SearchIndex.callbackyAdd = searchIndexAdder.concurrentAdd // deprecated SearchIndex.concurrentAdd = searchIndexAdder.concurrentAdd SearchIndex.createWriteStream = searchIndexAdder.createWriteStream SearchIndex.dbWriteStream = searchIndexAdder.dbWriteStream SearchIndex.defaultPipeline = searchIndexAdder.defaultPipeline SearchIndex.del = searchIndexAdder.deleter SearchIndex.deleteStream = searchIndexAdder.deleteStream SearchIndex.flush = searchIndexAdder.flush done(err, SearchIndex) }) } const getSearcher = function (SearchIndex, done) { SearchIndexSearcher(SearchIndex.options, function (err, searchIndexSearcher) { SearchIndex.availableFields = searchIndexSearcher.availableFields SearchIndex.buckets = searchIndexSearcher.bucketStream SearchIndex.categorize = searchIndexSearcher.categoryStream SearchIndex.dbReadStream = searchIndexSearcher.dbReadStream SearchIndex.get = searchIndexSearcher.get SearchIndex.match = searchIndexSearcher.match SearchIndex.scan = searchIndexSearcher.scan SearchIndex.search = searchIndexSearcher.search SearchIndex.totalHits = searchIndexSearcher.totalHits done(err, SearchIndex) }) } const getOptions = function (options, done) { var SearchIndex = {} SearchIndex.options = Object.assign({}, { indexPath: 'si', keySeparator: '○', logLevel: 'error' }, options) options.log = bunyan.createLogger({ name: 'search-index', level: options.logLevel }) if (!options.indexes) { level(SearchIndex.options.indexPath || 'si', { valueEncoding: 'json', db: down }, function (err, db) { SearchIndex.options.indexes = db return done(err, SearchIndex) }) } else { return done(null, SearchIndex) } }