cube-msfabric-driver
Version:
Cube.js MS Fabric Database Driver using msnodesqlv8
63 lines (53 loc) • 2.41 kB
text/typescript
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)`;
}
}