Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 38 additions & 13 deletions packages/cubejs-schema-compiler/test/unit/base-query.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1183,7 +1183,7 @@ describe('SQL Generation', () => {
const utcOffset = moment.tz('America/Los_Angeles').utcOffset() * 60;
expect(query.everyRefreshKeySql({
every: '1 hour'
})).toEqual(['FLOOR((-25200 + EXTRACT(EPOCH FROM NOW())) / 3600)', false, expect.any(BaseQuery)]);
})).toEqual([`FLOOR((${utcOffset} + EXTRACT(EPOCH FROM NOW())) / 3600)`, false, expect.any(BaseQuery)]);

// Standard syntax (minutes hours day month dow)
expect(query.everyRefreshKeySql({ every: '0 * * * *', timezone }))
Expand Down Expand Up @@ -1277,20 +1277,24 @@ describe('SQL Generation', () => {
it('cacheKeyQueries for cube with refreshKey.every (source)', async () => {
await compilers.compiler.compile();

const timezone = 'America/Los_Angeles';
// Calculate UTC offset dynamically to handle DST changes
const utcOffset = moment.tz(timezone).utcOffset() * 60;

const query = new PostgresQuery(compilers, {
measures: [
'cards.sum'
],
timeDimensions: [],
filters: [],
timezone: 'America/Los_Angeles',
timezone,
});

// Query should not match any pre-aggregation!
expect(query.cacheKeyQueries()).toEqual([
[
// Postgres dialect
'SELECT FLOOR((-25200 + EXTRACT(EPOCH FROM NOW())) / 600) as refresh_key',
`SELECT FLOOR((${utcOffset} + EXTRACT(EPOCH FROM NOW())) / 600) as refresh_key`,
[],
{
// false, because there is no externalQueryClass
Expand All @@ -1304,22 +1308,27 @@ describe('SQL Generation', () => {
it('cacheKeyQueries for cube with refreshKey.every (external)', async () => {
await compilers.compiler.compile();

const timezone = 'Europe/London';
// Calculate UTC offset dynamically to handle DST changes
const utcOffset = moment.tz(timezone).utcOffset() * 60;
const utcOffsetPrefix = utcOffset ? `${utcOffset} + ` : '';

// Query should not match any pre-aggregation!
const query = new PostgresQuery(compilers, {
measures: [
'cards.sum'
],
timeDimensions: [],
filters: [],
timezone: 'Europe/London',
timezone,
externalQueryClass: MssqlQuery
});

// Query should not match any pre-aggregation!
expect(query.cacheKeyQueries()).toEqual([
[
// MSSQL dialect, because externalQueryClass
'SELECT FLOOR((3600 + DATEDIFF(SECOND,\'1970-01-01\', GETUTCDATE())) / 600) as refresh_key',
`SELECT FLOOR((${utcOffsetPrefix}DATEDIFF(SECOND,'1970-01-01', GETUTCDATE())) / 600) as refresh_key`,
[],
{
// true, because externalQueryClass
Expand All @@ -1337,13 +1346,17 @@ describe('SQL Generation', () => {
it('preAggregationsDescription for query - refreshKey every (external)', async () => {
await compilers.compiler.compile();

const timezone = 'America/Los_Angeles';
// Calculate UTC offset dynamically to handle DST changes
const utcOffset = moment.tz(timezone).utcOffset() * 60;

const query = new PostgresQuery(compilers, {
measures: [
'cards.count'
],
timeDimensions: [],
filters: [],
timezone: 'America/Los_Angeles',
timezone,
externalQueryClass: MssqlQuery
});

Expand All @@ -1352,7 +1365,7 @@ describe('SQL Generation', () => {
expect(preAggregations[0].invalidateKeyQueries).toEqual([
[
// MSSQL dialect
'SELECT FLOOR((-25200 + DATEDIFF(SECOND,\'1970-01-01\', GETUTCDATE())) / 3600) as refresh_key',
`SELECT FLOOR((${utcOffset} + DATEDIFF(SECOND,'1970-01-01', GETUTCDATE())) / 3600) as refresh_key`,
[],
{
external: true,
Expand Down Expand Up @@ -1395,6 +1408,10 @@ describe('SQL Generation', () => {
it('preAggregationsDescription for query - refreshKey incremental (timeDimensions range)', async () => {
await compilers.compiler.compile();

const timezone = 'Asia/Tokyo';
// Calculate UTC offset dynamically to handle any timezone changes
const utcOffset = moment.tz(timezone).utcOffset() * 60;

const query = new PostgresQuery(compilers, {
measures: [
'cards.min'
Expand All @@ -1405,15 +1422,15 @@ describe('SQL Generation', () => {
dateRange: ['2016-12-30', '2017-01-05']
}],
filters: [],
timezone: 'Asia/Tokyo',
timezone,
externalQueryClass: MssqlQuery
});

const preAggregations: any = query.newPreAggregations().preAggregationsDescription();
expect(preAggregations.length).toEqual(1);
expect(preAggregations[0].invalidateKeyQueries).toEqual([
[
'SELECT CASE\n WHEN CURRENT_TIMESTAMP < CAST(@_1 AS DATETIMEOFFSET) THEN FLOOR((32400 + DATEDIFF(SECOND,\'1970-01-01\', GETUTCDATE())) / 3600) END as refresh_key',
`SELECT CASE\n WHEN CURRENT_TIMESTAMP < CAST(@_1 AS DATETIMEOFFSET) THEN FLOOR((${utcOffset} + DATEDIFF(SECOND,'1970-01-01', GETUTCDATE())) / 3600) END as refresh_key`,
[
'__TO_PARTITION_RANGE',
],
Expand Down Expand Up @@ -1479,6 +1496,10 @@ describe('SQL Generation', () => {
it('refreshKey from cube (source)', async () => {
await compilers.compiler.compile();

const timezone = 'America/Los_Angeles';
// Calculate UTC offset dynamically to handle DST changes
const utcOffset = moment.tz(timezone).utcOffset() * 60;

const query = new PostgresQuery(compilers, {
measures: [
'cards.count'
Expand All @@ -1489,14 +1510,14 @@ describe('SQL Generation', () => {
dateRange: ['2016-12-30', '2017-01-05']
}],
filters: [],
timezone: 'America/Los_Angeles',
timezone,
});

const preAggregations: any = query.newPreAggregations().preAggregationsDescription();
expect(preAggregations.length).toEqual(1);
expect(preAggregations[0].invalidateKeyQueries).toEqual([
[
'SELECT FLOOR((-25200 + EXTRACT(EPOCH FROM NOW())) / 600) as refresh_key',
`SELECT FLOOR((${utcOffset} + EXTRACT(EPOCH FROM NOW())) / 600) as refresh_key`,
[],
{
external: false,
Expand All @@ -1509,6 +1530,10 @@ describe('SQL Generation', () => {
it('refreshKey from cube (external)', async () => {
await compilers.compiler.compile();

const timezone = 'America/Los_Angeles';
// Calculate UTC offset dynamically to handle DST changes
const utcOffset = moment.tz(timezone).utcOffset() * 60;

const query = new PostgresQuery(compilers, {
measures: [
'cards.count'
Expand All @@ -1519,15 +1544,15 @@ describe('SQL Generation', () => {
dateRange: ['2016-12-30', '2017-01-05']
}],
filters: [],
timezone: 'America/Los_Angeles',
timezone,
externalQueryClass: MssqlQuery
});

const preAggregations: any = query.newPreAggregations().preAggregationsDescription();
expect(preAggregations.length).toEqual(1);
expect(preAggregations[0].invalidateKeyQueries).toEqual([
[
'SELECT FLOOR((-25200 + DATEDIFF(SECOND,\'1970-01-01\', GETUTCDATE())) / 600) as refresh_key',
`SELECT FLOOR((${utcOffset} + DATEDIFF(SECOND,'1970-01-01', GETUTCDATE())) / 600) as refresh_key`,
[],
{
external: true,
Expand Down
Loading