Skip to content

Commit c2f51ed

Browse files
committed
fix(schema-compiler): For views, propagate FILTER_PARAMS to inner cube SELECT
1 parent c06216b commit c2f51ed

File tree

1 file changed

+30
-12
lines changed

1 file changed

+30
-12
lines changed

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

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3508,16 +3508,16 @@ export class BaseQuery {
35083508
}
35093509
}
35103510

3511-
static findAndSubTreeForFilterGroup(filter, groupMembers, newGroupFilter) {
3511+
static findAndSubTreeForFilterGroup(filter, groupMembers, newGroupFilter, aliases) {
35123512
if ((filter.operator === 'and' || filter.operator === 'or') && !filter.values?.length) {
35133513
return null;
35143514
}
35153515
const filterMembers = BaseQuery.extractFilterMembers(filter);
3516-
if (filterMembers && Object.keys(filterMembers).every(m => groupMembers.indexOf(m) !== -1)) {
3516+
if (filterMembers && Object.keys(filterMembers).every(m => (groupMembers.indexOf(m) !== -1 || aliases.indexOf(m) !== -1))) {
35173517
return filter;
35183518
}
35193519
if (filter.operator === 'and') {
3520-
const result = filter.values.map(f => BaseQuery.findAndSubTreeForFilterGroup(f, groupMembers, newGroupFilter)).filter(f => !!f);
3520+
const result = filter.values.map(f => BaseQuery.findAndSubTreeForFilterGroup(f, groupMembers, newGroupFilter, aliases)).filter(f => !!f);
35213521
if (!result.length) {
35223522
return null;
35233523
}
@@ -3542,21 +3542,30 @@ export class BaseQuery {
35423542
);
35433543
}
35443544

3545-
static renderFilterParams(filter, filterParamArgs, allocateParam, newGroupFilter) {
3545+
static renderFilterParams(filter, filterParamArgs, allocateParam, newGroupFilter, aliases) {
35463546
if (!filter) {
35473547
return '1 = 1';
35483548
}
35493549

35503550
if (filter.operator === 'and' || filter.operator === 'or') {
35513551
const values = filter.values
3552-
.map(f => BaseQuery.renderFilterParams(f, filterParamArgs, allocateParam, newGroupFilter))
3552+
.map(f => BaseQuery.renderFilterParams(f, filterParamArgs, allocateParam, newGroupFilter, aliases))
35533553
.map(v => ({ filterToWhere: () => v }));
35543554

35553555
return newGroupFilter({ operator: filter.operator, values }).filterToWhere();
35563556
}
35573557

3558-
const filterParams = filter && filter.filterParams();
3559-
const filterParamArg = filterParamArgs.filter(p => p.__member() === filter.measure || p.__member() === filter.dimension)[0];
3558+
const filterParams = filter.filterParams();
3559+
const filterParamArg = filterParamArgs.filter(p => {
3560+
const member = p.__member();
3561+
return member === filter.measure ||
3562+
member === filter.dimension ||
3563+
(aliases[member] && (
3564+
aliases[member] === filter.measure ||
3565+
aliases[member] === filter.dimension
3566+
));
3567+
})[0];
3568+
35603569
if (!filterParamArg) {
35613570
throw new Error(`FILTER_PARAMS arg not found for ${filter.measure || filter.dimension}`);
35623571
}
@@ -3589,15 +3598,21 @@ export class BaseQuery {
35893598
return f.__member();
35903599
});
35913600

3592-
const filter = BaseQuery.findAndSubTreeForFilterGroup(newGroupFilter({ operator: 'and', values: allFilters }), groupMembers, newGroupFilter);
3601+
const aliases = allFilters.map(v => v.query.allBackAliasMembers()).reduce((a, b) => ({ ...a, ...b }), {});
3602+
const filter = BaseQuery.findAndSubTreeForFilterGroup(
3603+
newGroupFilter({ operator: 'and', values: allFilters }),
3604+
groupMembers,
3605+
newGroupFilter,
3606+
Object.values(aliases)
3607+
);
35933608

3594-
return `(${BaseQuery.renderFilterParams(filter, filterParamArgs, allocateParam, newGroupFilter)})`;
3609+
return `(${BaseQuery.renderFilterParams(filter, filterParamArgs, allocateParam, newGroupFilter, aliases)})`;
35953610
};
35963611
}
35973612

35983613
static filterProxyFromAllFilters(allFilters, cubeEvaluator, allocateParam, newGroupFilter) {
35993614
return new Proxy({}, {
3600-
get: (target, name) => {
3615+
get: (_target, name) => {
36013616
if (name === '_objectWithResolvedProperties') {
36023617
return true;
36033618
}
@@ -3614,12 +3629,15 @@ export class BaseQuery {
36143629
return cubeEvaluator.pathFromArray([cubeNameObj.cube, propertyName]);
36153630
},
36163631
toString() {
3632+
const aliases = allFilters.map(v => (v.query ? v.query.allBackAliasMembers() : {})).reduce((a, b) => ({ ...a, ...b }), {});
36173633
const filter = BaseQuery.findAndSubTreeForFilterGroup(
36183634
newGroupFilter({ operator: 'and', values: allFilters }),
36193635
[cubeEvaluator.pathFromArray([cubeNameObj.cube, propertyName])],
3620-
newGroupFilter
3636+
newGroupFilter,
3637+
Object.values(aliases)
36213638
);
3622-
return `(${BaseQuery.renderFilterParams(filter, [this], allocateParam, newGroupFilter)})`;
3639+
3640+
return `(${BaseQuery.renderFilterParams(filter, [this], allocateParam, newGroupFilter, aliases)})`;
36233641
}
36243642
})
36253643
})

0 commit comments

Comments
 (0)