UNPKG

miniml

Version:

A minimal, embeddable semantic data modeling language for generating SQL queries from YAML model definitions. Inspired by LookML.

63 lines 2.67 kB
export function constructCurrentTimeOffsetExpression(dialect, date_offset, date_part) { date_part = parseDatePart(date_part); if (dialect === "bigquery") return `CURRENT_TIMESTAMP - INTERVAL ${date_offset} ${date_part}`; else if (dialect == "snowflake") return `CURRENT_TIMESTAMP - INTERVAL '${date_offset} ${date_part}'`; else throw new Error(`Invalid dialect "${dialect}"`); } export function constructDateRangeExpression(dialect, date_field, date_offset, date_part, include_today) { let expression = `${date_field} >= ${constructCurrentTimeOffsetExpression(dialect, date_offset, date_part)}`; if (!include_today) expression += ` AND ${date_field} < ${constructTodayAtMidnightExpression(dialect)}`; return expression; } export function constructDateTruncExpression(dialect, date_expr, date_granularity) { date_expr = date_expr.trim(); date_granularity = date_granularity.trim().toUpperCase(); if (!["MINUTE", "HOUR", "DAY", "WEEK", "MONTH", "QUARTER", "YEAR"].includes(date_granularity)) throw new Error(`Invalid date_granularity "${date_granularity}"`); if (dialect === "bigquery") return `DATE_TRUNC(${date_expr}, ${date_granularity})`; else if (dialect === "snowflake") return `DATE_TRUNC(${date_granularity}, ${date_expr})`; else throw new Error(`Invalid dialect "${dialect}"`); } export function constructDateSubExpression(dialect, date_field, num, date_part) { date_part = parseDatePart(date_part); if (dialect === "bigquery") return `DATE_SUB(${date_field}, INTERVAL ${num} ${date_part})`; else if (dialect === "snowflake") return `DATEADD(${date_part}, -${num}, ${date_field})`; else throw new Error(`Invalid dialect "${dialect}"`); } export function constructTodayAtMidnightExpression(dialect) { if (dialect === "bigquery") return `DATE_TRUNC(CURRENT_TIMESTAMP, DAY)`; else if (dialect === "snowflake") return `DATE_TRUNC('DAY', CURRENT_TIMESTAMP)`; else throw new Error(`Invalid dialect "${dialect}"`); } function parseDatePart(text) { if (/^days?$/i.test(text)) return "DAY"; else if (/^weeks?$/i.test(text)) return "WEEK"; else if (/^months?$/i.test(text)) return "MONTH"; else if (/^years?$/i.test(text)) return "YEAR"; else if (/^hours?$/i.test(text)) return "HOUR"; else if (/^minutes?$/i.test(text)) return "MINUTE"; else if (/^seconds?$/i.test(text)) return "SECOND"; else throw new Error(`Invalid date part "${text}"`); } //# sourceMappingURL=dialect.js.map