virool-pivot
Version:
A web-based exploratory visualization UI for Druid.io
167 lines (137 loc) • 5.31 kB
text/typescript
import { $, SortAction } from 'plywood';
import { List } from 'immutable';
import { Splits, DataSource, Resolve, SplitCombine, Colors } from '../../../common/models/index';
import { CircumstancesHandler } from '../../../common/utils/circumstances-handler/circumstances-handler';
export default CircumstancesHandler.EMPTY()
.when((splits: Splits, dataSource: DataSource) => !dataSource.getDimensionByKind('time'))
.then(() => Resolve.NEVER)
.when(CircumstancesHandler.noSplits())
.then((splits: Splits, dataSource: DataSource) => {
let timeDimensions = dataSource.getDimensionByKind('time');
return Resolve.manual(3, 'This visualization requires a time split',
timeDimensions.toArray().map((timeDimension) => {
return {
description: `Add a split on ${timeDimension.title}`,
adjustment: {
splits: Splits.fromSplitCombine(SplitCombine.fromExpression(timeDimension.expression))
}
};
})
);
})
.when(CircumstancesHandler.areExactSplitKinds('time'))
.then((splits: Splits, dataSource: DataSource, colors: Colors) => {
var timeSplit = splits.get(0);
var timeDimension = timeSplit.getDimension(dataSource.dimensions);
var sortAction: SortAction = new SortAction({
expression: $(timeDimension.name),
direction: SortAction.ASCENDING
});
let autoChanged = false;
// Fix time sort
if (!sortAction.equals(timeSplit.sortAction)) {
timeSplit = timeSplit.changeSortAction(sortAction);
autoChanged = true;
}
// Fix time limit
if (timeSplit.limitAction) {
timeSplit = timeSplit.changeLimitAction(null);
autoChanged = true;
}
if (colors) {
autoChanged = true;
}
if (!autoChanged) return Resolve.ready(10);
return Resolve.automatic(8, {splits: new Splits(List([timeSplit]))});
})
.when(CircumstancesHandler.areExactSplitKinds('time', '*'))
.then((splits: Splits, dataSource: DataSource, colors: Colors) => {
var timeSplit = splits.get(0);
var timeDimension = timeSplit.getDimension(dataSource.dimensions);
var sortAction: SortAction = new SortAction({
expression: $(timeDimension.name),
direction: SortAction.ASCENDING
});
// Fix time sort
if (!sortAction.equals(timeSplit.sortAction)) {
timeSplit = timeSplit.changeSortAction(sortAction);
}
// Fix time limit
if (timeSplit.limitAction) {
timeSplit = timeSplit.changeLimitAction(null);
}
let colorSplit = splits.get(1);
if (!colorSplit.sortAction) {
colorSplit = colorSplit.changeSortAction(dataSource.getDefaultSortAction());
}
var colorSplitDimension = dataSource.getDimensionByExpression(colorSplit.expression);
if (!colors || colors.dimension !== colorSplitDimension.name) {
colors = Colors.fromLimit(colorSplitDimension.name, 5);
}
return Resolve.automatic(8, {
splits: new Splits(List([colorSplit, timeSplit])),
colors
});
})
.when(CircumstancesHandler.areExactSplitKinds('*', 'time'))
.then((splits: Splits, dataSource: DataSource, colors: Colors) => {
var timeSplit = splits.get(1);
var timeDimension = timeSplit.getDimension(dataSource.dimensions);
let autoChanged = false;
var sortAction: SortAction = new SortAction({
expression: $(timeDimension.name),
direction: SortAction.ASCENDING
});
// Fix time sort
if (!sortAction.equals(timeSplit.sortAction)) {
timeSplit = timeSplit.changeSortAction(sortAction);
autoChanged = true;
}
// Fix time limit
if (timeSplit.limitAction) {
timeSplit = timeSplit.changeLimitAction(null);
autoChanged = true;
}
let colorSplit = splits.get(0);
if (!colorSplit.sortAction) {
colorSplit = colorSplit.changeSortAction(dataSource.getDefaultSortAction());
autoChanged = true;
}
var colorSplitDimension = dataSource.getDimensionByExpression(colorSplit.expression);
if (!colors || colors.dimension !== colorSplitDimension.name) {
colors = Colors.fromLimit(colorSplitDimension.name, 5);
autoChanged = true;
}
if (!autoChanged) return Resolve.ready(10);
return Resolve.automatic(8, {
splits: new Splits(List([colorSplit, timeSplit])),
colors
});
})
.when(CircumstancesHandler.haveAtLeastSplitKinds('time'))
.then((splits: Splits, dataSource: DataSource) => {
let timeSplit = splits.toArray().filter((split) => split.getDimension(dataSource.dimensions).kind === 'time')[0];
return Resolve.manual(3, 'Too many splits', [
{
description: `Remove all but the time split`,
adjustment: {
splits: Splits.fromSplitCombine(timeSplit)
}
}
]);
})
.otherwise(
(splits: Splits, dataSource: DataSource) => {
let timeDimensions = dataSource.getDimensionByKind('time');
return Resolve.manual(3, 'The Time Series needs one time split',
timeDimensions.toArray().map((timeDimension) => {
return {
description: `Split on ${timeDimension.title} instead`,
adjustment: {
splits: Splits.fromSplitCombine(SplitCombine.fromExpression(timeDimension.expression))
}
};
})
);
}
);