@@ -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