@@ -3599,7 +3599,8 @@ export class BaseQuery {
35993599 } ) ;
36003600
36013601 const aliases = allFilters ?
3602- allFilters . map ( v => ( v . query ? v . query . allBackAliasMembers ( ) : { } ) )
3602+ allFilters
3603+ . map ( v => ( v . query ? v . query . allBackAliasMembersExceptSegments ( ) : { } ) )
36033604 . reduce ( ( a , b ) => ( { ...a , ...b } ) , { } )
36043605 : { } ;
36053606 const filter = BaseQuery . findAndSubTreeForFilterGroup (
@@ -3632,15 +3633,25 @@ export class BaseQuery {
36323633 return cubeEvaluator . pathFromArray ( [ cubeNameObj . cube , propertyName ] ) ;
36333634 } ,
36343635 toString ( ) {
3636+ // Segments should be excluded because they are evaluated separately in cubeReferenceProxy
3637+ // In other case this falls into the recursive loop/stack exceeded caused by:
3638+ // collectFrom() -> traverseSymbol() -> evaluateSymbolSql() ->
3639+ // evaluateSql() -> resolveSymbolsCall() -> cubeReferenceProxy->toString() ->
3640+ // evaluateSymbolSql() -> evaluateSql()... -> and got here again
36353641 const aliases = allFilters ?
3636- allFilters . map ( v => ( v . query ? v . query . allBackAliasMembers ( ) : { } ) )
3642+ allFilters
3643+ . map ( v => ( v . query ? v . query . allBackAliasMembersExceptSegments ( ) : { } ) )
36373644 . reduce ( ( a , b ) => ( { ...a , ...b } ) , { } )
36383645 : { } ;
3646+ // Filtering aliases that somehow relate to this cube
3647+ const filteredAliases = Object . entries ( aliases )
3648+ . filter ( ( [ key , value ] ) => key . startsWith ( cubeNameObj . cube ) || value . startsWith ( cubeNameObj . cube ) )
3649+ . reduce ( ( acc , [ key , value ] ) => ( { ...acc , [ key ] : value } ) , { } ) ;
36393650 const filter = BaseQuery . findAndSubTreeForFilterGroup (
36403651 newGroupFilter ( { operator : 'and' , values : allFilters } ) ,
36413652 [ cubeEvaluator . pathFromArray ( [ cubeNameObj . cube , propertyName ] ) ] ,
36423653 newGroupFilter ,
3643- Object . values ( aliases )
3654+ Object . values ( filteredAliases )
36443655 ) ;
36453656
36463657 return `(${ BaseQuery . renderFilterParams ( filter , [ this ] , allocateParam , newGroupFilter , aliases ) } )` ;
@@ -3652,18 +3663,22 @@ export class BaseQuery {
36523663 } ) ;
36533664 }
36543665
3655- flattenAllMembers ( ) {
3666+ flattenAllMembers ( excludeSegments = false ) {
36563667 return R . flatten (
36573668 this . measures
36583669 . concat ( this . dimensions )
3659- . concat ( this . segments )
3670+ . concat ( excludeSegments ? [ ] : this . segments )
36603671 . concat ( this . filters )
36613672 . concat ( this . measureFilters )
36623673 . concat ( this . timeDimensions )
36633674 . map ( m => m . getMembers ( ) ) ,
36643675 ) ;
36653676 }
36663677
3678+ allBackAliasMembersExceptSegments ( ) {
3679+ return this . backAliasMembers ( this . flattenAllMembers ( true ) ) ;
3680+ }
3681+
36673682 allBackAliasMembers ( ) {
36683683 return this . backAliasMembers ( this . flattenAllMembers ( ) ) ;
36693684 }
0 commit comments