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