@@ -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 }  ) ; 
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