Skip to content

Commit

Permalink
fix: Time dimension can't be selected twice within same query with an…
Browse files Browse the repository at this point in the history
…d without granularity
  • Loading branch information
paveltiunov committed Jan 16, 2020
1 parent 472a0c3 commit aa65129
Show file tree
Hide file tree
Showing 7 changed files with 570 additions and 43 deletions.
27 changes: 24 additions & 3 deletions packages/cubejs-api-gateway/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ const prepareAnnotation = (metaConfig, query) => {

const annotation = (memberType) => (member) => {
const path = member.split('.');
const config = configMap[path[0]][memberType].find(m => m.name === member);
const memberWithoutGranularity = [path[0], path[1]].join('.');
const config = configMap[path[0]][memberType].find(m => m.name === memberWithoutGranularity);
if (!config) {
return undefined;
}
Expand All @@ -39,7 +40,10 @@ const prepareAnnotation = (metaConfig, query) => {
measures: R.fromPairs((query.measures || []).map(annotation('measures')).filter(a => !!a)),
dimensions: R.fromPairs((query.dimensions || []).map(annotation('dimensions')).filter(a => !!a)),
segments: R.fromPairs((query.segments || []).map(annotation('segments')).filter(a => !!a)),
timeDimensions: R.fromPairs((query.timeDimensions || []).map(td => annotation('dimensions')(td.dimension)).filter(a => !!a)), // TODO
timeDimensions: R.fromPairs((query.timeDimensions || [])
.filter(td => !!td.granularity)
.map(td => annotation('dimensions')(`${td.dimension}.${td.granularity}`))
.filter(a => !!a)),
};
};

Expand All @@ -59,11 +63,28 @@ const transformData = (aliasToMemberNameMap, annotation, data) => (data.map(r =>
if (!annotationForMember) {
throw new UserError(`You requested hidden member: '${p[0]}'. Please make it visible using \`shown: true\``);
}
return [
const transformResult = [
memberName,
transformValue(p[1], annotationForMember.type)
];

const path = memberName.split('.');

// TODO: deprecated: backward compatibility for referencing time dimensions without granularity
const memberNameWithoutGranularity = [path[0], path[1]].join('.');
if (path.length === 3 && !annotation[memberNameWithoutGranularity]) {
return [
transformResult,
[
memberNameWithoutGranularity,
transformResult[1]
]
];
}

return [transformResult];
}),
R.unnest,
R.fromPairs
)(r)));

Expand Down
37 changes: 28 additions & 9 deletions packages/cubejs-client-core/dist/cubejs-client-core.esm.js
Original file line number Diff line number Diff line change
Expand Up @@ -185,20 +185,34 @@ function () {
var timeDimensions = (query.timeDimensions || []).filter(function (td) {
return !!td.granularity;
});
var dimensions = query.dimensions || [];
pivotConfig = pivotConfig || (timeDimensions.length ? {
x: timeDimensions.map(function (td) {
return td.dimension;
return ResultSet.timeDimensionMember(td);
}),
y: query.dimensions || []
y: dimensions
} : {
x: query.dimensions || [],
x: dimensions,
y: []
});
pivotConfig.x = pivotConfig.x || [];
pivotConfig.y = pivotConfig.y || [];

var substituteTimeDimensionMembers = function substituteTimeDimensionMembers(axis) {
return axis.map(function (subDim) {
return timeDimensions.find(function (td) {
return td.dimension === subDim;
}) && !dimensions.find(function (d) {
return d === subDim;
}) ? ResultSet.timeDimensionMember(query.timeDimensions.find(function (td) {
return td.dimension === subDim;
})) : subDim;
});
};

pivotConfig.x = substituteTimeDimensionMembers(pivotConfig.x || []);
pivotConfig.y = substituteTimeDimensionMembers(pivotConfig.y || []);
var allIncludedDimensions = pivotConfig.x.concat(pivotConfig.y);
var allDimensions = timeDimensions.map(function (td) {
return td.dimension;
return ResultSet.timeDimensionMember(td);
}).concat(query.dimensions);
pivotConfig.x = pivotConfig.x.concat(allDimensions.filter(function (d) {
return allIncludedDimensions.indexOf(d) === -1;
Expand Down Expand Up @@ -236,7 +250,7 @@ function () {

if (!dateRange) {
var dates = pipe(map(function (row) {
return row[timeDimension.dimension] && moment(row[timeDimension.dimension]);
return row[ResultSet.timeDimensionMember(timeDimension)] && moment(row[ResultSet.timeDimensionMember(timeDimension)]);
}), filter(function (r) {
return !!r;
}))(this.loadResponse.data);
Expand Down Expand Up @@ -280,7 +294,7 @@ function () {
if (pivotConfig.fillMissingDates && pivotConfig.x.length === 1 && equals(pivotConfig.x, (this.loadResponse.query.timeDimensions || []).filter(function (td) {
return !!td.granularity;
}).map(function (td) {
return td.dimension;
return ResultSet.timeDimensionMember(td);
}))) {
var series = this.timeSeries(this.loadResponse.query.timeDimensions[0]);

Expand Down Expand Up @@ -450,7 +464,7 @@ function () {
}, {
key: "tablePivot",
value: function tablePivot(pivotConfig) {
var normalizedPivotConfig = this.normalizePivotConfig(pivotConfig);
var normalizedPivotConfig = this.normalizePivotConfig(pivotConfig || {});

var valueToObject = function valueToObject(valuesArray, measureValue) {
return function (field, index) {
Expand Down Expand Up @@ -584,6 +598,11 @@ function () {
return this.loadResponse.data;
}
}], [{
key: "timeDimensionMember",
value: function timeDimensionMember(td) {
return "".concat(td.dimension, ".").concat(td.granularity);
}
}, {
key: "measureFromAxis",
value: function measureFromAxis(axisValues) {
return axisValues[axisValues.length - 1];
Expand Down
37 changes: 28 additions & 9 deletions packages/cubejs-client-core/dist/cubejs-client-core.js
Original file line number Diff line number Diff line change
Expand Up @@ -191,20 +191,34 @@ function () {
var timeDimensions = (query.timeDimensions || []).filter(function (td) {
return !!td.granularity;
});
var dimensions = query.dimensions || [];
pivotConfig = pivotConfig || (timeDimensions.length ? {
x: timeDimensions.map(function (td) {
return td.dimension;
return ResultSet.timeDimensionMember(td);
}),
y: query.dimensions || []
y: dimensions
} : {
x: query.dimensions || [],
x: dimensions,
y: []
});
pivotConfig.x = pivotConfig.x || [];
pivotConfig.y = pivotConfig.y || [];

var substituteTimeDimensionMembers = function substituteTimeDimensionMembers(axis) {
return axis.map(function (subDim) {
return timeDimensions.find(function (td) {
return td.dimension === subDim;
}) && !dimensions.find(function (d) {
return d === subDim;
}) ? ResultSet.timeDimensionMember(query.timeDimensions.find(function (td) {
return td.dimension === subDim;
})) : subDim;
});
};

pivotConfig.x = substituteTimeDimensionMembers(pivotConfig.x || []);
pivotConfig.y = substituteTimeDimensionMembers(pivotConfig.y || []);
var allIncludedDimensions = pivotConfig.x.concat(pivotConfig.y);
var allDimensions = timeDimensions.map(function (td) {
return td.dimension;
return ResultSet.timeDimensionMember(td);
}).concat(query.dimensions);
pivotConfig.x = pivotConfig.x.concat(allDimensions.filter(function (d) {
return allIncludedDimensions.indexOf(d) === -1;
Expand Down Expand Up @@ -242,7 +256,7 @@ function () {

if (!dateRange) {
var dates = ramda.pipe(ramda.map(function (row) {
return row[timeDimension.dimension] && moment(row[timeDimension.dimension]);
return row[ResultSet.timeDimensionMember(timeDimension)] && moment(row[ResultSet.timeDimensionMember(timeDimension)]);
}), ramda.filter(function (r) {
return !!r;
}))(this.loadResponse.data);
Expand Down Expand Up @@ -286,7 +300,7 @@ function () {
if (pivotConfig.fillMissingDates && pivotConfig.x.length === 1 && ramda.equals(pivotConfig.x, (this.loadResponse.query.timeDimensions || []).filter(function (td) {
return !!td.granularity;
}).map(function (td) {
return td.dimension;
return ResultSet.timeDimensionMember(td);
}))) {
var series = this.timeSeries(this.loadResponse.query.timeDimensions[0]);

Expand Down Expand Up @@ -456,7 +470,7 @@ function () {
}, {
key: "tablePivot",
value: function tablePivot(pivotConfig) {
var normalizedPivotConfig = this.normalizePivotConfig(pivotConfig);
var normalizedPivotConfig = this.normalizePivotConfig(pivotConfig || {});

var valueToObject = function valueToObject(valuesArray, measureValue) {
return function (field, index) {
Expand Down Expand Up @@ -590,6 +604,11 @@ function () {
return this.loadResponse.data;
}
}], [{
key: "timeDimensionMember",
value: function timeDimensionMember(td) {
return "".concat(td.dimension, ".").concat(td.granularity);
}
}, {
key: "measureFromAxis",
value: function measureFromAxis(axisValues) {
return axisValues[axisValues.length - 1];
Expand Down
41 changes: 30 additions & 11 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 (typeof IteratorPrototype[ITERATOR] != 'function') _hide(IteratorPrototype, ITERATOR, returnThis);
if (!_library && 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 (BUGGY || VALUES_BUG || !proto[ITERATOR]) {
if ((!_library || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
_hide(proto, ITERATOR, $default);
}
// Plug for library
Expand Down Expand Up @@ -12746,20 +12746,34 @@
var timeDimensions = (query.timeDimensions || []).filter(function (td) {
return !!td.granularity;
});
var dimensions = query.dimensions || [];
pivotConfig = pivotConfig || (timeDimensions.length ? {
x: timeDimensions.map(function (td) {
return td.dimension;
return ResultSet.timeDimensionMember(td);
}),
y: query.dimensions || []
y: dimensions
} : {
x: query.dimensions || [],
x: dimensions,
y: []
});
pivotConfig.x = pivotConfig.x || [];
pivotConfig.y = pivotConfig.y || [];

var substituteTimeDimensionMembers = function substituteTimeDimensionMembers(axis) {
return axis.map(function (subDim) {
return timeDimensions.find(function (td) {
return td.dimension === subDim;
}) && !dimensions.find(function (d) {
return d === subDim;
}) ? ResultSet.timeDimensionMember(query.timeDimensions.find(function (td) {
return td.dimension === subDim;
})) : subDim;
});
};

pivotConfig.x = substituteTimeDimensionMembers(pivotConfig.x || []);
pivotConfig.y = substituteTimeDimensionMembers(pivotConfig.y || []);
var allIncludedDimensions = pivotConfig.x.concat(pivotConfig.y);
var allDimensions = timeDimensions.map(function (td) {
return td.dimension;
return ResultSet.timeDimensionMember(td);
}).concat(query.dimensions);
pivotConfig.x = pivotConfig.x.concat(allDimensions.filter(function (d) {
return allIncludedDimensions.indexOf(d) === -1;
Expand Down Expand Up @@ -12797,7 +12811,7 @@

if (!dateRange) {
var dates = pipe(map(function (row) {
return row[timeDimension.dimension] && moment$1(row[timeDimension.dimension]);
return row[ResultSet.timeDimensionMember(timeDimension)] && moment$1(row[ResultSet.timeDimensionMember(timeDimension)]);
}), filter(function (r) {
return !!r;
}))(this.loadResponse.data);
Expand Down Expand Up @@ -12841,7 +12855,7 @@
if (pivotConfig.fillMissingDates && pivotConfig.x.length === 1 && equals(pivotConfig.x, (this.loadResponse.query.timeDimensions || []).filter(function (td) {
return !!td.granularity;
}).map(function (td) {
return td.dimension;
return ResultSet.timeDimensionMember(td);
}))) {
var series = this.timeSeries(this.loadResponse.query.timeDimensions[0]);

Expand Down Expand Up @@ -13011,7 +13025,7 @@
}, {
key: "tablePivot",
value: function tablePivot(pivotConfig) {
var normalizedPivotConfig = this.normalizePivotConfig(pivotConfig);
var normalizedPivotConfig = this.normalizePivotConfig(pivotConfig || {});

var valueToObject = function valueToObject(valuesArray, measureValue) {
return function (field, index) {
Expand Down Expand Up @@ -13145,6 +13159,11 @@
return this.loadResponse.data;
}
}], [{
key: "timeDimensionMember",
value: function timeDimensionMember(td) {
return "".concat(td.dimension, ".").concat(td.granularity);
}
}, {
key: "measureFromAxis",
value: function measureFromAxis(axisValues) {
return axisValues[axisValues.length - 1];
Expand Down
39 changes: 30 additions & 9 deletions packages/cubejs-client-core/src/ResultSet.js
Original file line number Diff line number Diff line change
Expand Up @@ -99,20 +99,36 @@ class ResultSet {
return axisValues.map(formatValue).join(delimiter || ', ');
}

static timeDimensionMember(td) {
return `${td.dimension}.${td.granularity}`;
}

normalizePivotConfig(pivotConfig) {
const { query } = this.loadResponse;
const timeDimensions = (query.timeDimensions || []).filter(td => !!td.granularity);
const dimensions = query.dimensions || [];
pivotConfig = pivotConfig || (timeDimensions.length ? {
x: timeDimensions.map(td => td.dimension),
y: query.dimensions || []
x: timeDimensions.map(td => ResultSet.timeDimensionMember(td)),
y: dimensions
} : {
x: query.dimensions || [],
x: dimensions,
y: []
});
pivotConfig.x = pivotConfig.x || [];
pivotConfig.y = pivotConfig.y || [];

const substituteTimeDimensionMembers = axis => axis.map(
subDim => (
timeDimensions.find(td => td.dimension === subDim) &&
!dimensions.find(d => d === subDim) ?
ResultSet.timeDimensionMember(query.timeDimensions.find(td => td.dimension === subDim)) :
subDim
)
);

pivotConfig.x = substituteTimeDimensionMembers(pivotConfig.x || []);
pivotConfig.y = substituteTimeDimensionMembers(pivotConfig.y || []);

const allIncludedDimensions = pivotConfig.x.concat(pivotConfig.y);
const allDimensions = timeDimensions.map(td => td.dimension).concat(query.dimensions);
const allDimensions = timeDimensions.map(td => ResultSet.timeDimensionMember(td)).concat(query.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 All @@ -138,7 +154,10 @@ class ResultSet {
let { dateRange } = timeDimension;
if (!dateRange) {
const dates = pipe(
map(row => row[timeDimension.dimension] && moment(row[timeDimension.dimension])),
map(
row => row[ResultSet.timeDimensionMember(timeDimension)] &&
moment(row[ResultSet.timeDimensionMember(timeDimension)])
),
filter(r => !!r)
)(this.loadResponse.data);

Expand Down Expand Up @@ -172,7 +191,9 @@ class ResultSet {
pivotConfig.x.length === 1 &&
equals(
pivotConfig.x,
(this.loadResponse.query.timeDimensions || []).filter(td => !!td.granularity).map(td => td.dimension)
(this.loadResponse.query.timeDimensions || [])
.filter(td => !!td.granularity)
.map(td => ResultSet.timeDimensionMember(td))
)
) {
const series = this.timeSeries(this.loadResponse.query.timeDimensions[0]);
Expand Down Expand Up @@ -299,7 +320,7 @@ class ResultSet {
* @returns {Array} of pivoted rows
*/
tablePivot(pivotConfig) {
const normalizedPivotConfig = this.normalizePivotConfig(pivotConfig);
const normalizedPivotConfig = this.normalizePivotConfig(pivotConfig || {});
const valueToObject =
(valuesArray, measureValue) => (
(field, index) => ({
Expand Down
Loading

0 comments on commit aa65129

Please sign in to comment.