UNPKG

@qrvey/formula-lang

Version:

QFormula support for qrvey projects

130 lines 4.38 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.IFS = void 0; const constants_1 = require("../constants"); const dictionary_1 = require("../errors/dictionary"); const isAggregate_1 = require("../utils/isAggregate"); const isBooleanExpression_1 = require("../utils/isBooleanExpression"); const primitiveFunctions_1 = require("../utils/primitiveFunctions"); /** * `IFS` Returns one value if a logical expression is TRUE * when is False another logical expression have to be set with their returned value * and so (recursive operation) */ exports.IFS = { identifier: 'IFS', operationScope: constants_1.OPERATION_SCOPE.RAW, functionScope: [constants_1.OPERATION_SCOPE.RAW, constants_1.OPERATION_SCOPE.AGGREGATE], recursiveStartIn: 0, parameters: [ { identifier: 'LOGICAL_EXPRESSION', optional: false, expectedPrimitive: constants_1.AST_PRIMITIVES.BOOLEAN, validator: [isBooleanExpression_1.isBooleanExpression], }, { identifier: 'VALUE_IF_TRUE', optional: false, generic: true, validator: [sameRecursivePrimitiveType], }, ], transpiler: { elasticsearch, snowflake, redshift, postgresql, databricks, }, primitiveResult(args) { return calculateIfsPrimitive(args); }, }; function sameRecursivePrimitiveType(_param, _dataType, context) { const args = context.fnNode.arguments; const firstArgsPrimitive = calculateFirstIFSPrimitive(args); const ifsPrimitive = calculateIfsPrimitive(args); const isAggregate = (0, isAggregate_1.isAggregateScope)(context.globalContext); const valid = isAggregate ? constants_1.EXPECTED_AGGREGATE_RESULT.includes(firstArgsPrimitive) : (0, primitiveFunctions_1.isSinglePrimitive)(ifsPrimitive); if (!valid) return Object.assign(Object.assign({ valid }, dictionary_1.ERROR_DICTIONARY[dictionary_1.ERROR_LIST.inferredPrimitive]), { mismatchData: { primitive: isAggregate ? constants_1.EXPECTED_AGGREGATE_RESULT[0] : firstArgsPrimitive, } }); return { valid, mismatchData: { primitive: ifsPrimitive, }, }; } function calculateIfsPrimitive(args) { const primitiveArgs = []; args.forEach((value, index) => { if (index % 2 === 1) { primitiveArgs.push(value.primitive); } }); return (0, primitiveFunctions_1.inferPrimitive)(...primitiveArgs); } function calculateFirstIFSPrimitive(args) { var _a, _b; return ((_b = (_a = args.find((arg, index) => index % 2 === 1 && (0, primitiveFunctions_1.isSinglePrimitive)(arg.primitive) && arg.primitive !== constants_1.AST_PRIMITIVES.UNKNOWN)) === null || _a === void 0 ? void 0 : _a.primitive) !== null && _b !== void 0 ? _b : constants_1.AST_PRIMITIVES.UNKNOWN); } function elasticsearch(...args) { const _args = [...args]; const logicalExpression = _args.shift(); const valueIfTrue = _args.shift(); if (_args.length === 0) { return `(${logicalExpression} ? ${valueIfTrue} : null)`; } else { return `(${logicalExpression} ? ${valueIfTrue} : ${elasticsearch(..._args)})`; } } function snowflake(...args) { const _args = [...args]; const logicalExpression = _args.shift(); const valueIfTrue = _args.shift(); if (_args.length === 0) { return `IFF(${logicalExpression}, ${valueIfTrue}, NULL)`; } else { return `IFF(${logicalExpression}, ${valueIfTrue}, ${snowflake(..._args)})`; } } function sql(...args) { const _args = [...args]; const logicalExpression = _args.shift(); const valueIfTrue = _args.shift(); if (_args.length === 0) { return ` (CASE WHEN ${logicalExpression} THEN ${valueIfTrue} ELSE NULL END)`.trim(); } else { return ` (CASE WHEN ${logicalExpression} THEN ${valueIfTrue} ELSE ${sql(..._args)} END)`.trim(); } } function redshift(...args) { return sql(...args); } function postgresql(...args) { return sql(...args); } function databricks(...args) { return sql(...args); } //# sourceMappingURL=ifs.js.map