@jbrowse/core
Version:
JBrowse 2 core libraries used by plugins
86 lines (85 loc) • 3.68 kB
JavaScript
;
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;