Skip to content

Commit 80d112e

Browse files
fix: Allow empty complex boolean filter arrays (#1100)
* Bugfix: allow filters without arguments. * code style * remove 1=1 from result sql query
1 parent 6d2829d commit 80d112e

File tree

3 files changed

+113
-1
lines changed

3 files changed

+113
-1
lines changed

packages/cubejs-schema-compiler/adapter/BaseGroupFilter.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
const R = require('ramda');
2+
13
class BaseGroupFilter {
24
constructor(query, filter) {
35
this.values = filter.values;
@@ -7,7 +9,18 @@ class BaseGroupFilter {
79
}
810

911
filterToWhere() {
10-
return this.values.map(f => `(${f.filterToWhere()})`).join(` ${this.operator} `);
12+
const r = this.values.map(f => {
13+
const sql = f.filterToWhere();
14+
if (!sql) {
15+
return null;
16+
}
17+
return `(${sql})`;
18+
}).filter(R.identity).join(` ${this.operator} `);
19+
20+
if (!r.length) {
21+
return null;
22+
}
23+
return r;
1124
}
1225

1326
getMembers() {

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,14 @@ class BaseQuery {
102102
measure: measure[0],
103103
};
104104
}
105+
if (!dimension.length && !measure.length) {
106+
return {
107+
values: [],
108+
operator,
109+
dimension: null,
110+
measure: null,
111+
};
112+
}
105113
throw new UserError(`You cannot use dimension and measure in same condition: ${JSON.stringify(f)}`);
106114
}
107115

packages/cubejs-schema-compiler/test/SQLGenerationLogicTest.js

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,97 @@ describe('SQL Generation', function test() {
768768
});
769769
}));
770770

771+
it('where filter without arguments', () => compiler.compile().then(() => {
772+
const query = new PostgresQuery({ joinGraph, cubeEvaluator, compiler }, {
773+
measures: [
774+
'visitors.visitor_count'
775+
],
776+
dimensions: [
777+
'visitors.source',
778+
],
779+
timeDimensions: [],
780+
timezone: 'America/Los_Angeles',
781+
filters: [
782+
{
783+
and: [
784+
{
785+
and: [
786+
{
787+
or: [
788+
{
789+
and: [
790+
{
791+
member: 'visitors.source',
792+
operator: 'equals',
793+
values: ['some']
794+
}
795+
]
796+
},
797+
{
798+
and: []
799+
}
800+
]
801+
}]
802+
}]
803+
}],
804+
order: [{
805+
'visitors.visitor_count': 'desc'
806+
}]
807+
});
808+
809+
console.log(query.buildSqlAndParams());
810+
811+
return dbRunner.testQuery(query.buildSqlAndParams()).then(res => {
812+
console.log(JSON.stringify(res));
813+
res.should.be.deepEqual([{ 'visitors__source': 'some', 'visitors__visitor_count': '2' }]);
814+
});
815+
}));
816+
817+
it('where filter without any arguments', () => compiler.compile().then(() => {
818+
const query = new PostgresQuery({ joinGraph, cubeEvaluator, compiler }, {
819+
measures: [
820+
'visitors.visitor_count'
821+
],
822+
dimensions: [
823+
'visitors.source',
824+
],
825+
timeDimensions: [],
826+
timezone: 'America/Los_Angeles',
827+
filters: [
828+
{
829+
and: [
830+
{
831+
and: [
832+
{
833+
or: [
834+
{
835+
and: []
836+
},
837+
{
838+
and: []
839+
}
840+
]
841+
}]
842+
}]
843+
}],
844+
order: [{
845+
'visitors.visitor_count': 'desc'
846+
}]
847+
});
848+
849+
console.log(query.buildSqlAndParams());
850+
851+
return dbRunner.testQuery(query.buildSqlAndParams()).then(res => {
852+
console.log(JSON.stringify(res));
853+
res.should.be.deepEqual(
854+
[
855+
{ 'visitors__source': null, 'visitors__visitor_count': '3' },
856+
{ 'visitors__source': 'google', 'visitors__visitor_count': '1' },
857+
{ 'visitors__source': 'some', 'visitors__visitor_count': '2' }
858+
]
859+
);
860+
});
861+
}));
771862
it('where filter with incorrect one arguments', () => compiler.compile().then(() => {
772863
try {
773864
const query = new PostgresQuery({ joinGraph, cubeEvaluator, compiler }, {

0 commit comments

Comments
 (0)