yandex-tank-ammo-generator
Version:
Cartridge generation for Yandex tank
292 lines (291 loc) • 8.33 kB
JavaScript
"use strict";
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
Object.defineProperty(exports, "__esModule", { value: true });
const ScriptBuilder_1 = require("./ScriptBuilder");
const constants_1 = require("../constants");
var IFindTypes;
(function (IFindTypes) {
IFindTypes["MUST"] = "must";
IFindTypes["MUST_NOT"] = "must_not";
IFindTypes["SHOULD"] = "should";
})(IFindTypes = exports.IFindTypes || (exports.IFindTypes = {}));
/**
* Критерии фильтрации
* @enum
*/
var IFilterTypes;
(function (IFilterTypes) {
IFilterTypes["RANGE"] = "range";
IFilterTypes["EXISTS"] = "exists";
IFilterTypes["BY_ARRAY_TERMS"] = "terms";
IFilterTypes["BY_TERMIN"] = "term";
IFilterTypes["MATCH_PHRASE"] = "match_phrase";
IFilterTypes["MATCH"] = "match";
})(IFilterTypes = exports.IFilterTypes || (exports.IFilterTypes = {}));
/**
* Варианты сортировки
* @enum
*/
var SortTypes;
(function (SortTypes) {
SortTypes["ASC"] = "asc";
SortTypes["DESC"] = "desc";
})(SortTypes = exports.SortTypes || (exports.SortTypes = {}));
/**
* @Class QueryBuilder
* @Classdesc Билдер запросов к elasticSearch
*/
class QueryBuilder {
constructor() {
/**
* Хранилище запроса
* @private
*/
this._query = {
query: {
bool: {
must: [],
must_not: [],
should: [],
},
},
};
this._agg = {
aggs: {},
};
this._script = {};
}
/**
* Сортировка
* @param args
* @return {this}
*/
sort(...args) {
this._query['sort'] = args;
return this;
}
/**
* Сортировка
* @param args[]
* @return {this}
*/
sortOfArray(args) {
this._query['sort'] = args;
return this;
}
/**
* Указать критерий поиска по индексу (термин, например articul = 10001)
* @param type
* @param field
* @param value
* @return {this}
*/
addTerm(type, field, value) {
this._query['query']['bool'][type].push({
[IFilterTypes.BY_TERMIN]: { [field]: value },
});
return this;
}
addMatch(type, field, value) {
this._query['query']['bool'][type].push({
[IFilterTypes.MATCH]: { [field]: value },
});
return this;
}
/**
* Указать набор критериев через Bool
* @param type
* @param bool
* @return {this}
*/
addBool(type, bool) {
this._query['query']['bool'][type].push(bool.build());
return this;
}
/**
* Фраза для поиска
* @param type
* @param field
* @param value
* @return {this}
*/
addTextPhrase(type, field, value) {
this._query['query']['bool'][type].push({
[IFilterTypes.MATCH_PHRASE]: { [field]: value },
});
return this;
}
/**
* Указать массив критериев поиска (аналогия выше) по индексу
* @param type
* @param field
* @param values
* @return {this}
*/
addTermsArray(type, field, values) {
this._query['query']['bool'][type].push({
[IFilterTypes.BY_ARRAY_TERMS]: { [field]: values },
});
return this;
}
/**
* Указать критерий поиска на существование колонки
* @param type
* @param fieldName
* @return {this}
*/
addExistsTerm(type, fieldName) {
this._query['query']['bool'][type].push({
[IFilterTypes.EXISTS]: { field: fieldName },
});
return this;
}
/**
* Указать диапазон поиска по индексу
* @param type
* @param field
* @param value
* @return {this}
*/
addRange(type, field, value) {
this._query['query']['bool'][type].push({
[IFilterTypes.RANGE]: { [field]: value },
});
return this;
}
addAggsTerms(key, field, missing = null) {
let m = {};
if (missing !== null) {
m['missing'] = missing;
}
this._agg['aggs'][key] = {
terms: Object.assign({ field }, m),
};
return this;
}
addAggsMax(key, field) {
this._agg['aggs'][key] = {
max: { field, missing: 0 },
};
return this;
}
addAggsMaxScript(key, b) {
if (ScriptBuilder_1.ScriptBuilder.isScriptBuilder(b)) {
this._agg['aggs'][key] = {
max: {
script: b.build(),
},
};
}
else {
this._agg['aggs'][key] = {
max: {
script: b,
},
};
}
return this;
}
addAggsMinScript(key, b) {
if (ScriptBuilder_1.ScriptBuilder.isScriptBuilder(b)) {
this._agg['aggs'][key] = {
min: {
script: b.build(),
},
};
}
else {
this._agg['aggs'][key] = {
min: {
script: b,
},
};
}
return this;
}
addAggsMin(key, field) {
this._agg['aggs'][key] = {
min: { field, missing: 0 },
};
return this;
}
addFieldScript(b) {
if (ScriptBuilder_1.ScriptBuilder.isScriptBuilder(b)) {
this._script = b.build();
}
else {
this._script = b;
}
return this;
}
/**
* Свой запрос
* @param type
* @param filterType
* @param filter
* @return {this}
*/
addCustomFilter(type, filterType, filter) {
if (!this._query['query']['bool'].hasOwnProperty(type)) {
this._query['query']['bool'][type] = [];
}
if (!this._query['query']['bool'].hasOwnProperty(type)) {
this._query['query']['bool'][type] = [];
}
this._query['query']['bool'][type].push({
[filterType]: filter,
});
return this;
}
/**
* Вернуть запрос
* @return {object}
*/
buildQuery() {
const cond = {
query: {
bool: {},
},
};
this._query.query.bool.must.length > 0 && (cond.query.bool['must'] = this._query.query.bool.must);
this._query.query.bool.must_not.length > 0 && (cond.query.bool['must_not'] = this._query.query.bool.must_not);
this._query.query.bool.should.length > 0 && (cond.query.bool['should'] = this._query.query.bool.should);
this._query.size && (cond.size = this._query.size);
this._query.sort && (cond.sort = this._query.sort);
return Object.assign(Object.assign(Object.assign({}, cond), this._agg), this._script);
}
/**
* Запрос для получения колличества записей
* @return {Pick<any, Exclude<keyof any, "sort">>}
*/
buildCountQuery() {
const _a = this._query, { sort } = _a, all = __rest(_a, ["sort"]);
return all;
}
/**
* Получить сырой запрос
* @return {string}
* @private
*/
_getPrettyQuery() {
return this.buildQuery();
}
/**
* Установить максимальный размер выборки
*/
maxSampleSize() {
this._query = Object.assign(Object.assign({}, this._query), { size: constants_1.MAX_SAMPLE_SIZE });
return this;
}
}
exports.QueryBuilder = QueryBuilder;