From 0a8f324c083be7f3013f0c63e69602c9a85b5fcc Mon Sep 17 00:00:00 2001 From: Pavel Tiunov Date: Wed, 17 Apr 2019 23:07:48 +0300 Subject: [PATCH] fix(schema-compiler): Athena, Mysql and BigQuery doesn't respect multiple contains filter --- .../adapter/BaseFilter.js | 21 +++++++----------- .../adapter/BigqueryQuery.js | 8 ++----- .../adapter/MysqlQuery.js | 8 ++----- .../adapter/PrestodbQuery.js | 8 ++----- .../test/GraphBuilderTest.js | 22 +++++++++++++++++++ 5 files changed, 36 insertions(+), 31 deletions(-) diff --git a/packages/cubejs-schema-compiler/adapter/BaseFilter.js b/packages/cubejs-schema-compiler/adapter/BaseFilter.js index c8bd78e41f149..5c223e744172c 100644 --- a/packages/cubejs-schema-compiler/adapter/BaseFilter.js +++ b/packages/cubejs-schema-compiler/adapter/BaseFilter.js @@ -101,26 +101,21 @@ class BaseFilter extends BaseDimension { } containsWhere(column) { - if (this.isArrayValues()) { - return this.likeOr(column); - } - - return `${column} ILIKE '%' || ? || '%'`; + return this.likeOr(column); } notContainsWhere(column) { - if (this.isArrayValues()) { - return this.likeOr(column, true); - } - - return `${column} NOT ILIKE '%' || ? || '%' OR ${column} IS NULL`; + return this.likeOr(column, true); } likeOr(column, not) { - const basePart = `${column} ${not ? 'NOT' : ''} ILIKE '%' || ? || '%'`; - const multiplePart = `${not ? 'AND' : 'OR'} ${basePart}`; + const basePart = this.likeIgnoreCase(column, not); const nullCheck = `${not ? ` OR ${column} IS NULL` : ''}`; - return `${basePart} ${join(' ', repeat(multiplePart, this.values.length - 1))} ${nullCheck}`; + return `${join(not ? ' AND ' : ' OR ', repeat(basePart, this.values.length))}${nullCheck}`; + } + + likeIgnoreCase(column, not) { + return `${column}${not ? ' NOT' : ''} ILIKE '%' || ? || '%'`; } equalsWhere(column) { diff --git a/packages/cubejs-schema-compiler/adapter/BigqueryQuery.js b/packages/cubejs-schema-compiler/adapter/BigqueryQuery.js index bfa2947968ab1..ac175ce24b10f 100644 --- a/packages/cubejs-schema-compiler/adapter/BigqueryQuery.js +++ b/packages/cubejs-schema-compiler/adapter/BigqueryQuery.js @@ -10,12 +10,8 @@ const GRANULARITY_TO_INTERVAL = { }; class BigqueryFilter extends BaseFilter { - containsWhere(column) { - return `LOWER(${column}) LIKE CONCAT('%', LOWER(?) ,'%')`; - } - - notContainsWhere(column) { - return `LOWER(${column}) NOT LIKE CONCAT('%', LOWER(?) ,'%') OR ${column} IS NULL`; + likeIgnoreCase(column, not) { + return `LOWER(${column})${not ? ' NOT' : ''} LIKE CONCAT('%', LOWER(?) ,'%')`; } castParameter() { diff --git a/packages/cubejs-schema-compiler/adapter/MysqlQuery.js b/packages/cubejs-schema-compiler/adapter/MysqlQuery.js index 2a87511097c43..9f7f52dd90f69 100644 --- a/packages/cubejs-schema-compiler/adapter/MysqlQuery.js +++ b/packages/cubejs-schema-compiler/adapter/MysqlQuery.js @@ -12,12 +12,8 @@ const GRANULARITY_TO_INTERVAL = { }; class MysqlFilter extends BaseFilter { - containsWhere(column) { - return `${column} LIKE CONCAT('%', ?, '%')`; - } - - notContainsWhere(column) { - return `${column} NOT LIKE CONCAT('%', ?, '%') OR ${column} IS NULL`; + likeIgnoreCase(column, not) { + return `${column}${not ? ' NOT' : ''} LIKE CONCAT('%', ?, '%')`; } } diff --git a/packages/cubejs-schema-compiler/adapter/PrestodbQuery.js b/packages/cubejs-schema-compiler/adapter/PrestodbQuery.js index 8cd55c0c1d1ce..7e5d30c73a464 100644 --- a/packages/cubejs-schema-compiler/adapter/PrestodbQuery.js +++ b/packages/cubejs-schema-compiler/adapter/PrestodbQuery.js @@ -10,12 +10,8 @@ const GRANULARITY_TO_INTERVAL = { }; class PrestodbFilter extends BaseFilter { - containsWhere(column) { - return `LOWER(${column}) LIKE CONCAT('%', LOWER(?) ,'%')`; - } - - notContainsWhere(column) { - return `LOWER(${column}) NOT LIKE CONCAT('%', LOWER(?) ,'%') OR ${column} IS NULL`; + likeIgnoreCase(column, not) { + return `LOWER(${column})${not ? ' NOT' : ''} LIKE CONCAT('%', LOWER(?) ,'%')`; } castParameter() { diff --git a/packages/cubejs-schema-compiler/test/GraphBuilderTest.js b/packages/cubejs-schema-compiler/test/GraphBuilderTest.js index edcf813b43ac7..ef340a4eeee3f 100644 --- a/packages/cubejs-schema-compiler/test/GraphBuilderTest.js +++ b/packages/cubejs-schema-compiler/test/GraphBuilderTest.js @@ -1236,6 +1236,28 @@ describe('JoinGraph', () => { ]) ); + it( + 'contains filter', + () => runQueryTest({ + measures: [], + dimensions: [ + 'visitors.source' + ], + timeDimensions: [], + timezone: 'America/Los_Angeles', + filters: [{ + dimension: 'visitor_checkins.source', + operator: 'contains', + values: ['goo'] + }], + order: [{ + id: 'visitors.source' + }] + }, [ + { 'visitors.source': 'some' } + ]) + ); + it('year granularity', () => runQueryTest({ measures: [