@overture-stack/sqon-builder
Version:
SQON creation and manipulation library
189 lines • 7.96 kB
JavaScript
;
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