tsbase
Version:
Base class libraries for TypeScript
75 lines • 3.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SearchIndex = void 0;
var tslib_1 = require("tslib");
var Queryable_1 = require("../Queryable/Queryable");
var SearchIndex = /** @class */ (function () {
function SearchIndex() {
this.index = {};
}
SearchIndex.prototype.Insert = function (indexer, items) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var _this = this;
return tslib_1.__generator(this, function (_a) {
(items || [1]).forEach(function (item) {
var entries = indexer(item);
entries.forEach(function (entry) {
_this.index[entry[0]] = !!_this.index[entry[0]] ?
_this.index[entry[0]].concat([entry[1]]) : [entry[1]];
});
});
return [2 /*return*/];
});
});
};
SearchIndex.prototype.GetIndexesForQuery = function (query, limit) {
if (limit === void 0) { limit = 10; }
return tslib_1.__awaiter(this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
return [2 /*return*/, Queryable_1.Queryable.From(Object.keys(this.index)).Search(query).slice(0, limit)];
});
});
};
SearchIndex.prototype.Search = function (query, limit) {
if (limit === void 0) { limit = 10; }
return tslib_1.__awaiter(this, void 0, void 0, function () {
var matchingIndexes, results;
var _this = this;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.GetIndexesForQuery(query, limit)];
case 1:
matchingIndexes = _a.sent();
results = [];
matchingIndexes.forEach(function (i) {
var qualifiedResults = _this.index[i].filter(function (e) { return !_this.isQualifiedResult(e) || (e.qualifier(query)); });
results = results.concat(qualifiedResults.map(function (r) { return _this.isQualifiedResult(r) ? r.item : r; }));
});
return [2 /*return*/, Queryable_1.Queryable.From(results).Distinct().slice(0, limit)];
}
});
});
};
SearchIndex.prototype.Answer = function (query) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var results;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.Search(query)];
case 1:
results = _a.sent();
return [2 /*return*/, results[0] || null];
}
});
});
};
SearchIndex.prototype.Reset = function () {
this.index = {};
};
SearchIndex.prototype.isQualifiedResult = function (result) {
return result['item'] && result['qualifier'];
};
return SearchIndex;
}());
exports.SearchIndex = SearchIndex;
//# sourceMappingURL=SearchIndex.js.map