@qrvey/formula-lang
Version:
QFormula support for qrvey projects
130 lines • 4.38 kB
JavaScript
;
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