diff --git a/packages/cubejs-schema-compiler/src/adapter/RedshiftQuery.ts b/packages/cubejs-schema-compiler/src/adapter/RedshiftQuery.ts index 9889f79207b85..893f6e4d9bf27 100644 --- a/packages/cubejs-schema-compiler/src/adapter/RedshiftQuery.ts +++ b/packages/cubejs-schema-compiler/src/adapter/RedshiftQuery.ts @@ -1,3 +1,4 @@ +import { parseSqlInterval } from '@cubejs-backend/shared'; import { PostgresQuery } from './PostgresQuery'; export class RedshiftQuery extends PostgresQuery { @@ -12,6 +13,74 @@ export class RedshiftQuery extends PostgresQuery { return 'GETDATE()'; } + /** + * Redshift doesn't support Interval values with month or year parts (as Postgres does) + * so we need to make date math on our own. + */ + public override subtractInterval(date: string, interval: string): string { + const intervalParsed = parseSqlInterval(interval); + let result = date; + + for (const [datePart, intervalValue] of Object.entries(intervalParsed)) { + result = `DATEADD(${datePart}, -${intervalValue}, ${result})`; + } + + return result; + } + + /** + * Redshift doesn't support Interval values with month or year parts (as Postgres does) + * so we need to make date math on our own. + */ + public override addInterval(date: string, interval: string): string { + const intervalParsed = parseSqlInterval(interval); + let result = date; + + for (const [datePart, intervalValue] of Object.entries(intervalParsed)) { + result = `DATEADD(${datePart}, ${intervalValue}, ${result})`; + } + + return result; + } + + /** + * Redshift doesn't support Interval values with month or year parts (as Postgres does) + * so we need to make date math on our own. + */ + public override dateBin(interval: string, source: string, origin: string): string { + const intervalParsed = parseSqlInterval(interval); + + if ((intervalParsed.year || intervalParsed.month || intervalParsed.quarter) && + (intervalParsed.week || intervalParsed.day || intervalParsed.hour || intervalParsed.minute || intervalParsed.second)) { + throw new Error(`Complex intervals like "${interval}" are not supported. Please use Year to Month or Day to second intervals`); + } + + if (intervalParsed.year || intervalParsed.month || intervalParsed.quarter) { + let totalMonths = 0; + + if (intervalParsed.year) { + totalMonths += intervalParsed.year * 12; + } + + if (intervalParsed.quarter) { + totalMonths += intervalParsed.quarter * 3; + } + + if (intervalParsed.month) { + totalMonths += intervalParsed.month; + } + + return `DATEADD( + month, + (FLOOR(DATEDIFF(month, ${this.dateTimeCast(`'${origin}'`)}, ${source}) / ${totalMonths}) * ${totalMonths})::int, + ${this.dateTimeCast(`'${origin}'`)} + )`; + } + + // For days and lower intervals - we can reuse Postgres version + return super.dateBin(interval, source, origin); + } + public sqlTemplates() { const templates = super.sqlTemplates(); templates.functions.DLOG10 = 'LOG(10, {{ args_concat }})'; diff --git a/packages/cubejs-testing-drivers/fixtures/redshift.json b/packages/cubejs-testing-drivers/fixtures/redshift.json index 1e2415d2f03e0..2351eee2cec17 100644 --- a/packages/cubejs-testing-drivers/fixtures/redshift.json +++ b/packages/cubejs-testing-drivers/fixtures/redshift.json @@ -155,17 +155,10 @@ }, "skip": [ "---------------------------------------", - "Error: Interval values with month or year parts are not supported", + "Error: Complex intervals like \"3 months 2 weeks 3 days\" are not supported. @see dateBin impl in ReshiftQuery", "---------------------------------------", - "querying BigECommerce: rolling window by 2 month", - "querying custom granularities ECommerce: count by half_year + no dimension", - "querying custom granularities ECommerce: count by half_year_by_1st_april + no dimension", "querying custom granularities ECommerce: count by three_months_by_march + no dimension", - "querying custom granularities ECommerce: count by half_year + dimension", - "querying custom granularities ECommerce: count by half_year_by_1st_april + dimension", "querying custom granularities ECommerce: count by three_months_by_march + dimension", - "querying custom granularities ECommerce: count by two_mo_by_feb + no dimension + rollingCountByTrailing", - "querying custom granularities ECommerce: count by two_mo_by_feb + no dimension + rollingCountByLeading", "---------------------------------------", "SKIPPED FOR ALL ", diff --git a/packages/cubejs-testing-drivers/test/__snapshots__/redshift-full.test.ts.snap b/packages/cubejs-testing-drivers/test/__snapshots__/redshift-full.test.ts.snap index 735b8550faaf0..6e4f8af6686f1 100644 --- a/packages/cubejs-testing-drivers/test/__snapshots__/redshift-full.test.ts.snap +++ b/packages/cubejs-testing-drivers/test/__snapshots__/redshift-full.test.ts.snap @@ -11190,6 +11190,71 @@ Array [ ] `; +exports[`Queries with the @cubejs-backend/redshift-driver querying BigECommerce: rolling window by 2 month 1`] = ` +Array [ + Object { + "BigECommerce.orderDate": "2020-01-01T00:00:00.000", + "BigECommerce.orderDate.month": "2020-01-01T00:00:00.000", + "BigECommerce.rollingCountBy2Month": "2", + }, + Object { + "BigECommerce.orderDate": "2020-02-01T00:00:00.000", + "BigECommerce.orderDate.month": "2020-02-01T00:00:00.000", + "BigECommerce.rollingCountBy2Month": "3", + }, + Object { + "BigECommerce.orderDate": "2020-03-01T00:00:00.000", + "BigECommerce.orderDate.month": "2020-03-01T00:00:00.000", + "BigECommerce.rollingCountBy2Month": "3", + }, + Object { + "BigECommerce.orderDate": "2020-04-01T00:00:00.000", + "BigECommerce.orderDate.month": "2020-04-01T00:00:00.000", + "BigECommerce.rollingCountBy2Month": "3", + }, + Object { + "BigECommerce.orderDate": "2020-05-01T00:00:00.000", + "BigECommerce.orderDate.month": "2020-05-01T00:00:00.000", + "BigECommerce.rollingCountBy2Month": "6", + }, + Object { + "BigECommerce.orderDate": "2020-06-01T00:00:00.000", + "BigECommerce.orderDate.month": "2020-06-01T00:00:00.000", + "BigECommerce.rollingCountBy2Month": "12", + }, + Object { + "BigECommerce.orderDate": "2020-07-01T00:00:00.000", + "BigECommerce.orderDate.month": "2020-07-01T00:00:00.000", + "BigECommerce.rollingCountBy2Month": "7", + }, + Object { + "BigECommerce.orderDate": "2020-08-01T00:00:00.000", + "BigECommerce.orderDate.month": "2020-08-01T00:00:00.000", + "BigECommerce.rollingCountBy2Month": null, + }, + Object { + "BigECommerce.orderDate": "2020-09-01T00:00:00.000", + "BigECommerce.orderDate.month": "2020-09-01T00:00:00.000", + "BigECommerce.rollingCountBy2Month": "6", + }, + Object { + "BigECommerce.orderDate": "2020-10-01T00:00:00.000", + "BigECommerce.orderDate.month": "2020-10-01T00:00:00.000", + "BigECommerce.rollingCountBy2Month": "10", + }, + Object { + "BigECommerce.orderDate": "2020-11-01T00:00:00.000", + "BigECommerce.orderDate.month": "2020-11-01T00:00:00.000", + "BigECommerce.rollingCountBy2Month": "13", + }, + Object { + "BigECommerce.orderDate": "2020-12-01T00:00:00.000", + "BigECommerce.orderDate.month": "2020-12-01T00:00:00.000", + "BigECommerce.rollingCountBy2Month": "16", + }, +] +`; + exports[`Queries with the @cubejs-backend/redshift-driver querying BigECommerce: rolling window by 2 week 1`] = ` Array [ Object { @@ -15615,6 +15680,502 @@ Array [ ] `; +exports[`Queries with the @cubejs-backend/redshift-driver querying custom granularities ECommerce: count by half_year + dimension 1`] = ` +Array [ + Object { + "ECommerce.city": "Detroit", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-01-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2020-01-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Lorain", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-01-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2020-01-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Auburn", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-07-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2020-07-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Baltimore", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-07-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2020-07-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Columbus", + "ECommerce.count": "3", + "ECommerce.customOrderDateNoPreAgg": "2020-07-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2020-07-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Decatur", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-07-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2020-07-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Houston", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-07-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2020-07-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Los Angeles", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-07-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2020-07-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Louisville", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-07-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2020-07-01T00:00:00.000", + }, + Object { + "ECommerce.city": "New York City", + "ECommerce.count": "4", + "ECommerce.customOrderDateNoPreAgg": "2020-07-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2020-07-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Olympia", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-07-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2020-07-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Omaha", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-07-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2020-07-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Philadelphia", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-07-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2020-07-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Arlington", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-01-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2021-01-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Bakersfield", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-01-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2021-01-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Bowling", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-01-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2021-01-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Columbus", + "ECommerce.count": "9", + "ECommerce.customOrderDateNoPreAgg": "2021-01-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2021-01-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Dallas", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-01-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2021-01-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Detroit", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-01-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2021-01-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Glendale", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-01-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2021-01-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Lafayette", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-01-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2021-01-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Lakewood", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-01-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2021-01-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Marion", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-01-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2021-01-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Morristown", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-01-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2021-01-01T00:00:00.000", + }, + Object { + "ECommerce.city": "New York City", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-01-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2021-01-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Oakland", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-01-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2021-01-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Philadelphia", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-01-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2021-01-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Provo", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-01-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2021-01-01T00:00:00.000", + }, + Object { + "ECommerce.city": "San Francisco", + "ECommerce.count": "2", + "ECommerce.customOrderDateNoPreAgg": "2021-01-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2021-01-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Vancouver", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-01-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2021-01-01T00:00:00.000", + }, +] +`; + +exports[`Queries with the @cubejs-backend/redshift-driver querying custom granularities ECommerce: count by half_year + no dimension 1`] = ` +Array [ + Object { + "ECommerce.count": "2", + "ECommerce.customOrderDateNoPreAgg": "2020-01-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2020-01-01T00:00:00.000", + }, + Object { + "ECommerce.count": "16", + "ECommerce.customOrderDateNoPreAgg": "2020-07-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2020-07-01T00:00:00.000", + }, + Object { + "ECommerce.count": "26", + "ECommerce.customOrderDateNoPreAgg": "2021-01-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year": "2021-01-01T00:00:00.000", + }, +] +`; + +exports[`Queries with the @cubejs-backend/redshift-driver querying custom granularities ECommerce: count by half_year_by_1st_april + dimension 1`] = ` +Array [ + Object { + "ECommerce.city": "Decatur", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-04-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-04-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Detroit", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-04-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-04-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Houston", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-04-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-04-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Lorain", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-04-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-04-01T00:00:00.000", + }, + Object { + "ECommerce.city": "New York City", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-04-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-04-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Philadelphia", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-04-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-04-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Arlington", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-10-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-10-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Auburn", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-10-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-10-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Bakersfield", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-10-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-10-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Baltimore", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-10-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-10-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Columbus", + "ECommerce.count": "4", + "ECommerce.customOrderDateNoPreAgg": "2020-10-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-10-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Detroit", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-10-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-10-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Lakewood", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-10-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-10-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Los Angeles", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-10-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-10-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Louisville", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-10-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-10-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Morristown", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-10-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-10-01T00:00:00.000", + }, + Object { + "ECommerce.city": "New York City", + "ECommerce.count": "3", + "ECommerce.customOrderDateNoPreAgg": "2020-10-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-10-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Olympia", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-10-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-10-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Omaha", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-10-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-10-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Provo", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-10-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-10-01T00:00:00.000", + }, + Object { + "ECommerce.city": "San Francisco", + "ECommerce.count": "2", + "ECommerce.customOrderDateNoPreAgg": "2020-10-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-10-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Vancouver", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2020-10-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-10-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Bowling", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-04-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2021-04-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Columbus", + "ECommerce.count": "8", + "ECommerce.customOrderDateNoPreAgg": "2021-04-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2021-04-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Dallas", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-04-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2021-04-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Glendale", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-04-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2021-04-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Lafayette", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-04-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2021-04-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Marion", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-04-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2021-04-01T00:00:00.000", + }, + Object { + "ECommerce.city": "New York City", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-04-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2021-04-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Oakland", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-04-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2021-04-01T00:00:00.000", + }, + Object { + "ECommerce.city": "Philadelphia", + "ECommerce.count": "1", + "ECommerce.customOrderDateNoPreAgg": "2021-04-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2021-04-01T00:00:00.000", + }, +] +`; + +exports[`Queries with the @cubejs-backend/redshift-driver querying custom granularities ECommerce: count by half_year_by_1st_april + no dimension 1`] = ` +Array [ + Object { + "ECommerce.count": "6", + "ECommerce.customOrderDateNoPreAgg": "2020-04-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-04-01T00:00:00.000", + }, + Object { + "ECommerce.count": "22", + "ECommerce.customOrderDateNoPreAgg": "2020-10-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2020-10-01T00:00:00.000", + }, + Object { + "ECommerce.count": "16", + "ECommerce.customOrderDateNoPreAgg": "2021-04-01T00:00:00.000", + "ECommerce.customOrderDateNoPreAgg.half_year_by_1st_april": "2021-04-01T00:00:00.000", + }, +] +`; + +exports[`Queries with the @cubejs-backend/redshift-driver querying custom granularities ECommerce: count by two_mo_by_feb + no dimension + rollingCountByLeading 1`] = ` +Array [ + Object { + "ECommerce.customOrderDateNoPreAgg": "2019-12-01T10:00:00.000", + "ECommerce.customOrderDateNoPreAgg.two_mo_by_feb": "2019-12-01T10:00:00.000", + "ECommerce.rollingCountByLeading": "8", + }, + Object { + "ECommerce.customOrderDateNoPreAgg": "2020-02-01T10:00:00.000", + "ECommerce.customOrderDateNoPreAgg.two_mo_by_feb": "2020-02-01T10:00:00.000", + "ECommerce.rollingCountByLeading": "12", + }, + Object { + "ECommerce.customOrderDateNoPreAgg": "2020-04-01T10:00:00.000", + "ECommerce.customOrderDateNoPreAgg.two_mo_by_feb": "2020-04-01T10:00:00.000", + "ECommerce.rollingCountByLeading": "6", + }, + Object { + "ECommerce.customOrderDateNoPreAgg": "2020-06-01T10:00:00.000", + "ECommerce.customOrderDateNoPreAgg.two_mo_by_feb": "2020-06-01T10:00:00.000", + "ECommerce.rollingCountByLeading": "19", + }, + Object { + "ECommerce.customOrderDateNoPreAgg": "2020-08-01T10:00:00.000", + "ECommerce.customOrderDateNoPreAgg.two_mo_by_feb": "2020-08-01T10:00:00.000", + "ECommerce.rollingCountByLeading": "16", + }, + Object { + "ECommerce.customOrderDateNoPreAgg": "2020-10-01T10:00:00.000", + "ECommerce.customOrderDateNoPreAgg.two_mo_by_feb": "2020-10-01T10:00:00.000", + "ECommerce.rollingCountByLeading": null, + }, + Object { + "ECommerce.customOrderDateNoPreAgg": "2020-12-01T10:00:00.000", + "ECommerce.customOrderDateNoPreAgg.two_mo_by_feb": "2020-12-01T10:00:00.000", + "ECommerce.rollingCountByLeading": null, + }, +] +`; + +exports[`Queries with the @cubejs-backend/redshift-driver querying custom granularities ECommerce: count by two_mo_by_feb + no dimension + rollingCountByTrailing 1`] = ` +Array [ + Object { + "ECommerce.customOrderDateNoPreAgg": "2019-12-01T10:00:00.000", + "ECommerce.customOrderDateNoPreAgg.two_mo_by_feb": "2019-12-01T10:00:00.000", + "ECommerce.rollingCountByTrailing": "3", + }, + Object { + "ECommerce.customOrderDateNoPreAgg": "2020-02-01T10:00:00.000", + "ECommerce.customOrderDateNoPreAgg.two_mo_by_feb": "2020-02-01T10:00:00.000", + "ECommerce.rollingCountByTrailing": "3", + }, + Object { + "ECommerce.customOrderDateNoPreAgg": "2020-04-01T10:00:00.000", + "ECommerce.customOrderDateNoPreAgg.two_mo_by_feb": "2020-04-01T10:00:00.000", + "ECommerce.rollingCountByTrailing": "12", + }, + Object { + "ECommerce.customOrderDateNoPreAgg": "2020-06-01T10:00:00.000", + "ECommerce.customOrderDateNoPreAgg.two_mo_by_feb": "2020-06-01T10:00:00.000", + "ECommerce.rollingCountByTrailing": null, + }, + Object { + "ECommerce.customOrderDateNoPreAgg": "2020-08-01T10:00:00.000", + "ECommerce.customOrderDateNoPreAgg.two_mo_by_feb": "2020-08-01T10:00:00.000", + "ECommerce.rollingCountByTrailing": "10", + }, + Object { + "ECommerce.customOrderDateNoPreAgg": "2020-10-01T10:00:00.000", + "ECommerce.customOrderDateNoPreAgg.two_mo_by_feb": "2020-10-01T10:00:00.000", + "ECommerce.rollingCountByTrailing": "16", + }, + Object { + "ECommerce.customOrderDateNoPreAgg": "2020-12-01T10:00:00.000", + "ECommerce.customOrderDateNoPreAgg.two_mo_by_feb": "2020-12-01T10:00:00.000", + "ECommerce.rollingCountByTrailing": null, + }, +] +`; + exports[`Queries with the @cubejs-backend/redshift-driver querying custom granularities ECommerce: count by two_mo_by_feb + no dimension + rollingCountByUnbounded 1`] = ` Array [ Object {