Skip to content

Commit 7893f39

Browse files
committed
refactor(schema-compiler): Extract dimensionOnlyMeasureToHierarchy method
1 parent 881d823 commit 7893f39

File tree

1 file changed

+51
-48
lines changed

1 file changed

+51
-48
lines changed

packages/cubejs-schema-compiler/src/adapter/BaseQuery.js

+51-48
Original file line numberDiff line numberDiff line change
@@ -1697,13 +1697,60 @@ export class BaseQuery {
16971697
${this.query()}`;
16981698
}
16991699

1700+
dimensionOnlyMeasureToHierarchy(context, m) {
1701+
const measureName = typeof m.measure === 'string' ? m.measure : `${m.measure.cubeName}.${m.measure.name}`;
1702+
const memberNamesForMeasure = this.collectFrom(
1703+
[m],
1704+
this.collectMemberNamesFor.bind(this),
1705+
context ? ['collectMemberNamesFor', JSON.stringify(context)] : 'collectMemberNamesFor',
1706+
this.queryCache
1707+
);
1708+
const cubeNamesForMeasure = R.pipe(
1709+
R.map(member => this.memberInstanceByPath(member)),
1710+
// collectMemberNamesFor can return both view.dim and cube.dim
1711+
R.filter(member => member.definition().ownedByCube),
1712+
R.map(member => member.cube().name),
1713+
// Single member expression can reference multiple dimensions from same cube
1714+
R.uniq,
1715+
)(
1716+
memberNamesForMeasure
1717+
);
1718+
1719+
let cubeNameToAttach;
1720+
switch (cubeNamesForMeasure.length) {
1721+
case 0:
1722+
// For zero reference measure there's nothing to derive info about measure from
1723+
// So it assume that it's a regular measure, and it will be evaluated on top of join tree
1724+
return [measureName, [{
1725+
multiplied: false,
1726+
measure: m.measure,
1727+
}]];
1728+
case 1:
1729+
[cubeNameToAttach] = cubeNamesForMeasure;
1730+
break;
1731+
default:
1732+
throw new Error(`Expected single cube for dimension-only measure ${measureName}, got ${cubeNamesForMeasure}`);
1733+
}
1734+
1735+
const multiplied = this.multipliedJoinRowResult(cubeNameToAttach) || false;
1736+
1737+
const attachedMeasure = {
1738+
...m.measure,
1739+
originalCubeName: m.measure.cubeName,
1740+
cubeName: cubeNameToAttach
1741+
};
1742+
1743+
return [measureName, [{
1744+
multiplied,
1745+
measure: attachedMeasure,
1746+
}]];
1747+
}
1748+
17001749
collectRootMeasureToHieararchy(context) {
17011750
const notAddedMeasureFilters = R.flatten(this.measureFilters.map(f => f.getMembers()))
17021751
.filter(f => R.none(m => m.measure === f.measure, this.measures));
17031752

17041753
return R.fromPairs(this.measures.concat(notAddedMeasureFilters).map(m => {
1705-
const measureName = typeof m.measure === 'string' ? m.measure : `${m.measure.cubeName}.${m.measure.name}`;
1706-
17071754
const collectedMeasures = this.collectFrom(
17081755
[m],
17091756
this.collectMultipliedMeasures(context),
@@ -1725,53 +1772,9 @@ export class BaseQuery {
17251772
// Measures like this needs a special treatment to attach them to cube and decide if they are multiplied or not
17261773
// This would return measure object in `measure`, not path
17271774
// TODO return measure object for every measure
1728-
1729-
const memberNamesForMeasure = this.collectFrom(
1730-
[m],
1731-
this.collectMemberNamesFor.bind(this),
1732-
context ? ['collectMemberNamesFor', JSON.stringify(context)] : 'collectMemberNamesFor',
1733-
this.queryCache
1734-
);
1735-
const cubeNamesForMeasure = R.pipe(
1736-
R.map(member => this.memberInstanceByPath(member)),
1737-
// collectMemberNamesFor can return both view.dim and cube.dim
1738-
R.filter(member => member.definition().ownedByCube),
1739-
R.map(member => member.cube().name),
1740-
// Single member expression can reference multiple dimensions from same cube
1741-
R.uniq,
1742-
)(
1743-
memberNamesForMeasure
1744-
);
1745-
1746-
let cubeNameToAttach;
1747-
switch (cubeNamesForMeasure.length) {
1748-
case 0:
1749-
// For zero reference measure there's nothing to derive info about measure from
1750-
// So it assume that it's a regular measure, and it will be evaluated on top of join tree
1751-
return [measureName, [{
1752-
multiplied: false,
1753-
measure: m.measure,
1754-
}]];
1755-
case 1:
1756-
[cubeNameToAttach] = cubeNamesForMeasure;
1757-
break;
1758-
default:
1759-
throw new Error(`Expected single cube for dimension-only measure ${measureName}, got ${cubeNamesForMeasure}`);
1760-
}
1761-
1762-
const multiplied = this.multipliedJoinRowResult(cubeNameToAttach) || false;
1763-
1764-
const attachedMeasure = {
1765-
...m.measure,
1766-
originalCubeName: m.measure.cubeName,
1767-
cubeName: cubeNameToAttach
1768-
};
1769-
1770-
return [measureName, [{
1771-
multiplied,
1772-
measure: attachedMeasure,
1773-
}]];
1775+
return this.dimensionOnlyMeasureToHierarchy(context, m);
17741776
}
1777+
const measureName = typeof m.measure === 'string' ? m.measure : `${m.measure.cubeName}.${m.measure.name}`;
17751778
return [measureName, collectedMeasures];
17761779
}));
17771780
}

0 commit comments

Comments
 (0)