UNPKG

@jbrowse/core

Version:

JBrowse 2 core libraries used by plugins

86 lines (85 loc) 3.68 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const ufuzzy_1 = __importDefault(require("@leeoniya/ufuzzy")); const configuration_1 = require("../configuration"); const QuickLRU_1 = __importDefault(require("../util/QuickLRU")); class TextSearchManager { constructor(pluginManager) { this.pluginManager = pluginManager; this.adapterCache = new QuickLRU_1.default({ maxSize: 15, }); } loadTextSearchAdapters(searchScope) { return Promise.all(this.relevantAdapters(searchScope).map(async (conf) => { const adapterId = (0, configuration_1.readConfObject)(conf, 'textSearchAdapterId'); const r = this.adapterCache.get(adapterId); if (r) { return r; } else { const adapterType = this.pluginManager.getTextSearchAdapterType(conf.type); const AdapterClass = await adapterType.getAdapterClass(); const adapterInstance = new AdapterClass(conf, undefined, this.pluginManager); this.adapterCache.set(adapterId, adapterInstance); return adapterInstance; } })); } relevantAdapters(searchScope) { const rootModel = this.pluginManager.rootModel; const { aggregateTextSearchAdapters } = rootModel === null || rootModel === void 0 ? void 0 : rootModel.jbrowse; const { tracks } = rootModel === null || rootModel === void 0 ? void 0 : rootModel.session; const { assemblyName } = searchScope; return [ ...this.getAdaptersWithAssembly(assemblyName, aggregateTextSearchAdapters), ...this.getTrackAdaptersWithAssembly(assemblyName, tracks), ]; } getAdaptersWithAssembly(assemblyName, confs) { return confs.filter(c => { var _a; return (_a = (0, configuration_1.readConfObject)(c, 'assemblyNames')) === null || _a === void 0 ? void 0 : _a.includes(assemblyName); }); } getTrackAdaptersWithAssembly(assemblyName, confs) { return confs .filter(conf => { var _a; return (_a = (0, configuration_1.readConfObject)(conf, [ 'textSearching', 'textSearchAdapter', 'assemblyNames', ])) === null || _a === void 0 ? void 0 : _a.includes(assemblyName); }) .map(conf => conf.textSearching.textSearchAdapter); } async search(args, searchScope, rankFn) { return this.search2({ args, searchScope, rankFn }); } async search2({ args, searchScope, rankFn, }) { const adapters = await this.loadTextSearchAdapters(searchScope); const results = await Promise.all(adapters.map(a => a.searchIndex(args))); return this.sortResults2({ args, results: results.flat(), rankFn, }); } sortResults2({ results, rankFn, args, }) { const uf = new ufuzzy_1.default({}); const haystack = results.map(r => r.getDisplayString()); const needle = args.queryString; const idxs = uf.filter(haystack, needle); const res = []; if (idxs != null && idxs.length > 0) { const info = uf.info(idxs, haystack, needle); const order = uf.sort(info, haystack, needle); for (const element of order) { res.push(results[info.idx[element]]); } } return rankFn(res); } } exports.default = TextSearchManager;