UNPKG

yandex-tank-ammo-generator

Version:

Cartridge generation for Yandex tank

292 lines (291 loc) 8.33 kB
"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;