@@ -187,6 +187,20 @@ export interface CubeSymbolsBase {
187187
188188export type CubeSymbolsDefinition = CubeSymbolsBase & Record < string , CubeSymbolDefinition > ;
189189
190+ type MemberSets = {
191+ resolvedMembers : Set < string > ;
192+ allMembers : Set < string > ;
193+ } ;
194+
195+ type ViewResolvedMember = {
196+ member : string ;
197+ name : string ;
198+ } ;
199+
200+ type ViewExcludedMember = {
201+ member : string ;
202+ } ;
203+
190204const FunctionRegex = / f u n c t i o n \s + \w + \( ( [ A - Z a - z 0 - 9 _ , ] * ) | \( ( [ \s \S ] * ?) \) \s * = > | \( ? ( \w + ) \) ? \s * = > / ;
191205export const CONTEXT_SYMBOLS = {
192206 SECURITY_CONTEXT : 'securityContext' ,
@@ -560,19 +574,23 @@ export class CubeSymbols implements TranspilerSymbolResolver {
560574 return ;
561575 }
562576
563- const memberSets = {
577+ const memberSets : MemberSets = {
564578 resolvedMembers : new Set < string > ( ) ,
565579 allMembers : new Set < string > ( ) ,
566580 } ;
567581
568582 const autoIncludeMembers = new Set < string > ( ) ;
569583 // `hierarchies` must be processed first
570- const types = [ 'hierarchies' , 'measures' , 'dimensions' , 'segments' ] ;
584+ // It's also important `dimensions` to be processed BEFORE `measures`
585+ // because drillMembers processing for views in generateIncludeMembers() relies on this
586+ const types = [ 'hierarchies' , 'dimensions' , 'measures' , 'segments' ] ;
571587
572588 const joinMap : string [ ] [ ] = [ ] ;
573589
590+ const viewAllMembers : ViewResolvedMember [ ] = [ ] ;
591+
574592 for ( const type of types ) {
575- let cubeIncludes : any [ ] = [ ] ;
593+ let cubeIncludes : ViewResolvedMember [ ] = [ ] ;
576594
577595 // If the hierarchy is included all members from it should be included as well
578596 // Extend `includes` with members from hierarchies that should be auto-included
@@ -603,6 +621,7 @@ export class CubeSymbols implements TranspilerSymbolResolver {
603621 } ) : includedCubes ;
604622
605623 cubeIncludes = this . membersFromCubes ( cube , cubes , type , errorReporter , splitViews , memberSets ) || [ ] ;
624+ viewAllMembers . push ( ...cubeIncludes ) ;
606625
607626 if ( type === 'hierarchies' ) {
608627 for ( const member of cubeIncludes ) {
@@ -620,7 +639,7 @@ export class CubeSymbols implements TranspilerSymbolResolver {
620639 }
621640 }
622641
623- const includeMembers = this . generateIncludeMembers ( cubeIncludes , type ) ;
642+ const includeMembers = this . generateIncludeMembers ( cubeIncludes , type , cube , viewAllMembers ) ;
624643 this . applyIncludeMembers ( includeMembers , cube , type , errorReporter ) ;
625644
626645 const existing = cube . includedMembers ?? [ ] ;
@@ -669,9 +688,9 @@ export class CubeSymbols implements TranspilerSymbolResolver {
669688 type : string ,
670689 errorReporter : ErrorReporter ,
671690 splitViews : SplitViews ,
672- memberSets : any
673- ) {
674- const result : any [ ] = [ ] ;
691+ memberSets : MemberSets
692+ ) : ViewResolvedMember [ ] {
693+ const result : ViewResolvedMember [ ] = [ ] ;
675694 const seen = new Set < string > ( ) ;
676695
677696 for ( const cubeInclude of cubes ) {
@@ -769,7 +788,8 @@ export class CubeSymbols implements TranspilerSymbolResolver {
769788 splitViewDef = splitViews [ viewName ] ;
770789 }
771790
772- const includeMembers = this . generateIncludeMembers ( finalIncludes , type ) ;
791+ const viewAllMembers : ViewResolvedMember [ ] = [ ] ;
792+ const includeMembers = this . generateIncludeMembers ( finalIncludes , type , splitViewDef , viewAllMembers ) ;
773793 this . applyIncludeMembers ( includeMembers , splitViewDef , type , errorReporter ) ;
774794 } else {
775795 for ( const member of finalIncludes ) {
@@ -785,7 +805,7 @@ export class CubeSymbols implements TranspilerSymbolResolver {
785805 return result ;
786806 }
787807
788- protected diffByMember ( includes : any [ ] , excludes : any [ ] ) {
808+ protected diffByMember ( includes : ViewResolvedMember [ ] , excludes : ViewExcludedMember [ ] ) {
789809 const excludesMap = new Map ( ) ;
790810
791811 for ( const exclude of excludes ) {
@@ -799,14 +819,42 @@ export class CubeSymbols implements TranspilerSymbolResolver {
799819 return this . symbols [ cubeName ] ?. cubeObj ( ) ?. [ type ] ?. [ memberName ] ;
800820 }
801821
802- protected generateIncludeMembers ( members : any [ ] , type : string ) {
822+ protected generateIncludeMembers ( members : any [ ] , type : string , targetCube : CubeDefinitionExtended , viewAllMembers : ViewResolvedMember [ ] ) {
803823 return members . map ( memberRef => {
804824 const path = memberRef . member . split ( '.' ) ;
805825 const resolvedMember = this . getResolvedMember ( type , path [ path . length - 2 ] , path [ path . length - 1 ] ) ;
806826 if ( ! resolvedMember ) {
807827 throw new Error ( `Can't resolve '${ memberRef . member } ' while generating include members` ) ;
808828 }
809829
830+ let processedDrillMembers = resolvedMember . drillMembers ;
831+
832+ // We need to filter only included drillMembers for views
833+ if ( type === 'measures' && resolvedMember . drillMembers && targetCube . isView ) {
834+ const sourceCubeName = path [ path . length - 2 ] ;
835+
836+ const evaluatedDrillMembers = this . evaluateReferences (
837+ sourceCubeName ,
838+ resolvedMember . drillMembers ,
839+ { originalSorting : true }
840+ ) ;
841+
842+ const drillMembersArray = ( Array . isArray ( evaluatedDrillMembers )
843+ ? evaluatedDrillMembers
844+ : [ evaluatedDrillMembers ] ) ;
845+
846+ const filteredDrillMembers = drillMembersArray . flatMap ( member => {
847+ const found = viewAllMembers . find ( v => v . member . endsWith ( member ) ) ;
848+ if ( ! found ) {
849+ return [ ] ;
850+ }
851+
852+ return [ `${ targetCube . name } .${ found . name } ` ] ;
853+ } ) ;
854+
855+ processedDrillMembers = ( ) => filteredDrillMembers ;
856+ }
857+
810858 // eslint-disable-next-line no-new-func
811859 const sql = new Function ( path [ 0 ] , `return \`\${${ memberRef . member } }\`;` ) ;
812860 let memberDefinition ;
@@ -822,6 +870,8 @@ export class CubeSymbols implements TranspilerSymbolResolver {
822870 ...( resolvedMember . multiStage && { multiStage : resolvedMember . multiStage } ) ,
823871 ...( resolvedMember . timeShift && { timeShift : resolvedMember . timeShift } ) ,
824872 ...( resolvedMember . orderBy && { orderBy : resolvedMember . orderBy } ) ,
873+ ...( processedDrillMembers && { drillMembers : processedDrillMembers } ) ,
874+ ...( resolvedMember . drillMembersGrouped && { drillMembersGrouped : resolvedMember . drillMembersGrouped } ) ,
825875 } ;
826876 } else if ( type === 'dimensions' ) {
827877 memberDefinition = {
@@ -904,8 +954,7 @@ export class CubeSymbols implements TranspilerSymbolResolver {
904954 name
905955 ) ;
906956 // eslint-disable-next-line no-underscore-dangle
907- // if (resolvedSymbol && resolvedSymbol._objectWithResolvedProperties) {
908- if ( resolvedSymbol . _objectWithResolvedProperties ) {
957+ if ( resolvedSymbol ?. _objectWithResolvedProperties ) {
909958 return resolvedSymbol ;
910959 }
911960 return cubeEvaluator . pathFromArray ( fullPath ( cubeEvaluator . joinHints ( ) , [ referencedCube , name ] ) ) ;
@@ -1015,7 +1064,7 @@ export class CubeSymbols implements TranspilerSymbolResolver {
10151064 cubeName ,
10161065 name
10171066 ) ;
1018- if ( resolvedSymbol . _objectWithResolvedProperties ) {
1067+ if ( resolvedSymbol ? ._objectWithResolvedProperties ) {
10191068 return resolvedSymbol ;
10201069 }
10211070 return '' ;
0 commit comments