UNPKG

@qrvey/formula-lang

Version:

QFormula support for qrvey projects

99 lines 3.94 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ISNULL = void 0; const constants_1 = require("../constants"); const dictionary_1 = require("../errors/dictionary"); const isAColumn_1 = require("../utils/isAColumn"); const isALiteral_1 = require("../utils/isALiteral"); const primitiveFunctions_1 = require("../utils/primitiveFunctions"); /** * `ISNULL` Returns the replacement if the value is a null */ exports.ISNULL = { identifier: 'ISNULL', parameters: [ { identifier: 'VALUE', optional: false, validator: [samePrimitiveTypeCol], }, { identifier: 'REPLACEMENT', optional: false, generic: true, validator: [samePrimitiveTypeNonCol], }, ], transpiler: { elasticsearch, snowflake, redshift, postgresql, }, primitiveResult(args) { return (0, primitiveFunctions_1.inferPrimitive)(...args.map((arg) => arg.primitive)); }, }; function samePrimitiveTypeCol(param, dataType, context) { const isColumn = (0, isAColumn_1.isAColumn)(context); const baseResult = samePrimitiveType(param, dataType, context); const valid = isColumn && baseResult.valid; const primitive = baseResult.mismatchData.primitive; return Object.assign(Object.assign(Object.assign(Object.assign({}, baseResult), { mismatchData: { type: constants_1.AST_TYPES.column, primitive, } }), (!isColumn && Object.assign({}, dictionary_1.ERROR_DICTIONARY[dictionary_1.ERROR_LIST.missingColumnExpression]))), { valid }); } function samePrimitiveTypeNonCol(param, dataType, context) { const isLiteral = (0, isALiteral_1.isALiteral)(context); const baseResult = samePrimitiveType(param, dataType, context); const valid = isLiteral && baseResult.valid; const primitive = baseResult.mismatchData.primitive; return Object.assign(Object.assign(Object.assign(Object.assign({}, baseResult), { mismatchData: { type: constants_1.AST_TYPES.literal, primitive, } }), (!isLiteral && Object.assign({}, dictionary_1.ERROR_DICTIONARY[dictionary_1.ERROR_LIST.noColumnExpression]))), { valid }); } function samePrimitiveType(_param, _dataType, context) { const firstPrimitive = primitiveArgIndex(context, 0); const secondPrimitive = primitiveArgIndex(context, 1); const ifPrimitive = calculateIsNullPrimitive(firstPrimitive, secondPrimitive); const valid = firstPrimitive === secondPrimitive; const baseResult = { valid, mismatchData: { primitive: ifPrimitive, }, }; if (!valid) return Object.assign(Object.assign({}, baseResult), dictionary_1.ERROR_DICTIONARY[dictionary_1.ERROR_LIST.inferredPrimitive]); return baseResult; } function primitiveArgIndex(context, index) { var _a; const basePrimitive = (_a = context.fnNode.arguments[index]) === null || _a === void 0 ? void 0 : _a.primitive; return (0, primitiveFunctions_1.isSinglePrimitive)(basePrimitive) ? basePrimitive : constants_1.AST_PRIMITIVES.UNKNOWN; } function calculateIsNullPrimitive(firstPrimitive, secondPrimitive) { if (firstPrimitive && firstPrimitive !== constants_1.AST_PRIMITIVES.UNKNOWN) return firstPrimitive; return secondPrimitive !== null && secondPrimitive !== void 0 ? secondPrimitive : constants_1.AST_PRIMITIVES.UNKNOWN; } function elasticsearch(value, replacement) { return `IS_NULL_SCRIPT(${value}, ${replacement})`; } function sql(value, replacement) { return `COALESCE(${value}, ${replacement})`; } function snowflake(value, replacement) { return sql(value, replacement); } function redshift(value, replacement) { return sql(value, replacement); } function postgresql(value, replacement) { return sql(value, replacement); } //# sourceMappingURL=isNull.js.map