@@ -1697,13 +1697,60 @@ export class BaseQuery {
1697
1697
${ this . query ( ) } ` ;
1698
1698
}
1699
1699
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
+
1700
1749
collectRootMeasureToHieararchy ( context ) {
1701
1750
const notAddedMeasureFilters = R . flatten ( this . measureFilters . map ( f => f . getMembers ( ) ) )
1702
1751
. filter ( f => R . none ( m => m . measure === f . measure , this . measures ) ) ;
1703
1752
1704
1753
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
-
1707
1754
const collectedMeasures = this . collectFrom (
1708
1755
[ m ] ,
1709
1756
this . collectMultipliedMeasures ( context ) ,
@@ -1725,53 +1772,9 @@ export class BaseQuery {
1725
1772
// Measures like this needs a special treatment to attach them to cube and decide if they are multiplied or not
1726
1773
// This would return measure object in `measure`, not path
1727
1774
// 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 ) ;
1774
1776
}
1777
+ const measureName = typeof m . measure === 'string' ? m . measure : `${ m . measure . cubeName } .${ m . measure . name } ` ;
1775
1778
return [ measureName , collectedMeasures ] ;
1776
1779
} ) ) ;
1777
1780
}
0 commit comments