tsbase
Version:
Base class libraries for TypeScript
42 lines • 1.54 kB
JavaScript
;
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