Skip to content

Commit b6834b1

Browse files
committed
fix: Time dimension ResultSet backward compatibility to allow work newer client with old server
Fixes #356
1 parent 7955727 commit b6834b1

File tree

5 files changed

+189
-20
lines changed

5 files changed

+189
-20
lines changed

packages/cubejs-client-core/dist/cubejs-client-core.esm.js

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ function () {
213213
var allIncludedDimensions = pivotConfig.x.concat(pivotConfig.y);
214214
var allDimensions = timeDimensions.map(function (td) {
215215
return ResultSet.timeDimensionMember(td);
216-
}).concat(query.dimensions);
216+
}).concat(dimensions);
217217
pivotConfig.x = pivotConfig.x.concat(allDimensions.filter(function (d) {
218218
return allIncludedDimensions.indexOf(d) === -1;
219219
}));
@@ -253,7 +253,7 @@ function () {
253253
return row[ResultSet.timeDimensionMember(timeDimension)] && moment(row[ResultSet.timeDimensionMember(timeDimension)]);
254254
}), filter(function (r) {
255255
return !!r;
256-
}))(this.loadResponse.data);
256+
}))(this.timeDimensionBackwardCompatibleData());
257257
dateRange = dates.length && [reduce(minBy(function (d) {
258258
return d.toDate();
259259
}), dates[0], dates), reduce(maxBy(function (d) {
@@ -328,7 +328,7 @@ function () {
328328
row: row
329329
};
330330
});
331-
}), unnest, groupByXAxis, toPairs)(this.loadResponse.data);
331+
}), unnest, groupByXAxis, toPairs)(this.timeDimensionBackwardCompatibleData());
332332
var allYValues = pipe(map( // eslint-disable-next-line no-unused-vars
333333
function (_ref6) {
334334
var _ref7 = _slicedToArray(_ref6, 2),
@@ -578,7 +578,7 @@ function () {
578578
var _this5 = this;
579579

580580
pivotConfig = this.normalizePivotConfig(pivotConfig);
581-
return pipe(map(this.axisValues(pivotConfig.y)), unnest, uniq)(this.loadResponse.data).map(function (axisValues) {
581+
return pipe(map(this.axisValues(pivotConfig.y)), unnest, uniq)(this.timeDimensionBackwardCompatibleData()).map(function (axisValues) {
582582
return {
583583
title: _this5.axisValuesString(pivotConfig.y.find(function (d) {
584584
return d === 'measures';
@@ -597,6 +597,33 @@ function () {
597597
value: function rawData() {
598598
return this.loadResponse.data;
599599
}
600+
}, {
601+
key: "timeDimensionBackwardCompatibleData",
602+
value: function timeDimensionBackwardCompatibleData() {
603+
if (!this.backwardCompatibleData) {
604+
var query = this.loadResponse.query;
605+
var timeDimensions = (query.timeDimensions || []).filter(function (td) {
606+
return !!td.granularity;
607+
});
608+
this.backwardCompatibleData = this.loadResponse.data.map(function (row) {
609+
return _objectSpread({}, row, Object.keys(row).filter(function (field) {
610+
return timeDimensions.find(function (d) {
611+
return d.dimension === field;
612+
}) && !row[ResultSet.timeDimensionMember(timeDimensions.find(function (d) {
613+
return d.dimension === field;
614+
}))];
615+
}).map(function (field) {
616+
return _defineProperty({}, ResultSet.timeDimensionMember(timeDimensions.find(function (d) {
617+
return d.dimension === field;
618+
})), row[field]);
619+
}).reduce(function (a, b) {
620+
return _objectSpread({}, a, b);
621+
}, {}));
622+
});
623+
}
624+
625+
return this.backwardCompatibleData;
626+
}
600627
}], [{
601628
key: "timeDimensionMember",
602629
value: function timeDimensionMember(td) {

packages/cubejs-client-core/dist/cubejs-client-core.js

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ function () {
219219
var allIncludedDimensions = pivotConfig.x.concat(pivotConfig.y);
220220
var allDimensions = timeDimensions.map(function (td) {
221221
return ResultSet.timeDimensionMember(td);
222-
}).concat(query.dimensions);
222+
}).concat(dimensions);
223223
pivotConfig.x = pivotConfig.x.concat(allDimensions.filter(function (d) {
224224
return allIncludedDimensions.indexOf(d) === -1;
225225
}));
@@ -259,7 +259,7 @@ function () {
259259
return row[ResultSet.timeDimensionMember(timeDimension)] && moment(row[ResultSet.timeDimensionMember(timeDimension)]);
260260
}), ramda.filter(function (r) {
261261
return !!r;
262-
}))(this.loadResponse.data);
262+
}))(this.timeDimensionBackwardCompatibleData());
263263
dateRange = dates.length && [ramda.reduce(ramda.minBy(function (d) {
264264
return d.toDate();
265265
}), dates[0], dates), ramda.reduce(ramda.maxBy(function (d) {
@@ -334,7 +334,7 @@ function () {
334334
row: row
335335
};
336336
});
337-
}), ramda.unnest, groupByXAxis, ramda.toPairs)(this.loadResponse.data);
337+
}), ramda.unnest, groupByXAxis, ramda.toPairs)(this.timeDimensionBackwardCompatibleData());
338338
var allYValues = ramda.pipe(ramda.map( // eslint-disable-next-line no-unused-vars
339339
function (_ref6) {
340340
var _ref7 = _slicedToArray(_ref6, 2),
@@ -584,7 +584,7 @@ function () {
584584
var _this5 = this;
585585

586586
pivotConfig = this.normalizePivotConfig(pivotConfig);
587-
return ramda.pipe(ramda.map(this.axisValues(pivotConfig.y)), ramda.unnest, ramda.uniq)(this.loadResponse.data).map(function (axisValues) {
587+
return ramda.pipe(ramda.map(this.axisValues(pivotConfig.y)), ramda.unnest, ramda.uniq)(this.timeDimensionBackwardCompatibleData()).map(function (axisValues) {
588588
return {
589589
title: _this5.axisValuesString(pivotConfig.y.find(function (d) {
590590
return d === 'measures';
@@ -603,6 +603,33 @@ function () {
603603
value: function rawData() {
604604
return this.loadResponse.data;
605605
}
606+
}, {
607+
key: "timeDimensionBackwardCompatibleData",
608+
value: function timeDimensionBackwardCompatibleData() {
609+
if (!this.backwardCompatibleData) {
610+
var query = this.loadResponse.query;
611+
var timeDimensions = (query.timeDimensions || []).filter(function (td) {
612+
return !!td.granularity;
613+
});
614+
this.backwardCompatibleData = this.loadResponse.data.map(function (row) {
615+
return _objectSpread({}, row, Object.keys(row).filter(function (field) {
616+
return timeDimensions.find(function (d) {
617+
return d.dimension === field;
618+
}) && !row[ResultSet.timeDimensionMember(timeDimensions.find(function (d) {
619+
return d.dimension === field;
620+
}))];
621+
}).map(function (field) {
622+
return _defineProperty({}, ResultSet.timeDimensionMember(timeDimensions.find(function (d) {
623+
return d.dimension === field;
624+
})), row[field]);
625+
}).reduce(function (a, b) {
626+
return _objectSpread({}, a, b);
627+
}, {}));
628+
});
629+
}
630+
631+
return this.backwardCompatibleData;
632+
}
606633
}], [{
607634
key: "timeDimensionMember",
608635
value: function timeDimensionMember(td) {

packages/cubejs-client-core/dist/cubejs-client-core.umd.js

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -675,7 +675,7 @@
675675
// Set @@toStringTag to native iterators
676676
_setToStringTag(IteratorPrototype, TAG, true);
677677
// fix for some old engines
678-
if (!_library && typeof IteratorPrototype[ITERATOR] != 'function') _hide(IteratorPrototype, ITERATOR, returnThis);
678+
if (typeof IteratorPrototype[ITERATOR] != 'function') _hide(IteratorPrototype, ITERATOR, returnThis);
679679
}
680680
}
681681
// fix Array#{values, @@iterator}.name in V8 / FF
@@ -684,7 +684,7 @@
684684
$default = function values() { return $native.call(this); };
685685
}
686686
// Define iterator
687-
if ((!_library || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
687+
if (BUGGY || VALUES_BUG || !proto[ITERATOR]) {
688688
_hide(proto, ITERATOR, $default);
689689
}
690690
// Plug for library
@@ -12774,7 +12774,7 @@
1277412774
var allIncludedDimensions = pivotConfig.x.concat(pivotConfig.y);
1277512775
var allDimensions = timeDimensions.map(function (td) {
1277612776
return ResultSet.timeDimensionMember(td);
12777-
}).concat(query.dimensions);
12777+
}).concat(dimensions);
1277812778
pivotConfig.x = pivotConfig.x.concat(allDimensions.filter(function (d) {
1277912779
return allIncludedDimensions.indexOf(d) === -1;
1278012780
}));
@@ -12814,7 +12814,7 @@
1281412814
return row[ResultSet.timeDimensionMember(timeDimension)] && moment$1(row[ResultSet.timeDimensionMember(timeDimension)]);
1281512815
}), filter(function (r) {
1281612816
return !!r;
12817-
}))(this.loadResponse.data);
12817+
}))(this.timeDimensionBackwardCompatibleData());
1281812818
dateRange = dates.length && [reduce(minBy(function (d) {
1281912819
return d.toDate();
1282012820
}), dates[0], dates), reduce(maxBy(function (d) {
@@ -12889,7 +12889,7 @@
1288912889
row: row
1289012890
};
1289112891
});
12892-
}), unnest, groupByXAxis, toPairs)(this.loadResponse.data);
12892+
}), unnest, groupByXAxis, toPairs)(this.timeDimensionBackwardCompatibleData());
1289312893
var allYValues = pipe(map( // eslint-disable-next-line no-unused-vars
1289412894
function (_ref6) {
1289512895
var _ref7 = _slicedToArray(_ref6, 2),
@@ -13139,7 +13139,7 @@
1313913139
var _this5 = this;
1314013140

1314113141
pivotConfig = this.normalizePivotConfig(pivotConfig);
13142-
return pipe(map(this.axisValues(pivotConfig.y)), unnest, uniq)(this.loadResponse.data).map(function (axisValues) {
13142+
return pipe(map(this.axisValues(pivotConfig.y)), unnest, uniq)(this.timeDimensionBackwardCompatibleData()).map(function (axisValues) {
1314313143
return {
1314413144
title: _this5.axisValuesString(pivotConfig.y.find(function (d) {
1314513145
return d === 'measures';
@@ -13158,6 +13158,33 @@
1315813158
value: function rawData() {
1315913159
return this.loadResponse.data;
1316013160
}
13161+
}, {
13162+
key: "timeDimensionBackwardCompatibleData",
13163+
value: function timeDimensionBackwardCompatibleData() {
13164+
if (!this.backwardCompatibleData) {
13165+
var query = this.loadResponse.query;
13166+
var timeDimensions = (query.timeDimensions || []).filter(function (td) {
13167+
return !!td.granularity;
13168+
});
13169+
this.backwardCompatibleData = this.loadResponse.data.map(function (row) {
13170+
return _objectSpread({}, row, Object.keys(row).filter(function (field) {
13171+
return timeDimensions.find(function (d) {
13172+
return d.dimension === field;
13173+
}) && !row[ResultSet.timeDimensionMember(timeDimensions.find(function (d) {
13174+
return d.dimension === field;
13175+
}))];
13176+
}).map(function (field) {
13177+
return _defineProperty({}, ResultSet.timeDimensionMember(timeDimensions.find(function (d) {
13178+
return d.dimension === field;
13179+
})), row[field]);
13180+
}).reduce(function (a, b) {
13181+
return _objectSpread({}, a, b);
13182+
}, {}));
13183+
});
13184+
}
13185+
13186+
return this.backwardCompatibleData;
13187+
}
1316113188
}], [{
1316213189
key: "timeDimensionMember",
1316313190
value: function timeDimensionMember(td) {

packages/cubejs-client-core/src/ResultSet.js

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,10 @@ class ResultSet {
117117

118118
const substituteTimeDimensionMembers = axis => axis.map(
119119
subDim => (
120-
timeDimensions.find(td => td.dimension === subDim) &&
121-
!dimensions.find(d => d === subDim) ?
120+
(
121+
timeDimensions.find(td => td.dimension === subDim) &&
122+
!dimensions.find(d => d === subDim)
123+
) ?
122124
ResultSet.timeDimensionMember(query.timeDimensions.find(td => td.dimension === subDim)) :
123125
subDim
124126
)
@@ -128,7 +130,7 @@ class ResultSet {
128130
pivotConfig.y = substituteTimeDimensionMembers(pivotConfig.y || []);
129131

130132
const allIncludedDimensions = pivotConfig.x.concat(pivotConfig.y);
131-
const allDimensions = timeDimensions.map(td => ResultSet.timeDimensionMember(td)).concat(query.dimensions);
133+
const allDimensions = timeDimensions.map(td => ResultSet.timeDimensionMember(td)).concat(dimensions);
132134
pivotConfig.x = pivotConfig.x.concat(allDimensions.filter(d => allIncludedDimensions.indexOf(d) === -1));
133135
if (!pivotConfig.x.concat(pivotConfig.y).find(d => d === 'measures')) {
134136
pivotConfig.y = pivotConfig.y.concat(['measures']);
@@ -159,7 +161,7 @@ class ResultSet {
159161
moment(row[ResultSet.timeDimensionMember(timeDimension)])
160162
),
161163
filter(r => !!r)
162-
)(this.loadResponse.data);
164+
)(this.timeDimensionBackwardCompatibleData());
163165

164166
dateRange = dates.length && [
165167
reduce(minBy(d => d.toDate()), dates[0], dates),
@@ -217,7 +219,7 @@ class ResultSet {
217219
unnest,
218220
groupByXAxis,
219221
toPairs
220-
)(this.loadResponse.data);
222+
)(this.timeDimensionBackwardCompatibleData());
221223

222224
const allYValues = pipe(
223225
map(
@@ -413,7 +415,9 @@ class ResultSet {
413415
*/
414416
seriesNames(pivotConfig) {
415417
pivotConfig = this.normalizePivotConfig(pivotConfig);
416-
return pipe(map(this.axisValues(pivotConfig.y)), unnest, uniq)(this.loadResponse.data).map(axisValues => ({
418+
return pipe(map(this.axisValues(pivotConfig.y)), unnest, uniq)(
419+
this.timeDimensionBackwardCompatibleData()
420+
).map(axisValues => ({
417421
title: this.axisValuesString(pivotConfig.y.find(d => d === 'measures') ?
418422
dropLast(1, axisValues)
419423
.concat(this.loadResponse.annotation.measures[ResultSet.measureFromAxis(axisValues)].title) :
@@ -429,6 +433,28 @@ class ResultSet {
429433
rawData() {
430434
return this.loadResponse.data;
431435
}
436+
437+
timeDimensionBackwardCompatibleData() {
438+
if (!this.backwardCompatibleData) {
439+
const { query } = this.loadResponse;
440+
const timeDimensions = (query.timeDimensions || []).filter(td => !!td.granularity);
441+
this.backwardCompatibleData = this.loadResponse.data.map(row => (
442+
{
443+
...row,
444+
...(
445+
Object.keys(row)
446+
.filter(
447+
field => timeDimensions.find(d => d.dimension === field) &&
448+
!row[ResultSet.timeDimensionMember(timeDimensions.find(d => d.dimension === field))]
449+
).map(field => ({
450+
[ResultSet.timeDimensionMember(timeDimensions.find(d => d.dimension === field))]: row[field]
451+
})).reduce((a, b) => ({ ...a, ...b }), {})
452+
)
453+
}
454+
));
455+
}
456+
return this.backwardCompatibleData;
457+
}
432458
}
433459

434460
export default ResultSet;

packages/cubejs-client-core/src/ResultSet.test.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,27 @@ describe('ResultSet', () => {
132132
});
133133
});
134134

135+
test('single time dimensions with granularity', () => {
136+
const resultSet = new ResultSet({
137+
"query": {
138+
"measures": [],
139+
"timeDimensions": [{
140+
"dimension": "Orders.createdAt",
141+
"granularity": "day",
142+
"dateRange": ["2020-01-08T00:00:00.000", "2020-01-09T23:59:59.999"]
143+
}],
144+
"filters": [],
145+
"timezone": "UTC"
146+
}
147+
});
148+
149+
expect(resultSet.normalizePivotConfig(resultSet.normalizePivotConfig())).toEqual({
150+
x: ['Orders.createdAt.day'],
151+
y: [],
152+
fillMissingDates: true
153+
});
154+
});
155+
135156
test('double time dimensions with granularity', () => {
136157
const resultSet = new ResultSet({
137158
"query": {
@@ -459,6 +480,47 @@ describe('ResultSet', () => {
459480
}]);
460481
});
461482

483+
test('time dimension backward compatibility', () => {
484+
const resultSet = new ResultSet({
485+
"query": {
486+
"measures": [],
487+
"timeDimensions": [{
488+
"dimension": "Orders.createdAt",
489+
"granularity": "day",
490+
"dateRange": ["2020-01-08T00:00:00.000", "2020-01-09T23:59:59.999"]
491+
}],
492+
"filters": [],
493+
"timezone": "UTC"
494+
},
495+
"data": [{
496+
"Orders.createdAt": "2020-01-08T00:00:00.000"
497+
}, {
498+
"Orders.createdAt": "2020-01-09T00:00:00.000"
499+
}],
500+
"annotation": {
501+
"measures": {},
502+
"dimensions": {},
503+
"segments": {},
504+
"timeDimensions": {
505+
"Orders.createdAt": {
506+
"title": "Orders Created at",
507+
"shortTitle": "Created at",
508+
"type": "time"
509+
}
510+
}
511+
}
512+
});
513+
514+
expect(resultSet.tablePivot()).toEqual([
515+
{
516+
"Orders.createdAt.day": "2020-01-08T00:00:00.000",
517+
},
518+
{
519+
"Orders.createdAt.day": "2020-01-09T00:00:00.000",
520+
}
521+
]);
522+
});
523+
462524
test('same dimension and time dimension without granularity', () => {
463525
const resultSet = new ResultSet({
464526
"query": {

0 commit comments

Comments
 (0)