Skip to content

Commit c5039b9

Browse files
committed
fix(schema-compiler): fix backalias resolution in FILTER_PARAMS to exclude segments
1 parent c0ea0f9 commit c5039b9

File tree

1 file changed

+20
-5
lines changed

1 file changed

+20
-5
lines changed

packages/cubejs-schema-compiler/src/adapter/BaseQuery.js

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)