virool-pivot
Version:
A web-based exploratory visualization UI for Druid.io
346 lines (257 loc) • 13.7 kB
text/typescript
import { expect } from "chai";
import { immutableArraysEqual } from "immutable-class";
import { Duration } from "chronoshift";
import { Granularity, granularityFromJS, granularityEquals, granularityToString, updateBucketSize, getGranularities, getDefaultGranularityForKind, getBestBucketUnitForRange } from "./granularity";
import { TimeBucketAction, NumberBucketAction, TimeRange, NumberRange } from "plywood";
var { WallTime } = require('chronoshift');
if (!WallTime.rules) {
var tzData = require("chronoshift/lib/walltime/walltime-data.js");
WallTime.init(tzData.rules, tzData.zones);
}
describe('Granularity', () => {
it('fromJSes appropriately', () => {
var timeBucketAction1 = granularityFromJS({
action: 'timeBucket',
duration: 'P1W',
timezone: 'America/Tijuana'
});
expect(timeBucketAction1 instanceof TimeBucketAction).to.equal(true);
expect((timeBucketAction1 as TimeBucketAction).timezone.toString()).to.equal('America/Tijuana');
expect((timeBucketAction1 as TimeBucketAction).duration).to.deep.equal(Duration.fromJS('P1W'));
var timeBucketAction2 = granularityFromJS('PT1H');
expect(timeBucketAction2 instanceof TimeBucketAction).to.equal(true);
expect((timeBucketAction2 as TimeBucketAction).timezone).to.equal(undefined);
expect((timeBucketAction2 as TimeBucketAction).duration).to.deep.equal(Duration.fromJS('PT1H'));
var numberBucketAction1 = granularityFromJS({
action: 'numberBucket',
size: 5,
offset: 1
});
expect(numberBucketAction1 instanceof NumberBucketAction).to.equal(true);
expect((numberBucketAction1 as NumberBucketAction).size).to.equal(5);
expect((numberBucketAction1 as NumberBucketAction).offset).to.equal(1);
var numberBucketAction2 = granularityFromJS(5);
expect(numberBucketAction2 instanceof NumberBucketAction).to.equal(true);
expect((numberBucketAction2 as NumberBucketAction).size).to.equal(5);
expect((numberBucketAction2 as NumberBucketAction).offset).to.equal(0);
});
it('to strings appropriately', () => {
var timeBucketAction1 = granularityFromJS({
action: 'timeBucket',
duration: 'P1W',
timezone: 'America/Tijuana'
});
var timeBucketAction2 = granularityFromJS({
action: 'timeBucket',
duration: 'P1W',
timezone: 'America/Tijuana'
});
var timeBucketAction3 = granularityFromJS({
action: 'timeBucket',
duration: 'P1W',
timezone: 'Asia/Kathmandu'
});
var timeBucketAction4 = granularityFromJS({
action: 'timeBucket',
duration: 'P1D',
timezone: 'Asia/Kathmandu'
});
expect(granularityToString(timeBucketAction1)).to.equal('P1W');
expect(granularityToString(timeBucketAction2)).to.equal('P1W');
expect(granularityToString(timeBucketAction3)).to.equal('P1W');
expect(granularityToString(timeBucketAction4)).to.equal('P1D');
var numberBucketAction1 = granularityFromJS({
action: 'numberBucket',
size: 5,
offset: 1
});
var numberBucketAction2 = granularityFromJS({
action: 'numberBucket',
size: 5,
offset: 1
});
var numberBucketAction3 = granularityFromJS({
action: 'numberBucket',
size: 300000
});
var numberBucketAction4 = granularityFromJS(2);
expect(granularityToString(numberBucketAction1)).to.equal('5');
expect(granularityToString(numberBucketAction2)).to.equal('5');
expect(granularityToString(numberBucketAction3)).to.equal('300000');
expect(granularityToString(numberBucketAction4)).to.equal('2');
});
it('equals appropriately', () => {
var timeBucketAction1 = granularityFromJS({
action: 'timeBucket',
duration: 'P1W',
timezone: 'America/Tijuana'
});
var timeBucketAction2 = granularityFromJS({
action: 'timeBucket',
duration: 'P1W',
timezone: 'America/Tijuana'
});
var timeBucketAction3 = granularityFromJS({
action: 'timeBucket',
duration: 'P1W',
timezone: 'Asia/Kathmandu'
});
var timeBucketAction4 = granularityFromJS({
action: 'timeBucket',
duration: 'P1D',
timezone: 'Asia/Kathmandu'
});
expect(granularityEquals(timeBucketAction1, timeBucketAction2)).to.equal(true);
expect(granularityEquals(timeBucketAction2, timeBucketAction3)).to.equal(false);
expect(granularityEquals(timeBucketAction3, timeBucketAction4)).to.equal(false);
var numberBucketAction1 = granularityFromJS({
action: 'numberBucket',
size: 5,
offset: 1
});
var numberBucketAction2 = granularityFromJS({
action: 'numberBucket',
size: 5,
offset: 1
});
var numberBucketAction3 = granularityFromJS({
action: 'numberBucket',
size: 5
});
var numberBucketAction4 = granularityFromJS(5);
expect(granularityEquals(numberBucketAction1, numberBucketAction2)).to.equal(true);
expect(granularityEquals(numberBucketAction2, numberBucketAction3)).to.equal(false);
expect(granularityEquals(numberBucketAction3, numberBucketAction4)).to.equal(true);
});
it('updatesBucketSize appropriately, preserves original non size properties', () => {
var numberBucketAction1 = granularityFromJS({
action: 'numberBucket',
size: 5,
offset: 1
});
var numberBucketAction2 = granularityFromJS({
action: 'numberBucket',
size: 10,
offset: 0
});
var numberBucketAction3 = granularityFromJS({
action: 'numberBucket',
size: 10,
offset: 1
});
expect(granularityEquals(updateBucketSize(numberBucketAction1, numberBucketAction2), numberBucketAction3)).to.equal(true);
var timeBucketAction1 = granularityFromJS({
action: 'timeBucket',
duration: 'P1W',
timezone: 'America/Tijuana'
});
var timeBucketAction2 = granularityFromJS({
action: 'timeBucket',
duration: 'P1M',
timezone: null
});
var timeBucketAction3 = granularityFromJS({
action: 'timeBucket',
duration: 'P1M',
timezone: 'America/Tijuana'
});
expect(granularityEquals(updateBucketSize(timeBucketAction1, timeBucketAction2), timeBucketAction3)).to.equal(true);
});
it('getGranularities appropriately for time', () => {
var defaults = getGranularities('time');
var expectedDefaults = ['P1W', 'P1D', 'PT1H', 'PT5M', 'PT1M'].map(granularityFromJS);
expect(immutableArraysEqual(defaults, expectedDefaults), 'time defaults are returned').to.equal(true);
var coarse = getGranularities('time', null, true);
var expectedCoarseDefaults = ['P1M', 'P1W', 'P1D', 'PT12H', 'PT6H', 'PT1H', 'PT5M', 'PT1M'].map(granularityFromJS);
expect(immutableArraysEqual(coarse, expectedCoarseDefaults), 'coarse time defaults are returned').to.equal(true);
var bucketedBy = getGranularities('time', granularityFromJS('PT12H'), false);
var expectedDefaults = ['PT12H', 'P1D', 'P1W', 'P1M', 'P3M'].map(granularityFromJS);
expect(immutableArraysEqual(bucketedBy, expectedDefaults), 'bucketed by returns larger granularities').to.equal(true);
});
it('getGranularities appropriately for number', () => {
var defaults = getGranularities('number');
var expectedDefaults = [0.1, 1, 10, 100, 1000].map(granularityFromJS);
expect(immutableArraysEqual(defaults, expectedDefaults), 'number defaults are returned').to.equal(true);
var bucketedBy = getGranularities('number', granularityFromJS(100), false);
var expectedGrans = [100, 500, 1000, 5000, 10000].map(granularityFromJS);
expect(immutableArraysEqual(bucketedBy, expectedGrans), 'bucketed by returns larger granularities').to.equal(true);
});
it('getDefaultGranularityForKind appropriately for number', () => {
var defaultNumber = getDefaultGranularityForKind('number');
var expected = granularityFromJS(10);
expect(granularityEquals(defaultNumber, expected)).to.equal(true);
var bucketedBy = getDefaultGranularityForKind('number', granularityFromJS(50));
expected = granularityFromJS(50);
expect(granularityEquals(bucketedBy, expected), 'default will bucket by provided bucketedBy amount').to.equal(true);
var customGrans = getDefaultGranularityForKind('number', null, [100, 500, 1000, 5000, 10000].map(granularityFromJS));
expected = granularityFromJS(1000);
expect(granularityEquals(customGrans, expected), 'default will bucket according to provided customs').to.equal(true);
});
it('getDefaultGranularityForKind appropriately for time', () => {
var defaultNumber = getDefaultGranularityForKind('time');
var expected = granularityFromJS('P1D');
expect(granularityEquals(defaultNumber, expected)).to.equal(true);
var bucketedBy = getDefaultGranularityForKind('time', granularityFromJS('P1W'));
expected = granularityFromJS('P1W');
expect(granularityEquals(bucketedBy, expected), 'default will bucket by provided bucketedBy amount').to.equal(true);
var customGrans = getDefaultGranularityForKind('time', null, ['PT1H', 'PT8H', 'PT12H', 'P1D', 'P1W'].map(granularityFromJS));
expected = granularityFromJS('PT12H');
expect(granularityEquals(customGrans, expected), 'default will bucket according to provided customs').to.equal(true);
});
it('getsBestBucketUnit appropriately for time defaults depending on coarse flag', () => {
var month = 'P1M';
var week = 'P1W';
var day = 'P1D';
var twelveHours = 'PT12H';
var sixHours = 'PT6H';
var oneHour = 'PT1H';
var fiveMinutes = 'PT5M';
var oneMinute = 'PT1M';
var yearLength = new TimeRange({ start: new Date('1994-02-24T00:00:00.000Z'), end: new Date('1995-02-25T00:00:00.000Z') });
expect(getBestBucketUnitForRange(yearLength, false).toString()).to.equal(week);
expect(getBestBucketUnitForRange(yearLength, true).toString()).to.equal(month);
var monthLength = new TimeRange({ start: new Date('1995-02-24T00:00:00.000Z'), end: new Date('1995-03-25T00:00:00.000Z') });
expect(getBestBucketUnitForRange(monthLength, false).toString()).to.equal(day);
expect(getBestBucketUnitForRange(monthLength, true).toString()).to.equal(week);
var sevenDaysLength = new TimeRange({ start: new Date('1995-02-20T00:00:00.000Z'), end: new Date('1995-02-28T00:00:00.000Z') });
expect(getBestBucketUnitForRange(sevenDaysLength, false).toString()).to.equal(oneHour);
expect(getBestBucketUnitForRange(sevenDaysLength, true).toString()).to.equal(day);
var threeDaysLength = new TimeRange({ start: new Date('1995-02-20T00:00:00.000Z'), end: new Date('1995-02-24T00:00:00.000Z') });
expect(getBestBucketUnitForRange(sevenDaysLength, false).toString()).to.equal(oneHour);
expect(getBestBucketUnitForRange(threeDaysLength, true).toString()).to.equal(twelveHours);
var dayLength = new TimeRange({ start: new Date('1995-02-24T00:00:00.000Z'), end: new Date('1995-02-25T00:00:00.000Z') });
expect(getBestBucketUnitForRange(dayLength, false).toString()).to.equal(oneHour);
expect(getBestBucketUnitForRange(dayLength, true).toString()).to.equal(sixHours);
var fourHours = new TimeRange({ start: new Date('1995-02-24T00:00:00.000Z'), end: new Date('1995-02-24T04:00:00.000Z') });
expect(getBestBucketUnitForRange(fourHours, false).toString()).to.equal(fiveMinutes);
expect(getBestBucketUnitForRange(fourHours, true).toString()).to.equal(oneHour);
var fortyFiveMin = new TimeRange({ start: new Date('1995-02-24T00:00:00.000Z'), end: new Date('1995-02-24T00:45:00.000Z') });
expect(getBestBucketUnitForRange(fortyFiveMin, false).toString()).to.equal(oneMinute);
expect(getBestBucketUnitForRange(fortyFiveMin, true).toString()).to.equal(fiveMinutes);
});
it('getsBestBucketUnit appropriately for time with bucketing and custom granularities', () => {
var sixHours = 'PT6H';
var oneHour = 'PT1H';
var week = 'P1W';
var dayLength = new TimeRange({ start: new Date('1995-02-24T00:00:00.000Z'), end: new Date('1995-02-25T00:00:00.000Z') });
expect(getBestBucketUnitForRange(dayLength, false).toString()).to.equal(oneHour);
expect(getBestBucketUnitForRange(dayLength, false, granularityFromJS('PT6H')).toString()).to.equal(sixHours);
var yearLength = new TimeRange({ start: new Date('1994-02-24T00:00:00.000Z'), end: new Date('1995-02-25T00:00:00.000Z') });
expect(getBestBucketUnitForRange(yearLength, false, granularityFromJS('PT6H')).toString()).to.equal(week);
var customs = ['PT1H', 'PT8H', 'PT12H', 'P1D', 'P1W'].map(granularityFromJS);
expect(getBestBucketUnitForRange(dayLength, false, null, customs).toString()).to.equal(oneHour);
var fortyFiveMin = new TimeRange({ start: new Date('1995-02-24T00:00:00.000Z'), end: new Date('1995-02-24T00:45:00.000Z') });
expect(getBestBucketUnitForRange(fortyFiveMin, false, null, customs).toString()).to.equal(oneHour);
});
it('getsBestBucketUnit appropriately for number defaults with bucketing and custom granularities', () => {
var ten = new NumberRange({ start: 0, end: 10 });
var thirtyOne = new NumberRange({ start: 0, end: 31 });
var hundred = new NumberRange({ start: 0, end: 100 });
expect(getBestBucketUnitForRange(ten, false)).to.equal(1);
expect(getBestBucketUnitForRange(thirtyOne, false)).to.equal(10);
expect(getBestBucketUnitForRange(hundred, false)).to.equal(10);
expect(getBestBucketUnitForRange(hundred, false, granularityFromJS(50))).to.equal(50);
var customs = [-5, 0.25, 0.5, 0.78, 5].map(granularityFromJS);
expect(getBestBucketUnitForRange(ten, false, null, customs)).to.equal(5);
});
});