UNPKG

tsbase

Version:

Base class libraries for TypeScript

42 lines 1.54 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SearchIndex = void 0; const Queryable_1 = require("../Queryable/Queryable"); class SearchIndex { constructor() { this.index = {}; } async Insert(indexer, items) { (items || [1]).forEach(item => { const entries = indexer(item); entries.forEach(entry => { this.index[entry[0]] = !!this.index[entry[0]] ? this.index[entry[0]].concat([entry[1]]) : [entry[1]]; }); }); } async GetIndexesForQuery(query, limit = 10) { return Queryable_1.Queryable.From(Object.keys(this.index)).Search(query).slice(0, limit); } async Search(query, limit = 10) { const matchingIndexes = await this.GetIndexesForQuery(query, limit); let results = []; matchingIndexes.forEach(i => { const qualifiedResults = this.index[i].filter(e => !this.isQualifiedResult(e) || (e.qualifier(query))); results = results.concat(qualifiedResults.map(r => this.isQualifiedResult(r) ? r.item : r)); }); return Queryable_1.Queryable.From(results).Distinct().slice(0, limit); } async Answer(query) { const results = await this.Search(query); return results[0] || null; } Reset() { this.index = {}; } isQualifiedResult(result) { return result['item'] && result['qualifier']; } } exports.SearchIndex = SearchIndex; //# sourceMappingURL=SearchIndex.js.map