@qrvey/formula-lang
Version:
QFormula support for qrvey projects
68 lines • 2 kB
JavaScript
import { AST_PRIMITIVES, OPERATION_SCOPE } from '../constants';
import { isNumberParam } from '../utils';
import { isBetweenInclusiveRange } from '../utils/isBetweenInclusiveRange';
import { isInteger } from '../utils/isInteger';
import { fromFloatToNumeric } from '../utils/sql';
/**
* `ROUND` Returns a number rounded to the next greatest even integer.
*/
export const ROUND = {
identifier: 'ROUND',
operationScope: OPERATION_SCOPE.RAW,
functionScope: [OPERATION_SCOPE.RAW, OPERATION_SCOPE.AGGREGATE],
parameters: [
{
identifier: 'NUM_1',
optional: false,
expectedPrimitive: AST_PRIMITIVES.NUMBER,
validator: [isNumberParam],
},
{
identifier: 'DIGITS',
optional: false,
expectedPrimitive: AST_PRIMITIVES.NUMBER,
validator: [
isNumberParam,
isBetweenInclusiveRange(0, 10),
isInteger,
],
},
],
transpiler: {
elasticsearch,
snowflake,
redshift,
postgresql,
databricks,
},
primitiveResult: AST_PRIMITIVES.NUMBER,
};
function elasticsearch(value, digits) {
return `ROUND(${value}, ROUNDDOWN(${digits}, 0))`;
}
function SQL(value, digits) {
return `ROUND(${value}, TRUNC(CASE
WHEN ${digits} IS NULL THEN NULL
WHEN ${digits} > 10 THEN 10
WHEN ${digits} < 0 THEN 0
ELSE ${digits}
END)::INTEGER)`;
}
function snowflake(value, digits) {
return SQL(value, digits);
}
function redshift(value, digits) {
return SQL(value, digits);
}
function postgresql(value, digits) {
return SQL(fromFloatToNumeric(value), digits);
}
function databricks(value, digits) {
return `ROUND(${value}, CAST((CASE
WHEN ${digits} IS NULL THEN NULL
WHEN ${digits} > 10 THEN 10
WHEN ${digits} < 0 THEN 0
ELSE ${digits}
END) AS INTEGER))`;
}
//# sourceMappingURL=round.js.map