Skip to content

Commit

Permalink
fix: Time dimension ResultSet backward compatibility to allow work ne…
Browse files Browse the repository at this point in the history
…wer client with old server

Fixes #356
  • Loading branch information
paveltiunov committed Jan 25, 2020
1 parent 7955727 commit b6834b1
Show file tree
Hide file tree
Showing 5 changed files with 189 additions and 20 deletions.
35 changes: 31 additions & 4 deletions packages/cubejs-client-core/dist/cubejs-client-core.esm.js
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ function () {
var allIncludedDimensions = pivotConfig.x.concat(pivotConfig.y);
var allDimensions = timeDimensions.map(function (td) {
return ResultSet.timeDimensionMember(td);
}).concat(query.dimensions);
}).concat(dimensions);
pivotConfig.x = pivotConfig.x.concat(allDimensions.filter(function (d) {
return allIncludedDimensions.indexOf(d) === -1;
}));
Expand Down Expand Up @@ -253,7 +253,7 @@ function () {
return row[ResultSet.timeDimensionMember(timeDimension)] && moment(row[ResultSet.timeDimensionMember(timeDimension)]);
}), filter(function (r) {
return !!r;
}))(this.loadResponse.data);
}))(this.timeDimensionBackwardCompatibleData());
dateRange = dates.length && [reduce(minBy(function (d) {
return d.toDate();
}), dates[0], dates), reduce(maxBy(function (d) {
Expand Down Expand Up @@ -328,7 +328,7 @@ function () {
row: row
};
});
}), unnest, groupByXAxis, toPairs)(this.loadResponse.data);
}), unnest, groupByXAxis, toPairs)(this.timeDimensionBackwardCompatibleData());
var allYValues = pipe(map( // eslint-disable-next-line no-unused-vars
function (_ref6) {
var _ref7 = _slicedToArray(_ref6, 2),
Expand Down Expand Up @@ -578,7 +578,7 @@ function () {
var _this5 = this;

pivotConfig = this.normalizePivotConfig(pivotConfig);
return pipe(map(this.axisValues(pivotConfig.y)), unnest, uniq)(this.loadResponse.data).map(function (axisValues) {
return pipe(map(this.axisValues(pivotConfig.y)), unnest, uniq)(this.timeDimensionBackwardCompatibleData()).map(function (axisValues) {
return {
title: _this5.axisValuesString(pivotConfig.y.find(function (d) {
return d === 'measures';
Expand All @@ -597,6 +597,33 @@ function () {
value: function rawData() {
return this.loadResponse.data;
}
}, {
key: "timeDimensionBackwardCompatibleData",
value: function timeDimensionBackwardCompatibleData() {
if (!this.backwardCompatibleData) {
var query = this.loadResponse.query;
var timeDimensions = (query.timeDimensions || []).filter(function (td) {
return !!td.granularity;
});
this.backwardCompatibleData = this.loadResponse.data.map(function (row) {
return _objectSpread({}, row, Object.keys(row).filter(function (field) {
return timeDimensions.find(function (d) {
return d.dimension === field;
}) && !row[ResultSet.timeDimensionMember(timeDimensions.find(function (d) {
return d.dimension === field;
}))];
}).map(function (field) {
return _defineProperty({}, ResultSet.timeDimensionMember(timeDimensions.find(function (d) {
return d.dimension === field;
})), row[field]);
}).reduce(function (a, b) {
return _objectSpread({}, a, b);
}, {}));
});
}

return this.backwardCompatibleData;
}
}], [{
key: "timeDimensionMember",
value: function timeDimensionMember(td) {
Expand Down
35 changes: 31 additions & 4 deletions packages/cubejs-client-core/dist/cubejs-client-core.js
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ function () {
var allIncludedDimensions = pivotConfig.x.concat(pivotConfig.y);
var allDimensions = timeDimensions.map(function (td) {
return ResultSet.timeDimensionMember(td);
}).concat(query.dimensions);
}).concat(dimensions);
pivotConfig.x = pivotConfig.x.concat(allDimensions.filter(function (d) {
return allIncludedDimensions.indexOf(d) === -1;
}));
Expand Down Expand Up @@ -259,7 +259,7 @@ function () {
return row[ResultSet.timeDimensionMember(timeDimension)] && moment(row[ResultSet.timeDimensionMember(timeDimension)]);
}), ramda.filter(function (r) {
return !!r;
}))(this.loadResponse.data);
}))(this.timeDimensionBackwardCompatibleData());
dateRange = dates.length && [ramda.reduce(ramda.minBy(function (d) {
return d.toDate();
}), dates[0], dates), ramda.reduce(ramda.maxBy(function (d) {
Expand Down Expand Up @@ -334,7 +334,7 @@ function () {
row: row
};
});
}), ramda.unnest, groupByXAxis, ramda.toPairs)(this.loadResponse.data);
}), ramda.unnest, groupByXAxis, ramda.toPairs)(this.timeDimensionBackwardCompatibleData());
var allYValues = ramda.pipe(ramda.map( // eslint-disable-next-line no-unused-vars
function (_ref6) {
var _ref7 = _slicedToArray(_ref6, 2),
Expand Down Expand Up @@ -584,7 +584,7 @@ function () {
var _this5 = this;

pivotConfig = this.normalizePivotConfig(pivotConfig);
return ramda.pipe(ramda.map(this.axisValues(pivotConfig.y)), ramda.unnest, ramda.uniq)(this.loadResponse.data).map(function (axisValues) {
return ramda.pipe(ramda.map(this.axisValues(pivotConfig.y)), ramda.unnest, ramda.uniq)(this.timeDimensionBackwardCompatibleData()).map(function (axisValues) {
return {
title: _this5.axisValuesString(pivotConfig.y.find(function (d) {
return d === 'measures';
Expand All @@ -603,6 +603,33 @@ function () {
value: function rawData() {
return this.loadResponse.data;
}
}, {
key: "timeDimensionBackwardCompatibleData",
value: function timeDimensionBackwardCompatibleData() {
if (!this.backwardCompatibleData) {
var query = this.loadResponse.query;
var timeDimensions = (query.timeDimensions || []).filter(function (td) {
return !!td.granularity;
});
this.backwardCompatibleData = this.loadResponse.data.map(function (row) {
return _objectSpread({}, row, Object.keys(row).filter(function (field) {
return timeDimensions.find(function (d) {
return d.dimension === field;
}) && !row[ResultSet.timeDimensionMember(timeDimensions.find(function (d) {
return d.dimension === field;
}))];
}).map(function (field) {
return _defineProperty({}, ResultSet.timeDimensionMember(timeDimensions.find(function (d) {
return d.dimension === field;
})), row[field]);
}).reduce(function (a, b) {
return _objectSpread({}, a, b);
}, {}));
});
}

return this.backwardCompatibleData;
}
}], [{
key: "timeDimensionMember",
value: function timeDimensionMember(td) {
Expand Down
39 changes: 33 additions & 6 deletions packages/cubejs-client-core/dist/cubejs-client-core.umd.js
Original file line number Diff line number Diff line change
Expand Up @@ -675,7 +675,7 @@
// Set @@toStringTag to native iterators
_setToStringTag(IteratorPrototype, TAG, true);
// fix for some old engines
if (!_library && typeof IteratorPrototype[ITERATOR] != 'function') _hide(IteratorPrototype, ITERATOR, returnThis);
if (typeof IteratorPrototype[ITERATOR] != 'function') _hide(IteratorPrototype, ITERATOR, returnThis);
}
}
// fix Array#{values, @@iterator}.name in V8 / FF
Expand All @@ -684,7 +684,7 @@
$default = function values() { return $native.call(this); };
}
// Define iterator
if ((!_library || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
if (BUGGY || VALUES_BUG || !proto[ITERATOR]) {
_hide(proto, ITERATOR, $default);
}
// Plug for library
Expand Down Expand Up @@ -12774,7 +12774,7 @@
var allIncludedDimensions = pivotConfig.x.concat(pivotConfig.y);
var allDimensions = timeDimensions.map(function (td) {
return ResultSet.timeDimensionMember(td);
}).concat(query.dimensions);
}).concat(dimensions);
pivotConfig.x = pivotConfig.x.concat(allDimensions.filter(function (d) {
return allIncludedDimensions.indexOf(d) === -1;
}));
Expand Down Expand Up @@ -12814,7 +12814,7 @@
return row[ResultSet.timeDimensionMember(timeDimension)] && moment$1(row[ResultSet.timeDimensionMember(timeDimension)]);
}), filter(function (r) {
return !!r;
}))(this.loadResponse.data);
}))(this.timeDimensionBackwardCompatibleData());
dateRange = dates.length && [reduce(minBy(function (d) {
return d.toDate();
}), dates[0], dates), reduce(maxBy(function (d) {
Expand Down Expand Up @@ -12889,7 +12889,7 @@
row: row
};
});
}), unnest, groupByXAxis, toPairs)(this.loadResponse.data);
}), unnest, groupByXAxis, toPairs)(this.timeDimensionBackwardCompatibleData());
var allYValues = pipe(map( // eslint-disable-next-line no-unused-vars
function (_ref6) {
var _ref7 = _slicedToArray(_ref6, 2),
Expand Down Expand Up @@ -13139,7 +13139,7 @@
var _this5 = this;

pivotConfig = this.normalizePivotConfig(pivotConfig);
return pipe(map(this.axisValues(pivotConfig.y)), unnest, uniq)(this.loadResponse.data).map(function (axisValues) {
return pipe(map(this.axisValues(pivotConfig.y)), unnest, uniq)(this.timeDimensionBackwardCompatibleData()).map(function (axisValues) {
return {
title: _this5.axisValuesString(pivotConfig.y.find(function (d) {
return d === 'measures';
Expand All @@ -13158,6 +13158,33 @@
value: function rawData() {
return this.loadResponse.data;
}
}, {
key: "timeDimensionBackwardCompatibleData",
value: function timeDimensionBackwardCompatibleData() {
if (!this.backwardCompatibleData) {
var query = this.loadResponse.query;
var timeDimensions = (query.timeDimensions || []).filter(function (td) {
return !!td.granularity;
});
this.backwardCompatibleData = this.loadResponse.data.map(function (row) {
return _objectSpread({}, row, Object.keys(row).filter(function (field) {
return timeDimensions.find(function (d) {
return d.dimension === field;
}) && !row[ResultSet.timeDimensionMember(timeDimensions.find(function (d) {
return d.dimension === field;
}))];
}).map(function (field) {
return _defineProperty({}, ResultSet.timeDimensionMember(timeDimensions.find(function (d) {
return d.dimension === field;
})), row[field]);
}).reduce(function (a, b) {
return _objectSpread({}, a, b);
}, {}));
});
}

return this.backwardCompatibleData;
}
}], [{
key: "timeDimensionMember",
value: function timeDimensionMember(td) {
Expand Down
38 changes: 32 additions & 6 deletions packages/cubejs-client-core/src/ResultSet.js
Original file line number Diff line number Diff line change
Expand Up @@ -117,8 +117,10 @@ class ResultSet {

const substituteTimeDimensionMembers = axis => axis.map(
subDim => (
timeDimensions.find(td => td.dimension === subDim) &&
!dimensions.find(d => d === subDim) ?
(
timeDimensions.find(td => td.dimension === subDim) &&
!dimensions.find(d => d === subDim)
) ?
ResultSet.timeDimensionMember(query.timeDimensions.find(td => td.dimension === subDim)) :
subDim
)
Expand All @@ -128,7 +130,7 @@ class ResultSet {
pivotConfig.y = substituteTimeDimensionMembers(pivotConfig.y || []);

const allIncludedDimensions = pivotConfig.x.concat(pivotConfig.y);
const allDimensions = timeDimensions.map(td => ResultSet.timeDimensionMember(td)).concat(query.dimensions);
const allDimensions = timeDimensions.map(td => ResultSet.timeDimensionMember(td)).concat(dimensions);
pivotConfig.x = pivotConfig.x.concat(allDimensions.filter(d => allIncludedDimensions.indexOf(d) === -1));
if (!pivotConfig.x.concat(pivotConfig.y).find(d => d === 'measures')) {
pivotConfig.y = pivotConfig.y.concat(['measures']);
Expand Down Expand Up @@ -159,7 +161,7 @@ class ResultSet {
moment(row[ResultSet.timeDimensionMember(timeDimension)])
),
filter(r => !!r)
)(this.loadResponse.data);
)(this.timeDimensionBackwardCompatibleData());

dateRange = dates.length && [
reduce(minBy(d => d.toDate()), dates[0], dates),
Expand Down Expand Up @@ -217,7 +219,7 @@ class ResultSet {
unnest,
groupByXAxis,
toPairs
)(this.loadResponse.data);
)(this.timeDimensionBackwardCompatibleData());

const allYValues = pipe(
map(
Expand Down Expand Up @@ -413,7 +415,9 @@ class ResultSet {
*/
seriesNames(pivotConfig) {
pivotConfig = this.normalizePivotConfig(pivotConfig);
return pipe(map(this.axisValues(pivotConfig.y)), unnest, uniq)(this.loadResponse.data).map(axisValues => ({
return pipe(map(this.axisValues(pivotConfig.y)), unnest, uniq)(
this.timeDimensionBackwardCompatibleData()
).map(axisValues => ({
title: this.axisValuesString(pivotConfig.y.find(d => d === 'measures') ?
dropLast(1, axisValues)
.concat(this.loadResponse.annotation.measures[ResultSet.measureFromAxis(axisValues)].title) :
Expand All @@ -429,6 +433,28 @@ class ResultSet {
rawData() {
return this.loadResponse.data;
}

timeDimensionBackwardCompatibleData() {
if (!this.backwardCompatibleData) {
const { query } = this.loadResponse;
const timeDimensions = (query.timeDimensions || []).filter(td => !!td.granularity);
this.backwardCompatibleData = this.loadResponse.data.map(row => (
{
...row,
...(
Object.keys(row)
.filter(
field => timeDimensions.find(d => d.dimension === field) &&
!row[ResultSet.timeDimensionMember(timeDimensions.find(d => d.dimension === field))]
).map(field => ({
[ResultSet.timeDimensionMember(timeDimensions.find(d => d.dimension === field))]: row[field]
})).reduce((a, b) => ({ ...a, ...b }), {})
)
}
));
}
return this.backwardCompatibleData;
}
}

export default ResultSet;
62 changes: 62 additions & 0 deletions packages/cubejs-client-core/src/ResultSet.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,27 @@ describe('ResultSet', () => {
});
});

test('single time dimensions with granularity', () => {
const resultSet = new ResultSet({
"query": {
"measures": [],
"timeDimensions": [{
"dimension": "Orders.createdAt",
"granularity": "day",
"dateRange": ["2020-01-08T00:00:00.000", "2020-01-09T23:59:59.999"]
}],
"filters": [],
"timezone": "UTC"
}
});

expect(resultSet.normalizePivotConfig(resultSet.normalizePivotConfig())).toEqual({
x: ['Orders.createdAt.day'],
y: [],
fillMissingDates: true
});
});

test('double time dimensions with granularity', () => {
const resultSet = new ResultSet({
"query": {
Expand Down Expand Up @@ -459,6 +480,47 @@ describe('ResultSet', () => {
}]);
});

test('time dimension backward compatibility', () => {
const resultSet = new ResultSet({
"query": {
"measures": [],
"timeDimensions": [{
"dimension": "Orders.createdAt",
"granularity": "day",
"dateRange": ["2020-01-08T00:00:00.000", "2020-01-09T23:59:59.999"]
}],
"filters": [],
"timezone": "UTC"
},
"data": [{
"Orders.createdAt": "2020-01-08T00:00:00.000"
}, {
"Orders.createdAt": "2020-01-09T00:00:00.000"
}],
"annotation": {
"measures": {},
"dimensions": {},
"segments": {},
"timeDimensions": {
"Orders.createdAt": {
"title": "Orders Created at",
"shortTitle": "Created at",
"type": "time"
}
}
}
});

expect(resultSet.tablePivot()).toEqual([
{
"Orders.createdAt.day": "2020-01-08T00:00:00.000",
},
{
"Orders.createdAt.day": "2020-01-09T00:00:00.000",
}
]);
});

test('same dimension and time dimension without granularity', () => {
const resultSet = new ResultSet({
"query": {
Expand Down

0 comments on commit b6834b1

Please sign in to comment.