Skip to content

Commit 7b1a51e

Browse files
committed
implement granularity.isAlignedWithDateRange(...)
1 parent 79f515c commit 7b1a51e

File tree

1 file changed

+25
-2
lines changed

1 file changed

+25
-2
lines changed

packages/cubejs-schema-compiler/src/adapter/Granularity.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
import moment from 'moment-timezone';
22
import {
33
addInterval,
4-
isPredefinedGranularity, parseSqlInterval,
5-
QueryDateRange, timeSeries,
4+
alignToOrigin,
5+
isPredefinedGranularity,
6+
parsedSqlIntervalToDuration,
7+
parseSqlInterval,
8+
QueryDateRange,
9+
timeSeries,
610
timeSeriesFromCustomInterval,
711
TimeSeriesOptions
812
} from '@cubejs-backend/shared';
@@ -159,6 +163,25 @@ export class Granularity {
159163
}
160164
}
161165

166+
public isAlignedWithDateRange([startStr, endStr]: QueryDateRange): boolean {
167+
const intervalParsed = parseSqlInterval(this.granularityInterval);
168+
const grIntervalDuration = parsedSqlIntervalToDuration(intervalParsed);
169+
const msFrom = moment.tz(startStr, this.queryTimezone);
170+
const msTo = moment.tz(endStr, this.queryTimezone).add(1, 'ms');
171+
const dateRangeDuration = moment.duration(msTo.diff(msFrom));
172+
173+
if (dateRangeDuration.asMilliseconds() % grIntervalDuration.asMilliseconds() !== 0) {
174+
return false;
175+
}
176+
177+
const closestDate = alignToOrigin(msFrom, intervalParsed, this.origin);
178+
if (!msFrom.isSame(closestDate)) {
179+
return false;
180+
}
181+
182+
return true;
183+
}
184+
162185
public isNaturalAligned(): boolean {
163186
const intParsed = this.granularityInterval.split(' ');
164187

0 commit comments

Comments
 (0)