UNPKG

@qrvey/formula-lang

Version:

QFormula support for qrvey projects

68 lines 2 kB
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