UNPKG

@overture-stack/sqon-builder

Version:
189 lines 7.96 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.emptySQON = void 0; var sqon_1 = require("./types/sqon"); var asArray_1 = require("./utils/asArray"); var checkMatchingFilter_1 = require("./utils/checkMatchingFilter"); var cloneDeepValues_1 = require("./utils/cloneDeepValues"); var createFilter_1 = require("./utils/createFilter"); var reduceSQON_1 = require("./utils/reduceSQON"); var emptySQON = function () { return ({ op: sqon_1.CombinationKeys.And, content: [] }); }; exports.emptySQON = emptySQON; var createBuilder = function (sqon) { var _sqon = (0, reduceSQON_1.default)((0, cloneDeepValues_1.default)(sqon)); var toString = function () { return JSON.stringify(_sqon); }; var toValue = function () { return _sqon; }; var removeExactFilter = function (filter) { if ((0, sqon_1.isFilter)(_sqon)) { if ((0, checkMatchingFilter_1.default)(_sqon, filter)) { return createBuilder((0, exports.emptySQON)()); } else { return createBuilder(_sqon); } } else { var filteredContent = _sqon.content.filter(function (operator) { return !(0, sqon_1.isFilter)(operator) || !(0, checkMatchingFilter_1.default)(operator, filter); }); var updated = { op: _sqon.op, content: filteredContent, pivot: _sqon.pivot }; return createBuilder(updated); } }; var removeFilter = function (fieldName, op, value) { var valuesToFilter = value !== undefined ? (0, asArray_1.default)(value) : undefined; function isMatchArgs(filter) { return (fieldName === filter.content.fieldName && (op === undefined || op === filter.op) && (valuesToFilter === undefined || (0, checkMatchingFilter_1.checkMatchingArrays)(valuesToFilter, (0, asArray_1.default)(filter.content.value)))); } function isPartialMatchArgs(filter) { return fieldName === filter.content.fieldName && (op === undefined || op === filter.op); } function filterValuesFromFilter(filter, valuesToFilter) { var output = (0, cloneDeepValues_1.default)(filter); output.content.value = (0, asArray_1.default)(output.content.value).filter(function (value) { return !valuesToFilter.includes(value); }); return output; } if ((0, sqon_1.isFilter)(_sqon)) { if (isMatchArgs(_sqon)) { return createBuilder((0, exports.emptySQON)()); } else if (valuesToFilter !== undefined && (0, sqon_1.isArrayFilter)(_sqon) && isPartialMatchArgs(_sqon)) { var output = filterValuesFromFilter(_sqon, valuesToFilter); return createBuilder(output); } else { return createBuilder(_sqon); } } var filteredContent = _sqon.content.filter(function (operator) { return (0, sqon_1.isCombination)(operator) || !isMatchArgs(operator); }); if (valuesToFilter === undefined) { var updated_1 = { op: _sqon.op, content: filteredContent, pivot: _sqon.pivot }; return createBuilder(updated_1); } var outputContent = filteredContent.map(function (operator) { return (0, sqon_1.isArrayFilter)(operator) && isPartialMatchArgs(operator) ? filterValuesFromFilter(operator, valuesToFilter) : operator; }); var updated = { op: _sqon.op, content: outputContent, pivot: _sqon.pivot }; return createBuilder(updated); }; var setFilter = function (fieldName, op, value) { if ((0, sqon_1.isFilter)(_sqon)) { if (_sqon.op === op && _sqon.content.fieldName === fieldName) { return createBuilder((0, createFilter_1.createFilter)(fieldName, op, value)); } else { return SQONBuilder.and([_sqon, (0, createFilter_1.createFilter)(fieldName, op, value)]); } } var found = false; var updatedContent = _sqon.content.map(function (operator) { if ((0, sqon_1.isFilter)(operator) && operator.op === op && operator.content.fieldName === fieldName) { found = true; var replacement = (0, cloneDeepValues_1.default)(operator); replacement.content.value = value; return replacement; } return operator; }); if (!found) { updatedContent.push((0, createFilter_1.createFilter)(fieldName, op, value)); } return createBuilder({ op: _sqon.op, content: updatedContent }); }; return __assign({ and: _and(_sqon), or: _or(_sqon), not: _not(_sqon), in: _in(_sqon), gt: _gt(_sqon), lt: _lt(_sqon), removeExactFilter: removeExactFilter, removeFilter: removeFilter, setFilter: setFilter, toString: toString, toValue: toValue }, _sqon); }; var combine = function (op, sqon, content, pivot) { var output = { op: op, content: [] }; if (sqon.op === op && sqon.pivot === pivot) { output.content = output.content.concat(sqon.content, content); } else { output.content = output.content.concat(sqon, content); } if (pivot !== undefined) { output.pivot = pivot; } return output; }; var _from = function (input) { var parsed = typeof input === 'string' ? JSON.parse(input) : input; var sqon = sqon_1.SQON.parse(parsed); return createBuilder(sqon); }; var _and = function (original) { return function (content, pivot) { return createBuilder(combine(sqon_1.CombinationKeys.And, original, content, pivot)); }; }; var _or = function (original) { return function (content, pivot) { return createBuilder(combine(sqon_1.CombinationKeys.Or, original, content, pivot)); }; }; var _not = function (original) { return function (content, pivot) { var notOp = { op: sqon_1.CombinationKeys.Not, content: (0, asArray_1.default)(content), pivot: pivot, }; return createBuilder(combine(sqon_1.CombinationKeys.And, original, notOp)); }; }; var _in = function (original) { return function (fieldName, value) { var filter = { op: sqon_1.FilterKeys.In, content: { fieldName: fieldName, value: (0, asArray_1.default)(value) }, }; return _and(original)(filter); }; }; var _gt = function (original) { return function (fieldName, value) { var filter = { op: sqon_1.FilterKeys.GreaterThan, content: { fieldName: fieldName, value: value }, }; return _and(original)(filter); }; }; var _lt = function (original) { return function (fieldName, value) { var filter = { op: sqon_1.FilterKeys.LesserThan, content: { fieldName: fieldName, value: value }, }; return _and(original)(filter); }; }; var SQONBuilder = function (sqon) { if (typeof sqon === 'string') { return _from(sqon); } else { return createBuilder(sqon); } }; SQONBuilder.and = _and((0, exports.emptySQON)()); SQONBuilder.or = _or((0, exports.emptySQON)()); SQONBuilder.not = _not((0, exports.emptySQON)()); SQONBuilder.in = _in((0, exports.emptySQON)()); SQONBuilder.gt = _gt((0, exports.emptySQON)()); SQONBuilder.lt = _lt((0, exports.emptySQON)()); SQONBuilder.from = _from; exports.default = SQONBuilder; //# sourceMappingURL=SQONBuilder.js.map