virool-pivot
Version:
A web-based exploratory visualization UI for Druid.io
89 lines (75 loc) • 2.94 kB
text/typescript
import { $, SortAction } from 'plywood';
import { List } from 'immutable';
import { Splits, DataSource, Resolve, SplitCombine, Colors, Dimension } from '../../../common/models/index';
import { CircumstancesHandler } from '../../../common/utils/circumstances-handler/circumstances-handler';
export default CircumstancesHandler.EMPTY()
.needsAtLeastOneSplit('The Bar Chart requires at least one split')
.when(CircumstancesHandler.areExactSplitKinds('*'))
.or(CircumstancesHandler.areExactSplitKinds('*', '*'))
.then((splits: Splits, dataSource: DataSource, colors: Colors, current: boolean) => {
var continuousBoost = 0;
// Auto adjustment
var autoChanged = false;
splits = splits.map((split: SplitCombine) => {
var splitDimension = dataSource.getDimensionByExpression(split.expression);
if (!split.sortAction) {
// Must sort boolean in deciding order!
if (splitDimension.kind === 'boolean') {
split = split.changeSortAction(new SortAction({
expression: $(splitDimension.name),
direction: SortAction.DESCENDING
}));
} else {
if (splitDimension.isContinuous()) {
split = split.changeSortAction(new SortAction({
expression: $(splitDimension.name),
direction: SortAction.ASCENDING
}));
} else {
split = split.changeSortAction(dataSource.getDefaultSortAction());
}
}
autoChanged = true;
} else if (splitDimension.isContinuous() && split.sortAction.refName() !== splitDimension.name) {
split = split.changeSortAction(new SortAction({
expression: $(splitDimension.name),
direction: split.sortAction.direction
}));
autoChanged = true;
}
if (splitDimension.isContinuous()) {
continuousBoost = 2;
}
// ToDo: review this
if (!split.limitAction && (autoChanged || splitDimension.kind !== 'time')) {
split = split.changeLimit(25);
autoChanged = true;
}
if (colors) {
colors = null;
autoChanged = true;
}
return split;
});
if (autoChanged) {
return Resolve.automatic(5 + continuousBoost, { splits });
}
return Resolve.ready(current ? 10 : (7 + continuousBoost));
})
.otherwise(
(splits: Splits, dataSource: DataSource) => {
let categoricalDimensions = dataSource.dimensions.filter((d) => d.kind !== 'time');
return Resolve.manual(
3,
'The Bar Chart needs one or two splits',
categoricalDimensions.toArray().slice(0, 2).map((dimension: Dimension) => {
return {
description: `Split on ${dimension.title} instead`,
adjustment: {
splits: Splits.fromSplitCombine(SplitCombine.fromExpression(dimension.expression))
}
};
})
);
}
);