Skip to content

Commit

Permalink
fix(@cubejs-client/core): data blending without date range (#3161)
Browse files Browse the repository at this point in the history
  • Loading branch information
vasilev-alex committed Jul 28, 2021
1 parent 483057a commit cc7c140
Show file tree
Hide file tree
Showing 4 changed files with 309 additions and 159 deletions.
37 changes: 12 additions & 25 deletions packages/cubejs-client-core/src/ResultSet.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import {
pluck, mergeAll, flatten,
} from 'ramda';

import { aliasSeries } from './utils';

dayjs.locale({
...en,
weekStart: 1,
Expand Down Expand Up @@ -302,7 +304,7 @@ class ResultSet {
return ResultSet.getNormalizedPivotConfig(this.loadResponse.pivotQuery, pivotConfig);
}

timeSeries(timeDimension) {
timeSeries(timeDimension, resultIndex) {
if (!timeDimension.granularity) {
return null;
}
Expand All @@ -314,7 +316,7 @@ class ResultSet {
const dates = pipe(
map(row => row[member] && dayjs(row[member])),
filter(Boolean)
)(this.timeDimensionBackwardCompatibleData());
)(this.timeDimensionBackwardCompatibleData(resultIndex));

dateRange = dates.length && [
reduce(minBy(d => d.toDate()), dates[0], dates),
Expand Down Expand Up @@ -362,7 +364,7 @@ class ResultSet {
))
) {
const series = this.loadResponses.map(
(loadResponse) => this.timeSeries(loadResponse.query.timeDimensions[0])
(loadResponse) => this.timeSeries(loadResponse.query.timeDimensions[0], resultIndex)
);

if (series[0]) {
Expand Down Expand Up @@ -470,22 +472,12 @@ class ResultSet {
allMeasures.filter((e, i, a) => a.indexOf(e) !== i).forEach(m => duplicateMeasures.add(m));
}

const aliasSeries = (yValues, i) => {
// manual alias
if (pivotConfig && pivotConfig.aliasSeries && pivotConfig.aliasSeries[i]) {
return [pivotConfig.aliasSeries[i], ...yValues];
} else if (duplicateMeasures.has(yValues[0])) {
return [i, ...yValues];
}
return [yValues];
};

return this.pivot(pivotConfig).map(({ xValues, yValuesArray }) => {
const yValuesMap = {};

yValuesArray
.forEach(([yValues, m], i) => {
yValuesMap[this.axisValuesString(aliasSeries(yValues, i), ',')] = m && validate(m);
yValuesMap[this.axisValuesString(aliasSeries(yValues, i, pivotConfig, duplicateMeasures), ',')] = m && validate(m);
});

return ({
Expand Down Expand Up @@ -655,17 +647,8 @@ class ResultSet {
allMeasures.filter((e, i, a) => a.indexOf(e) !== i).forEach(m => duplicateMeasures.add(m));
}

const aliasSeries = (yValues, i) => {
if (pivotConfig && pivotConfig.aliasSeries && pivotConfig.aliasSeries[i]) {
return [pivotConfig.aliasSeries[i], ...yValues];
} else if (duplicateMeasures.has(yValues[0])) {
return [i, ...yValues];
}
return yValues;
};

return seriesNames.map((axisValues, i) => {
const aliasedAxis = aliasSeries(axisValues, i);
const aliasedAxis = aliasSeries(axisValues, i, pivotConfig, duplicateMeasures);
return {
title: this.axisValuesString(
pivotConfig.y.find(d => d === 'measures') ?
Expand Down Expand Up @@ -710,7 +693,11 @@ class ResultSet {
return this.loadResponses[0].annotation;
}

timeDimensionBackwardCompatibleData(resultIndex = 0) {
timeDimensionBackwardCompatibleData(resultIndex) {
if (resultIndex === undefined) {
throw new Error('resultIndex is required');
}

if (!this.backwardCompatibleData[resultIndex]) {
const { data, query } = this.loadResponses[resultIndex];
const timeDimensions = (query.timeDimensions || []).filter(td => Boolean(td.granularity));
Expand Down
158 changes: 24 additions & 134 deletions packages/cubejs-client-core/src/tests/data-blending.test.js
Original file line number Diff line number Diff line change
@@ -1,137 +1,7 @@
import 'jest';
import ResultSet from '../ResultSet';

const loadResponse = {
queryType: 'blendingQuery',
results: [
{
query: {
measures: ['Orders.count'],
timeDimensions: [
{
dimension: 'Orders.ts',
granularity: 'day',
dateRange: ['2020-08-01T00:00:00.000', '2020-08-07T23:59:59.999'],
},
],
filters: [],
timezone: 'UTC',
order: [],
dimensions: [],
},
data: [
{
'Orders.ts.day': '2020-08-01T00:00:00.000',
'Orders.ts': '2020-08-01T00:00:00.000',
'Orders.count': 1,
'time.day': '2020-08-01T00:00:00.000',
},
{
'Orders.ts.day': '2020-08-02T00:00:00.000',
'Orders.ts': '2020-08-02T00:00:00.000',
'Orders.count': 2,
'time.day': '2020-08-02T00:00:00.000',
},
],
annotation: {
measures: {
'Orders.count': {
title: 'Orders Count',
shortTitle: 'Count',
type: 'number',
drillMembers: ['Orders.id', 'Orders.title'],
drillMembersGrouped: {
measures: [],
dimensions: ['Orders.id', 'Orders.title'],
},
},
},
dimensions: {},
segments: {},
timeDimensions: {
'Orders.ts.day': { title: 'Orders Ts', shortTitle: 'Ts', type: 'time' },
'Orders.ts': { title: 'Orders Ts', shortTitle: 'Ts', type: 'time' },
},
},
},
{
query: {
measures: ['Users.count'],
timeDimensions: [
{
dimension: 'Users.ts',
granularity: 'day',
dateRange: ['2020-08-01T00:00:00.000', '2020-08-07T23:59:59.999'],
},
],
filters: [],
timezone: 'UTC',
order: [],
dimensions: ['Users.country'],
},
data: [
{
'Users.ts.day': '2020-08-01T00:00:00.000',
'Users.ts': '2020-08-01T00:00:00.000',
'Users.count': 20,
'Users.country': 'Australia',
'time.day': '2020-08-01T00:00:00.000',
},
{
'Users.ts.day': '2020-08-05T00:00:00.000',
'Users.ts': '2020-08-05T00:00:00.000',
'Users.count': 34,
'Users.country': 'Spain',
'time.day': '2020-08-05T00:00:00.000',
},
{
'Users.ts.day': '2020-08-05T00:00:00.000',
'Users.ts': '2020-08-05T00:00:00.000',
'Users.count': 18,
'Users.country': 'Italy',
'time.day': '2020-08-05T00:00:00.000',
},
],
annotation: {
measures: {
'Users.count': {
title: 'Users Count',
shortTitle: 'Count',
type: 'number',
drillMembers: [],
drillMembersGrouped: {
measures: [],
dimensions: [],
},
},
},
dimensions: {
'Users.country': {
title: 'Users Country',
shortTitle: 'Country',
type: 'string',
},
},
segments: {},
timeDimensions: {
'Users.ts.day': { title: 'Orders Ts', shortTitle: 'Ts', type: 'time' },
'Users.ts': { title: 'Orders Ts', shortTitle: 'Ts', type: 'time' },
},
},
},
],
pivotQuery: {
measures: ['Orders.count', 'Users.count'],
timeDimensions: [
{
dimension: 'time',
granularity: 'day',
dateRange: ['2020-08-01T00:00:00.000', '2020-08-07T23:59:59.999'],
},
],
dimensions: ['Users.country'],
},
};
import ResultSet from '../ResultSet';
import { loadResponse, loadResponseWithoutDateRange } from './fixtures/datablending/load-responses.json';

describe('data blending', () => {
const resultSet1 = new ResultSet(loadResponse);
Expand Down Expand Up @@ -215,7 +85,7 @@ describe('data blending', () => {
});
});

test('data-blending with same measure', () => {
test('query with a single measure', () => {
const resultSet = new ResultSet({
queryType: 'blendingQuery',
results: [
Expand Down Expand Up @@ -376,7 +246,27 @@ describe('data blending', () => {
]);
});

test('data-blending with same measure and custom series alias', () => {
test('query without date range', () => {
const resultSet = new ResultSet(loadResponseWithoutDateRange);

expect(resultSet.chartPivot()).toEqual([
{
x: '2020-08-01T00:00:00.000',
xValues: ['2020-08-01T00:00:00.000'],
'Orders.count': 1,
'Australia,Users.count': 20,
},
{
x: '2020-08-02T00:00:00.000',
xValues: ['2020-08-02T00:00:00.000'],
'Orders.count': 2,
'Spain,Users.count': 34,
'Italy,Users.count': 18,
},
]);
});

test('query with a single measure and a custom series alias', () => {
const resultSet = new ResultSet({
queryType: 'blendingQuery',
results: [
Expand Down

0 comments on commit cc7c140

Please sign in to comment.