UNPKG

cube-msfabric-driver

Version:

Cube.js MS Fabric Database Driver using msnodesqlv8

63 lines (53 loc) 2.41 kB
import { MssqlQuery } from "@cubejs-backend/schema-compiler"; export class MSFabricQuery extends MssqlQuery { protected paramCount: number = 0; public buildSqlAndParams(exportAnnotatedSql?: boolean): [string, unknown[]] { const [sql, params] = super.buildSqlAndParams(exportAnnotatedSql); // Replace @_n style parameters with ? for msnodesqlv8 const transformedSql = sql.replace(/@_\d+/g, "?"); return [transformedSql, params]; } public timeGroupedColumn(granularity: string, dimension: string): string { const dateDimension = `CAST(${dimension} AS DATETIME2(3))`; switch (granularity) { case "value": return `FORMAT(${dateDimension}, 'yyyy-MM-dd''T''HH:mm:ss.fff''Z''')`; case "date": return `FORMAT(${dateDimension}, 'yyyy-MM-dd')`; case "time": return `FORMAT(${dateDimension}, 'HH:mm:ss')`; case "datetime": return `FORMAT(${dateDimension}, 'yyyy-MM-dd''T''HH:mm:ss.fff''Z''')`; case "year": return `FORMAT(DATEADD(YEAR,DATEDIFF(YEAR, 0, ${dateDimension}),0),'yyyy-MM-dd''T''HH:mm:ss.fff''Z''')`; case "quarter": return `FORMAT(DATEADD(QUARTER,DATEDIFF(QUARTER, 0, ${dateDimension}),0),'yyyy-MM-dd''T''HH:mm:ss.fff''Z''')`; case "month": return `FORMAT(${dateDimension}, 'yyyy-MM')`; case "week": return `FORMAT(DATEADD(DAY, -DATEPART(WEEKDAY, ${dateDimension}) + 1, ${dateDimension}), 'yyyy-MM-dd')`; case "day": return `FORMAT(${dateDimension}, 'yyyy-MM-dd')`; case "hour": return `FORMAT(${dateDimension}, 'yyyy-MM-dd''T''HH:00:00')`; case "minute": return `FORMAT(${dateDimension}, 'yyyy-MM-dd''T''HH:mm:00')`; case "second": return `FORMAT(${dateDimension}, 'yyyy-MM-dd''T''HH:mm:ss')`; default: return dimension; // Fallback to the original dimension if no match } } public convertTz(field: string): string { return `CAST(FORMAT(${field} AT TIME ZONE 'UTC', 'yyyy-MM-dd''T''HH:mm:ss.fff''Z''') AS VARCHAR(27))`; } public castToString(field: string): string { return `CAST(${field} AS NVARCHAR(MAX))`; } public dateTimeCast(field: string): string { return `CAST(${field} AS DATETIME2)`; } public timeStampCast(value: string): string { return `CAST(${value} AS DATETIME2)`; } }