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
JavaScript
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