UI: Improve interval timestamp range calculation.

This commit is contained in:
Igor Kulikov 2021-03-20 01:27:19 +02:00
parent bb4a51bae1
commit dfcc5ec52e
4 changed files with 119 additions and 161 deletions

View File

@ -17,10 +17,9 @@
import { SubscriptionData, SubscriptionDataHolder } from '@app/shared/models/telemetry/telemetry.models'; import { SubscriptionData, SubscriptionDataHolder } from '@app/shared/models/telemetry/telemetry.models';
import { import {
AggregationType, calculateIntervalComparisonEndTime, AggregationType, calculateIntervalComparisonEndTime,
calculateIntervalEndTime, calculateIntervalEndTime, calculateIntervalStartEndTime,
calculateIntervalStartTime,
getCurrentTime, getCurrentTime,
getCurrentTimeForComparison, getCurrentTimeForComparison, getTime,
SubscriptionTimewindow SubscriptionTimewindow
} from '@shared/models/time/time.models'; } from '@shared/models/time/time.models';
import { UtilsService } from '@core/services/utils.service'; import { UtilsService } from '@core/services/utils.service';
@ -245,11 +244,12 @@ export class DataAggregator {
this.startTs = this.subsTw.startTs + this.subsTw.tsOffset; this.startTs = this.subsTw.startTs + this.subsTw.tsOffset;
if (this.subsTw.quickInterval) { if (this.subsTw.quickInterval) {
if (this.subsTw.timeForComparison === 'previousInterval') { if (this.subsTw.timeForComparison === 'previousInterval') {
const startDate = getTime(this.subsTw.startTs, this.subsTw.timezone);
const currentDate = getCurrentTime(this.subsTw.timezone); const currentDate = getCurrentTime(this.subsTw.timezone);
this.endTs = calculateIntervalComparisonEndTime(this.subsTw.quickInterval, currentDate) + this.subsTw.tsOffset; this.endTs = calculateIntervalComparisonEndTime(this.subsTw.quickInterval, startDate, currentDate) + this.subsTw.tsOffset;
} else { } else {
const currentDate = this.getCurrentTime(); const startDate = getTime(this.subsTw.startTs, this.subsTw.timezone);
this.endTs = calculateIntervalEndTime(this.subsTw.quickInterval, currentDate) + this.subsTw.tsOffset; this.endTs = calculateIntervalEndTime(this.subsTw.quickInterval, startDate, this.subsTw.timezone) + this.subsTw.tsOffset;
} }
} else { } else {
this.endTs = this.startTs + this.subsTw.aggregation.timeWindow; this.endTs = this.startTs + this.subsTw.aggregation.timeWindow;
@ -270,9 +270,9 @@ export class DataAggregator {
if (delta || !this.data || rangeChanged) { if (delta || !this.data || rangeChanged) {
const tickTs = delta * this.subsTw.aggregation.interval; const tickTs = delta * this.subsTw.aggregation.interval;
if (this.subsTw.quickInterval) { if (this.subsTw.quickInterval) {
const currentDate = this.getCurrentTime(); const startEndTime = calculateIntervalStartEndTime(this.subsTw.quickInterval, this.subsTw.timezone);
this.startTs = calculateIntervalStartTime(this.subsTw.quickInterval, currentDate) + this.subsTw.tsOffset; this.startTs = startEndTime[0] + this.subsTw.tsOffset;
this.endTs = calculateIntervalEndTime(this.subsTw.quickInterval, currentDate) + this.subsTw.tsOffset; this.endTs = startEndTime[1] + this.subsTw.tsOffset;
} else { } else {
this.startTs += tickTs; this.startTs += tickTs;
this.endTs += tickTs; this.endTs += tickTs;

View File

@ -37,12 +37,11 @@ import {
} from '@app/shared/models/widget.models'; } from '@app/shared/models/widget.models';
import { HttpErrorResponse } from '@angular/common/http'; import { HttpErrorResponse } from '@angular/common/http';
import { import {
calculateIntervalEndTime, calculateIntervalStartEndTime,
calculateIntervalStartTime,
calculateTsOffset, ComparisonDuration, calculateTsOffset, ComparisonDuration,
createSubscriptionTimewindow, createSubscriptionTimewindow,
createTimewindowForComparison, createTimewindowForComparison,
getCurrentTime, isHistoryTypeTimewindow, isHistoryTypeTimewindow,
SubscriptionTimewindow, SubscriptionTimewindow,
Timewindow, timewindowTypeChanged, Timewindow, timewindowTypeChanged,
toHistoryTimewindow, toHistoryTimewindow,
@ -1106,11 +1105,9 @@ export class WidgetSubscription implements IWidgetSubscription {
this.timeWindow.timezone = this.subscriptionTimewindow.timezone; this.timeWindow.timezone = this.subscriptionTimewindow.timezone;
if (this.subscriptionTimewindow.realtimeWindowMs) { if (this.subscriptionTimewindow.realtimeWindowMs) {
if (this.subscriptionTimewindow.quickInterval) { if (this.subscriptionTimewindow.quickInterval) {
const currentDate = getCurrentTime(this.subscriptionTimewindow.timezone); const startEndTime = calculateIntervalStartEndTime(this.subscriptionTimewindow.quickInterval, this.subscriptionTimewindow.timezone);
this.timeWindow.maxTime = calculateIntervalEndTime( this.timeWindow.maxTime = startEndTime[1] + this.subscriptionTimewindow.tsOffset;
this.subscriptionTimewindow.quickInterval, currentDate) + this.subscriptionTimewindow.tsOffset; this.timeWindow.minTime = startEndTime[0] + this.subscriptionTimewindow.tsOffset;
this.timeWindow.minTime = calculateIntervalStartTime(
this.subscriptionTimewindow.quickInterval, currentDate) + this.subscriptionTimewindow.tsOffset;
} else { } else {
this.timeWindow.maxTime = moment().valueOf() + this.subscriptionTimewindow.tsOffset + this.timeWindow.stDiff; this.timeWindow.maxTime = moment().valueOf() + this.subscriptionTimewindow.tsOffset + this.timeWindow.stDiff;
this.timeWindow.minTime = this.timeWindow.maxTime - this.subscriptionTimewindow.realtimeWindowMs; this.timeWindow.minTime = this.timeWindow.maxTime - this.subscriptionTimewindow.realtimeWindowMs;

View File

@ -56,9 +56,7 @@ import { DialogService } from '@core/services/dialog.service';
import { AddEntityDialogComponent } from './add-entity-dialog.component'; import { AddEntityDialogComponent } from './add-entity-dialog.component';
import { AddEntityDialogData, EntityAction } from '@home/models/entity/entity-component.models'; import { AddEntityDialogData, EntityAction } from '@home/models/entity/entity-component.models';
import { import {
calculateIntervalEndTime, calculateIntervalStartEndTime,
calculateIntervalStartTime,
getCurrentTime,
HistoryWindowType, HistoryWindowType,
Timewindow Timewindow
} from '@shared/models/time/time.models'; } from '@shared/models/time/time.models';
@ -303,9 +301,9 @@ export class EntitiesTableComponent extends PageComponent implements AfterViewIn
timePageLink.startTime = currentTime - this.timewindow.history.timewindowMs; timePageLink.startTime = currentTime - this.timewindow.history.timewindowMs;
timePageLink.endTime = currentTime; timePageLink.endTime = currentTime;
} else if (this.timewindow.history.historyType === HistoryWindowType.INTERVAL) { } else if (this.timewindow.history.historyType === HistoryWindowType.INTERVAL) {
const currentDate = getCurrentTime(); const startEndTime = calculateIntervalStartEndTime(this.timewindow.history.quickInterval);
timePageLink.startTime = calculateIntervalStartTime(this.timewindow.history.quickInterval, currentDate); timePageLink.startTime = startEndTime[0];
timePageLink.endTime = calculateIntervalEndTime(this.timewindow.history.quickInterval, currentDate); timePageLink.endTime = startEndTime[1];
} else { } else {
timePageLink.startTime = this.timewindow.history.fixedTimewindow.startTimeMs; timePageLink.startTime = this.timewindow.history.fixedTimewindow.startTimeMs;
timePageLink.endTime = this.timewindow.history.fixedTimewindow.endTimeMs; timePageLink.endTime = this.timewindow.history.fixedTimewindow.endTimeMs;

View File

@ -174,19 +174,18 @@ export const QuickTimeIntervalTranslationMap = new Map<QuickTimeInterval, string
]); ]);
export function historyInterval(timewindowMs: number): Timewindow { export function historyInterval(timewindowMs: number): Timewindow {
const timewindow: Timewindow = { return {
selectedTab: TimewindowType.HISTORY, selectedTab: TimewindowType.HISTORY,
history: { history: {
historyType: HistoryWindowType.LAST_INTERVAL, historyType: HistoryWindowType.LAST_INTERVAL,
timewindowMs timewindowMs
} }
}; };
return timewindow;
} }
export function defaultTimewindow(timeService: TimeService): Timewindow { export function defaultTimewindow(timeService: TimeService): Timewindow {
const currentTime = moment().valueOf(); const currentTime = moment().valueOf();
const timewindow: Timewindow = { return {
displayValue: '', displayValue: '',
hideInterval: false, hideInterval: false,
hideAggregation: false, hideAggregation: false,
@ -214,7 +213,6 @@ export function defaultTimewindow(timeService: TimeService): Timewindow {
limit: Math.floor(timeService.getMaxDatapointsLimit() / 2) limit: Math.floor(timeService.getMaxDatapointsLimit() / 2)
} }
}; };
return timewindow;
} }
function getTimewindowType(timewindow: Timewindow): TimewindowType { function getTimewindowType(timewindow: Timewindow): TimewindowType {
@ -304,7 +302,7 @@ export function toHistoryTimewindow(timewindow: Timewindow, startTimeMs: number,
aggType = AggregationType.AVG; aggType = AggregationType.AVG;
limit = timeService.getMaxDatapointsLimit(); limit = timeService.getMaxDatapointsLimit();
} }
const historyTimewindow: Timewindow = { return {
hideInterval: timewindow.hideInterval || false, hideInterval: timewindow.hideInterval || false,
hideAggregation: timewindow.hideAggregation || false, hideAggregation: timewindow.hideAggregation || false,
hideAggInterval: timewindow.hideAggInterval || false, hideAggInterval: timewindow.hideAggInterval || false,
@ -324,7 +322,6 @@ export function toHistoryTimewindow(timewindow: Timewindow, startTimeMs: number,
}, },
timezone: timewindow.timezone timezone: timewindow.timezone
}; };
return historyTimewindow;
} }
export function timewindowTypeChanged(newTimewindow: Timewindow, oldTimewindow: Timewindow): boolean { export function timewindowTypeChanged(newTimewindow: Timewindow, oldTimewindow: Timewindow): boolean {
@ -363,7 +360,7 @@ export function createSubscriptionTimewindow(timewindow: Timewindow, stDiff: num
timezone: timewindow.timezone, timezone: timewindow.timezone,
tsOffset: calculateTsOffset(timewindow.timezone) tsOffset: calculateTsOffset(timewindow.timezone)
}; };
let aggTimewindow = 0; let aggTimewindow;
if (stateData) { if (stateData) {
subscriptionTimewindow.aggregation.type = AggregationType.NONE; subscriptionTimewindow.aggregation.type = AggregationType.NONE;
subscriptionTimewindow.aggregation.stateData = true; subscriptionTimewindow.aggregation.stateData = true;
@ -385,14 +382,15 @@ export function createSubscriptionTimewindow(timewindow: Timewindow, stDiff: num
} }
} }
if (realtimeType === RealtimeWindowType.INTERVAL) { if (realtimeType === RealtimeWindowType.INTERVAL) {
const currentDate = getCurrentTime(timewindow.timezone);
subscriptionTimewindow.realtimeWindowMs = subscriptionTimewindow.realtimeWindowMs =
getSubscriptionRealtimeWindowFromTimeInterval(timewindow.realtime.quickInterval, currentDate); getSubscriptionRealtimeWindowFromTimeInterval(timewindow.realtime.quickInterval, timewindow.timezone);
subscriptionTimewindow.quickInterval = timewindow.realtime.quickInterval; subscriptionTimewindow.quickInterval = timewindow.realtime.quickInterval;
subscriptionTimewindow.startTs = calculateIntervalStartTime(timewindow.realtime.quickInterval, currentDate); const currentDate = getCurrentTime(timewindow.timezone);
subscriptionTimewindow.startTs = calculateIntervalStartTime(timewindow.realtime.quickInterval, currentDate).valueOf();
} else { } else {
subscriptionTimewindow.realtimeWindowMs = timewindow.realtime.timewindowMs; subscriptionTimewindow.realtimeWindowMs = timewindow.realtime.timewindowMs;
subscriptionTimewindow.startTs = Date.now() + stDiff - subscriptionTimewindow.realtimeWindowMs; const currentDate = getCurrentTime(timewindow.timezone);
subscriptionTimewindow.startTs = currentDate.valueOf() + stDiff - subscriptionTimewindow.realtimeWindowMs;
} }
subscriptionTimewindow.aggregation.interval = subscriptionTimewindow.aggregation.interval =
timeService.boundIntervalToTimewindow(subscriptionTimewindow.realtimeWindowMs, timewindow.realtime.interval, timeService.boundIntervalToTimewindow(subscriptionTimewindow.realtimeWindowMs, timewindow.realtime.interval,
@ -425,10 +423,10 @@ export function createSubscriptionTimewindow(timewindow: Timewindow, stDiff: num
}; };
aggTimewindow = timewindow.history.timewindowMs; aggTimewindow = timewindow.history.timewindowMs;
} else if (historyType === HistoryWindowType.INTERVAL) { } else if (historyType === HistoryWindowType.INTERVAL) {
const currentDate = getCurrentTime(timewindow.timezone); const startEndTime = calculateIntervalStartEndTime(timewindow.history.quickInterval, timewindow.timezone);
subscriptionTimewindow.fixedWindow = { subscriptionTimewindow.fixedWindow = {
startTimeMs: calculateIntervalStartTime(timewindow.history.quickInterval, currentDate), startTimeMs: startEndTime[0],
endTimeMs: calculateIntervalEndTime(timewindow.history.quickInterval, currentDate) endTimeMs: startEndTime[1]
}; };
aggTimewindow = subscriptionTimewindow.fixedWindow.endTimeMs - subscriptionTimewindow.fixedWindow.startTimeMs; aggTimewindow = subscriptionTimewindow.fixedWindow.endTimeMs - subscriptionTimewindow.fixedWindow.startTimeMs;
subscriptionTimewindow.quickInterval = timewindow.history.quickInterval; subscriptionTimewindow.quickInterval = timewindow.history.quickInterval;
@ -451,7 +449,8 @@ export function createSubscriptionTimewindow(timewindow: Timewindow, stDiff: num
return subscriptionTimewindow; return subscriptionTimewindow;
} }
function getSubscriptionRealtimeWindowFromTimeInterval(interval: QuickTimeInterval, currentDate: moment_.Moment): number { function getSubscriptionRealtimeWindowFromTimeInterval(interval: QuickTimeInterval, tz?: string): number {
let currentDate;
switch (interval) { switch (interval) {
case QuickTimeInterval.CURRENT_HOUR: case QuickTimeInterval.CURRENT_HOUR:
return HOUR; return HOUR;
@ -465,99 +464,94 @@ function getSubscriptionRealtimeWindowFromTimeInterval(interval: QuickTimeInterv
return WEEK; return WEEK;
case QuickTimeInterval.CURRENT_MONTH: case QuickTimeInterval.CURRENT_MONTH:
case QuickTimeInterval.CURRENT_MONTH_SO_FAR: case QuickTimeInterval.CURRENT_MONTH_SO_FAR:
currentDate = getCurrentTime(tz);
return currentDate.endOf('month').diff(currentDate.clone().startOf('month')); return currentDate.endOf('month').diff(currentDate.clone().startOf('month'));
case QuickTimeInterval.CURRENT_YEAR: case QuickTimeInterval.CURRENT_YEAR:
case QuickTimeInterval.CURRENT_YEAR_SO_FAR: case QuickTimeInterval.CURRENT_YEAR_SO_FAR:
currentDate = getCurrentTime(tz);
return currentDate.endOf('year').diff(currentDate.clone().startOf('year')); return currentDate.endOf('year').diff(currentDate.clone().startOf('year'));
} }
} }
export function calculateIntervalEndTime(interval: QuickTimeInterval, currentDate: moment_.Moment = null, tz: string = ''): number { export function calculateIntervalStartEndTime(interval: QuickTimeInterval, tz?: string): [number, number] {
currentDate = currentDate ? currentDate.clone() : getCurrentTime(tz); const startEndTs: [number, number] = [0, 0];
switch (interval) { const currentDate = getCurrentTime(tz);
case QuickTimeInterval.YESTERDAY: const startDate = calculateIntervalStartTime(interval, currentDate);
currentDate.subtract(1, 'days'); startEndTs[0] = startDate.valueOf();
return currentDate.endOf('day').valueOf(); const endDate = calculateIntervalEndTime(interval, startDate, tz);
case QuickTimeInterval.DAY_BEFORE_YESTERDAY: startEndTs[1] = endDate.valueOf();
currentDate.subtract(2, 'days'); return startEndTs;
return currentDate.endOf('day').valueOf();
case QuickTimeInterval.THIS_DAY_LAST_WEEK:
currentDate.subtract(1, 'weeks');
return currentDate.endOf('day').valueOf();
case QuickTimeInterval.PREVIOUS_WEEK:
currentDate.subtract(1, 'weeks');
return currentDate.endOf('week').valueOf();
case QuickTimeInterval.PREVIOUS_WEEK_ISO:
currentDate.subtract(1, 'weeks');
return currentDate.endOf('isoWeek').valueOf();
case QuickTimeInterval.PREVIOUS_MONTH:
currentDate.subtract(1, 'months');
return currentDate.endOf('month').valueOf();
case QuickTimeInterval.PREVIOUS_YEAR:
currentDate.subtract(1, 'years');
return currentDate.endOf('year').valueOf();
case QuickTimeInterval.CURRENT_HOUR:
return currentDate.endOf('hour').valueOf();
case QuickTimeInterval.CURRENT_DAY:
return currentDate.endOf('day').valueOf();
case QuickTimeInterval.CURRENT_WEEK:
return currentDate.endOf('week').valueOf();
case QuickTimeInterval.CURRENT_WEEK_ISO:
return currentDate.endOf('isoWeek').valueOf();
case QuickTimeInterval.CURRENT_MONTH:
return currentDate.endOf('month').valueOf();
case QuickTimeInterval.CURRENT_YEAR:
return currentDate.endOf('year').valueOf();
case QuickTimeInterval.CURRENT_DAY_SO_FAR:
case QuickTimeInterval.CURRENT_WEEK_SO_FAR:
case QuickTimeInterval.CURRENT_WEEK_ISO_SO_FAR:
case QuickTimeInterval.CURRENT_MONTH_SO_FAR:
case QuickTimeInterval.CURRENT_YEAR_SO_FAR:
return currentDate.valueOf();
}
} }
export function calculateIntervalStartTime(interval: QuickTimeInterval, currentDate: moment_.Moment = null, tz: string = ''): number { export function calculateIntervalStartTime(interval: QuickTimeInterval, currentDate: moment_.Moment): moment_.Moment {
currentDate = currentDate ? currentDate.clone() : getCurrentTime(tz);
switch (interval) { switch (interval) {
case QuickTimeInterval.YESTERDAY: case QuickTimeInterval.YESTERDAY:
currentDate.subtract(1, 'days'); currentDate.subtract(1, 'days');
return currentDate.startOf('day').valueOf(); return currentDate.startOf('day');
case QuickTimeInterval.DAY_BEFORE_YESTERDAY: case QuickTimeInterval.DAY_BEFORE_YESTERDAY:
currentDate.subtract(2, 'days'); currentDate.subtract(2, 'days');
return currentDate.startOf('day').valueOf(); return currentDate.startOf('day');
case QuickTimeInterval.THIS_DAY_LAST_WEEK: case QuickTimeInterval.THIS_DAY_LAST_WEEK:
currentDate.subtract(1, 'weeks'); currentDate.subtract(1, 'weeks');
return currentDate.startOf('day').valueOf(); return currentDate.startOf('day');
case QuickTimeInterval.PREVIOUS_WEEK: case QuickTimeInterval.PREVIOUS_WEEK:
currentDate.subtract(1, 'weeks'); currentDate.subtract(1, 'weeks');
return currentDate.startOf('week').valueOf(); return currentDate.startOf('week');
case QuickTimeInterval.PREVIOUS_WEEK_ISO: case QuickTimeInterval.PREVIOUS_WEEK_ISO:
currentDate.subtract(1, 'weeks'); currentDate.subtract(1, 'weeks');
return currentDate.startOf('isoWeek').valueOf(); return currentDate.startOf('isoWeek');
case QuickTimeInterval.PREVIOUS_MONTH: case QuickTimeInterval.PREVIOUS_MONTH:
currentDate.subtract(1, 'months'); currentDate.subtract(1, 'months');
return currentDate.startOf('month').valueOf(); return currentDate.startOf('month');
case QuickTimeInterval.PREVIOUS_YEAR: case QuickTimeInterval.PREVIOUS_YEAR:
currentDate.subtract(1, 'years'); currentDate.subtract(1, 'years');
return currentDate.startOf('year').valueOf(); return currentDate.startOf('year');
case QuickTimeInterval.CURRENT_HOUR: case QuickTimeInterval.CURRENT_HOUR:
return currentDate.startOf('hour').valueOf(); return currentDate.startOf('hour');
case QuickTimeInterval.CURRENT_DAY: case QuickTimeInterval.CURRENT_DAY:
case QuickTimeInterval.CURRENT_DAY_SO_FAR: case QuickTimeInterval.CURRENT_DAY_SO_FAR:
return currentDate.startOf('day').valueOf(); return currentDate.startOf('day');
case QuickTimeInterval.CURRENT_WEEK: case QuickTimeInterval.CURRENT_WEEK:
case QuickTimeInterval.CURRENT_WEEK_SO_FAR: case QuickTimeInterval.CURRENT_WEEK_SO_FAR:
return currentDate.startOf('week').valueOf(); return currentDate.startOf('week');
case QuickTimeInterval.CURRENT_WEEK_ISO: case QuickTimeInterval.CURRENT_WEEK_ISO:
case QuickTimeInterval.CURRENT_WEEK_ISO_SO_FAR: case QuickTimeInterval.CURRENT_WEEK_ISO_SO_FAR:
return currentDate.startOf('isoWeek').valueOf(); return currentDate.startOf('isoWeek');
case QuickTimeInterval.CURRENT_MONTH: case QuickTimeInterval.CURRENT_MONTH:
case QuickTimeInterval.CURRENT_MONTH_SO_FAR: case QuickTimeInterval.CURRENT_MONTH_SO_FAR:
return currentDate.startOf('month').valueOf(); return currentDate.startOf('month');
case QuickTimeInterval.CURRENT_YEAR: case QuickTimeInterval.CURRENT_YEAR:
case QuickTimeInterval.CURRENT_YEAR_SO_FAR: case QuickTimeInterval.CURRENT_YEAR_SO_FAR:
return currentDate.startOf('year').valueOf(); return currentDate.startOf('year');
}
}
export function calculateIntervalEndTime(interval: QuickTimeInterval, startDate: moment_.Moment, tz?: string): number {
switch (interval) {
case QuickTimeInterval.YESTERDAY:
case QuickTimeInterval.DAY_BEFORE_YESTERDAY:
case QuickTimeInterval.THIS_DAY_LAST_WEEK:
case QuickTimeInterval.CURRENT_DAY:
return startDate.add(1, 'day').valueOf();
case QuickTimeInterval.PREVIOUS_WEEK:
case QuickTimeInterval.PREVIOUS_WEEK_ISO:
case QuickTimeInterval.CURRENT_WEEK:
case QuickTimeInterval.CURRENT_WEEK_ISO:
return startDate.add(1, 'week').valueOf();
case QuickTimeInterval.PREVIOUS_MONTH:
case QuickTimeInterval.CURRENT_MONTH:
return startDate.add(1, 'month').valueOf();
case QuickTimeInterval.PREVIOUS_YEAR:
case QuickTimeInterval.CURRENT_YEAR:
return startDate.add(1, 'year').valueOf();
case QuickTimeInterval.CURRENT_HOUR:
return startDate.add(1, 'hour').valueOf();
case QuickTimeInterval.CURRENT_DAY_SO_FAR:
case QuickTimeInterval.CURRENT_WEEK_SO_FAR:
case QuickTimeInterval.CURRENT_WEEK_ISO_SO_FAR:
case QuickTimeInterval.CURRENT_MONTH_SO_FAR:
case QuickTimeInterval.CURRENT_YEAR_SO_FAR:
return getCurrentTime(tz).valueOf();
} }
} }
@ -590,82 +584,58 @@ export function quickTimeIntervalPeriod(interval: QuickTimeInterval): number {
} }
export function calculateIntervalComparisonStartTime(interval: QuickTimeInterval, export function calculateIntervalComparisonStartTime(interval: QuickTimeInterval,
currentDate: moment_.Moment): number { startDate: moment_.Moment): moment_.Moment {
switch (interval) { switch (interval) {
case QuickTimeInterval.YESTERDAY: case QuickTimeInterval.YESTERDAY:
case QuickTimeInterval.DAY_BEFORE_YESTERDAY: case QuickTimeInterval.DAY_BEFORE_YESTERDAY:
case QuickTimeInterval.CURRENT_DAY: case QuickTimeInterval.CURRENT_DAY:
case QuickTimeInterval.CURRENT_DAY_SO_FAR: case QuickTimeInterval.CURRENT_DAY_SO_FAR:
currentDate.subtract(1, 'days'); startDate.subtract(1, 'days');
return currentDate.startOf('day').valueOf(); return startDate.startOf('day');
case QuickTimeInterval.THIS_DAY_LAST_WEEK: case QuickTimeInterval.THIS_DAY_LAST_WEEK:
currentDate.subtract(1, 'weeks'); startDate.subtract(1, 'weeks');
return currentDate.startOf('day').valueOf(); return startDate.startOf('day');
case QuickTimeInterval.PREVIOUS_WEEK: case QuickTimeInterval.PREVIOUS_WEEK:
case QuickTimeInterval.CURRENT_WEEK: case QuickTimeInterval.CURRENT_WEEK:
case QuickTimeInterval.CURRENT_WEEK_SO_FAR: case QuickTimeInterval.CURRENT_WEEK_SO_FAR:
currentDate.subtract(1, 'weeks'); startDate.subtract(1, 'weeks');
return currentDate.startOf('week').valueOf(); return startDate.startOf('week');
case QuickTimeInterval.PREVIOUS_WEEK_ISO: case QuickTimeInterval.PREVIOUS_WEEK_ISO:
case QuickTimeInterval.CURRENT_WEEK_ISO: case QuickTimeInterval.CURRENT_WEEK_ISO:
case QuickTimeInterval.CURRENT_WEEK_ISO_SO_FAR: case QuickTimeInterval.CURRENT_WEEK_ISO_SO_FAR:
currentDate.subtract(1, 'weeks'); startDate.subtract(1, 'weeks');
return currentDate.startOf('isoWeek').valueOf(); return startDate.startOf('isoWeek');
case QuickTimeInterval.PREVIOUS_MONTH: case QuickTimeInterval.PREVIOUS_MONTH:
case QuickTimeInterval.CURRENT_MONTH: case QuickTimeInterval.CURRENT_MONTH:
case QuickTimeInterval.CURRENT_MONTH_SO_FAR: case QuickTimeInterval.CURRENT_MONTH_SO_FAR:
currentDate.subtract(1, 'months'); startDate.subtract(1, 'months');
return currentDate.startOf('month').valueOf(); return startDate.startOf('month');
case QuickTimeInterval.PREVIOUS_YEAR: case QuickTimeInterval.PREVIOUS_YEAR:
case QuickTimeInterval.CURRENT_YEAR: case QuickTimeInterval.CURRENT_YEAR:
case QuickTimeInterval.CURRENT_YEAR_SO_FAR: case QuickTimeInterval.CURRENT_YEAR_SO_FAR:
currentDate.subtract(1, 'years'); startDate.subtract(1, 'years');
return currentDate.startOf('year').valueOf(); return startDate.startOf('year');
case QuickTimeInterval.CURRENT_HOUR: case QuickTimeInterval.CURRENT_HOUR:
currentDate.subtract(1, 'hour'); startDate.subtract(1, 'hour');
return currentDate.startOf('hour').valueOf(); return startDate.startOf('hour');
} }
} }
export function calculateIntervalComparisonEndTime(interval: QuickTimeInterval, export function calculateIntervalComparisonEndTime(interval: QuickTimeInterval,
currentDate: moment_.Moment): number { comparisonStartDate: moment_.Moment,
endDate: moment_.Moment): number {
switch (interval) { switch (interval) {
case QuickTimeInterval.YESTERDAY:
case QuickTimeInterval.DAY_BEFORE_YESTERDAY:
case QuickTimeInterval.CURRENT_DAY:
currentDate.subtract(1, 'days');
return currentDate.endOf('day').valueOf();
case QuickTimeInterval.CURRENT_DAY_SO_FAR: case QuickTimeInterval.CURRENT_DAY_SO_FAR:
return currentDate.subtract(1, 'days').valueOf(); return endDate.subtract(1, 'days').valueOf();
case QuickTimeInterval.THIS_DAY_LAST_WEEK:
currentDate.subtract(1, 'weeks');
return currentDate.endOf('day').valueOf();
case QuickTimeInterval.PREVIOUS_WEEK:
case QuickTimeInterval.CURRENT_WEEK:
currentDate.subtract(1, 'weeks');
return currentDate.endOf('week').valueOf();
case QuickTimeInterval.PREVIOUS_WEEK_ISO:
case QuickTimeInterval.CURRENT_WEEK_ISO:
currentDate.subtract(1, 'weeks');
return currentDate.endOf('isoWeek').valueOf();
case QuickTimeInterval.CURRENT_WEEK_SO_FAR: case QuickTimeInterval.CURRENT_WEEK_SO_FAR:
case QuickTimeInterval.CURRENT_WEEK_ISO_SO_FAR: case QuickTimeInterval.CURRENT_WEEK_ISO_SO_FAR:
return currentDate.subtract(1, 'week').valueOf(); return endDate.subtract(1, 'week').valueOf();
case QuickTimeInterval.PREVIOUS_MONTH:
case QuickTimeInterval.CURRENT_MONTH:
currentDate.subtract(1, 'months');
return currentDate.endOf('month').valueOf();
case QuickTimeInterval.CURRENT_MONTH_SO_FAR: case QuickTimeInterval.CURRENT_MONTH_SO_FAR:
return currentDate.subtract(1, 'month').valueOf(); return endDate.subtract(1, 'month').valueOf();
case QuickTimeInterval.PREVIOUS_YEAR:
case QuickTimeInterval.CURRENT_YEAR:
currentDate.subtract(1, 'years');
return currentDate.endOf('year').valueOf();
case QuickTimeInterval.CURRENT_YEAR_SO_FAR: case QuickTimeInterval.CURRENT_YEAR_SO_FAR:
return currentDate.subtract(1, 'year').valueOf(); return endDate.subtract(1, 'year').valueOf();
case QuickTimeInterval.CURRENT_HOUR: default:
currentDate.subtract(1, 'hour'); return calculateIntervalEndTime(interval, comparisonStartDate);
return currentDate.endOf('hour').valueOf();
} }
} }
@ -689,8 +659,9 @@ export function createTimewindowForComparison(subscriptionTimewindow: Subscripti
startDate.tz(subscriptionTimewindow.timezone); startDate.tz(subscriptionTimewindow.timezone);
endDate.tz(subscriptionTimewindow.timezone); endDate.tz(subscriptionTimewindow.timezone);
} }
startTimeMs = calculateIntervalComparisonStartTime(subscriptionTimewindow.quickInterval, startDate); const comparisonStartDate = calculateIntervalComparisonStartTime(subscriptionTimewindow.quickInterval, startDate);
endTimeMs = calculateIntervalComparisonEndTime(subscriptionTimewindow.quickInterval, endDate); startTimeMs = comparisonStartDate.valueOf();
endTimeMs = calculateIntervalComparisonEndTime(subscriptionTimewindow.quickInterval, comparisonStartDate, endDate);
} else { } else {
const timeInterval = subscriptionTimewindow.fixedWindow.endTimeMs - subscriptionTimewindow.fixedWindow.startTimeMs; const timeInterval = subscriptionTimewindow.fixedWindow.endTimeMs - subscriptionTimewindow.fixedWindow.startTimeMs;
endTimeMs = subscriptionTimewindow.fixedWindow.startTimeMs; endTimeMs = subscriptionTimewindow.fixedWindow.startTimeMs;
@ -730,22 +701,6 @@ export function cloneSelectedTimewindow(timewindow: Timewindow): Timewindow {
return cloned; return cloned;
} }
export function cloneSelectedHistoryTimewindow(historyWindow: HistoryWindow): HistoryWindow {
const cloned: HistoryWindow = {};
if (isDefined(historyWindow.historyType)) {
cloned.historyType = historyWindow.historyType;
cloned.interval = historyWindow.interval;
if (historyWindow.historyType === HistoryWindowType.LAST_INTERVAL) {
cloned.timewindowMs = historyWindow.timewindowMs;
} else if (historyWindow.historyType === HistoryWindowType.INTERVAL) {
cloned.quickInterval = historyWindow.quickInterval;
} else if (historyWindow.historyType === HistoryWindowType.FIXED) {
cloned.fixedTimewindow = deepClone(historyWindow.fixedTimewindow);
}
}
return cloned;
}
export interface TimeInterval { export interface TimeInterval {
name: string; name: string;
translateParams: {[key: string]: any}; translateParams: {[key: string]: any};
@ -927,6 +882,14 @@ export function getCurrentTime(tz?: string): moment_.Moment {
} }
} }
export function getTime(ts: number, tz?: string): moment_.Moment {
if (tz) {
return moment(ts).tz(tz);
} else {
return moment(ts);
}
}
export function getTimezone(tz: string): moment_.Moment { export function getTimezone(tz: string): moment_.Moment {
return moment.tz(tz); return moment.tz(tz);
} }