Skip to content

Commit

Permalink
Add tests for fix
Browse files Browse the repository at this point in the history
  • Loading branch information
KSDaemon committed Sep 17, 2024
1 parent f9cc8d5 commit 07c0152
Show file tree
Hide file tree
Showing 2 changed files with 262 additions and 3 deletions.
226 changes: 223 additions & 3 deletions packages/cubejs-schema-compiler/test/unit/base-query.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import {
createCubeSchemaWithCustomGranularities,
createCubeSchemaYaml,
createJoinedCubesSchema,
createSchemaYaml
createSchemaYaml,
createSchemaYamlForGroupFilterParamsTests
} from './utils';
import { BigqueryQuery } from '../../src/adapter/BigqueryQuery';

Expand Down Expand Up @@ -1398,8 +1399,60 @@ describe('SQL Generation', () => {
},
],
});
const cubeSQL = query.cubeSql('Order');
expect(cubeSQL).toContain('select * from order where ((type = $0$))');
const queryAndParams = query.buildSqlAndParams();
const queryString = queryAndParams[0];
expect(queryString).toContain('select * from order where ((type = ?))');
});

it('propagate filter params within cte from view into cube\'s query', async () => {
/** @type {Compilers} */
const compiler = prepareYamlCompiler(
createSchemaYaml({
cubes: [{
name: 'Order',
sql: `WITH cte as (select *
from order
where {FILTER_PARAMS.Order.type.filter('type')}
)
select * from cte`,
measures: [{
name: 'count',
type: 'count',
}],
dimensions: [{
name: 'type',
sql: 'type',
type: 'string'
}]
}],
views: [{
name: 'orders_view',
cubes: [{
join_path: 'Order',
prefix: true,
includes: [
'type',
'count',
]
}]
}]
})
);

await compiler.compiler.compile();
const query = new BaseQuery(compiler, {
measures: ['orders_view.Order_count'],
filters: [
{
member: 'orders_view.Order_type',
operator: 'equals',
values: ['online'],
},
],
});
const queryAndParams = query.buildSqlAndParams();
const queryString = queryAndParams[0];
expect(/select\s+\*\s+from\s+order\s+where\s+\(\(type\s=\s\?\)\)/.test(queryString)).toBeTruthy();
});
});

Expand Down Expand Up @@ -1527,6 +1580,173 @@ describe('SQL Generation', () => {
const cubeSQL = query.cubeSql('Order');
expect(cubeSQL).toContain('where ((((dim0 = $0$) AND (dim1 = $1$)) OR ((dim0 = $2$) AND (dim1 = $3$))))');
});

it('propagate 1 filter param from view into cube\'s query', async () => {
/** @type {Compilers} */
const compiler = prepareYamlCompiler(
createSchemaYamlForGroupFilterParamsTests(
`select *
from order
where {FILTER_GROUP(
FILTER_PARAMS.Order.dim0.filter('dim0')
, FILTER_PARAMS.Order.dim1.filter('dim1')
)}`
)
);

await compiler.compiler.compile();
const query = new PostgresQuery(compiler, {
measures: ['orders_view.Order_count'],
filters: [
{
member: 'orders_view.Order_dim0',
operator: 'equals',
values: ['online'],
},
],
});
const queryAndParams = query.buildSqlAndParams();
const queryString = queryAndParams[0];
expect(/select\s+\*\s+from\s+order\s+where\s+\(\(dim0\s=\s\$1\)\)/.test(queryString)).toBeTruthy();
});

it('propagate 2 filter params from view into cube\'s query', async () => {
/** @type {Compilers} */
const compiler = prepareYamlCompiler(
createSchemaYamlForGroupFilterParamsTests(
`select *
from order
where {FILTER_GROUP(
FILTER_PARAMS.Order.dim0.filter('dim0'),
FILTER_PARAMS.Order.dim1.filter('dim1')
)}`
)
);

await compiler.compiler.compile();
const query = new PostgresQuery(compiler, {
measures: ['orders_view.Order_count'],
filters: [
{
member: 'orders_view.Order_dim0',
operator: 'equals',
values: ['online'],
},
{
member: 'orders_view.Order_dim1',
operator: 'equals',
values: ['online'],
},
],
});
const queryAndParams = query.buildSqlAndParams();
const queryString = queryAndParams[0];
expect(/select\s+\*\s+from\s+order\s+where\s+\(\(dim0\s=\s\$1\)\s+AND\s+\(dim1\s+=\s+\$2\)\)/.test(queryString)).toBeTruthy();
});

it('propagate 1 filter param within cte from view into cube\'s query', async () => {
/** @type {Compilers} */
const compiler = prepareYamlCompiler(
createSchemaYamlForGroupFilterParamsTests(
`with cte as (
select *
from order
where
{FILTER_GROUP(
FILTER_PARAMS.Order.dim0.filter('dim0'),
FILTER_PARAMS.Order.dim1.filter('dim1')
)}
)
select * from cte`
)
);

await compiler.compiler.compile();
const query = new PostgresQuery(compiler, {
measures: ['orders_view.Order_count'],
filters: [
{
member: 'orders_view.Order_dim0',
operator: 'equals',
values: ['online'],
},
],
});
const queryAndParams = query.buildSqlAndParams();
const queryString = queryAndParams[0];
expect(/select\s+\*\s+from\s+order\s+where\s+\(\(dim0\s=\s\$1\)\)/.test(queryString)).toBeTruthy();
});

it('propagate 2 filter params within cte from view into cube\'s query', async () => {
/** @type {Compilers} */
const compiler = prepareYamlCompiler(
createSchemaYamlForGroupFilterParamsTests(
`with cte as (
select *
from order
where
{FILTER_GROUP(
FILTER_PARAMS.Order.dim0.filter('dim0'),
FILTER_PARAMS.Order.dim1.filter('dim1')
)}
)
select * from cte`
)
);

await compiler.compiler.compile();
const query = new PostgresQuery(compiler, {
measures: ['orders_view.Order_count'],
filters: [
{
member: 'orders_view.Order_dim0',
operator: 'equals',
values: ['online'],
},
{
member: 'orders_view.Order_dim1',
operator: 'equals',
values: ['online'],
},
],
});
const queryAndParams = query.buildSqlAndParams();
const queryString = queryAndParams[0];
expect(/select\s+\*\s+from\s+order\s+where\s+\(\(dim0\s=\s\$1\)\s+AND\s+\(dim1\s+=\s+\$2\)\)/.test(queryString)).toBeTruthy();
});

it('propagate 1 filter param within cte (ref as cube and view dimensions)', async () => {
/** @type {Compilers} */
const compiler = prepareYamlCompiler(
createSchemaYamlForGroupFilterParamsTests(
`with cte as (
select *
from order
where
{FILTER_GROUP(
FILTER_PARAMS.Order.dim0.filter('dim0'),
FILTER_PARAMS.orders_view.dim0.filter('dim0')
)}
)
select * from cte`
)
);

await compiler.compiler.compile();
const query = new PostgresQuery(compiler, {
measures: ['orders_view.Order_count'],
filters: [
{
member: 'orders_view.Order_dim0',
operator: 'equals',
values: ['online'],
},
],
});
const queryAndParams = query.buildSqlAndParams();
const queryString = queryAndParams[0];
expect(/select\s+\*\s+from\s+order\s+where\s+\(\(dim0\s=\s\$1\)\)/.test(queryString)).toBeTruthy();
});
});
});

Expand Down
39 changes: 39 additions & 0 deletions packages/cubejs-schema-compiler/test/unit/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,45 @@ export function createSchemaYaml(schema: CreateSchemaOptions): string {
return YAML.dump(schema);
}

export function createSchemaYamlForGroupFilterParamsTests(cubeDefSql: string): string {
return createSchemaYaml({
cubes: [
{
name: 'Order',
sql: cubeDefSql,
measures: [{
name: 'count',
type: 'count',
}],
dimensions: [
{
name: 'dim0',
sql: 'dim0',
type: 'string'
},
{
name: 'dim1',
sql: 'dim1',
type: 'string'
}
]
},
],
views: [{
name: 'orders_view',
cubes: [{
join_path: 'Order',
prefix: true,
includes: [
'count',
'dim0',
'dim1',
]
}]
}]
});
}

export function createCubeSchemaYaml({ name, sqlTable }: CreateCubeSchemaOptions): string {
return `
cubes:
Expand Down

0 comments on commit 07c0152

Please sign in to comment.