From 04334c068ea2d50cd53105a2b8eb92d0eb6b6ff5 Mon Sep 17 00:00:00 2001 From: David O'Bryen Date: Thu, 21 Mar 2024 13:57:41 +1000 Subject: [PATCH] Additional sql fixes (#6) --- .../cubejs-vertica-driver/src/VerticaQuery.js | 6 - .../test/VerticaQuery.test.js | 116 ++++++++++++++++++ 2 files changed, 116 insertions(+), 6 deletions(-) create mode 100644 packages/cubejs-vertica-driver/test/VerticaQuery.test.js diff --git a/packages/cubejs-vertica-driver/src/VerticaQuery.js b/packages/cubejs-vertica-driver/src/VerticaQuery.js index 245bdb19a08ae..8fd60bc4581f8 100644 --- a/packages/cubejs-vertica-driver/src/VerticaQuery.js +++ b/packages/cubejs-vertica-driver/src/VerticaQuery.js @@ -13,12 +13,6 @@ const GRANULARITY_TO_INTERVAL = { }; class VerticaFilter extends BaseFilter { - likeIgnoreCase(column, not, param, type) { - const p = (!type || type === 'contains' || type === 'ends') ? '%' : ''; - const s = (!type || type === 'contains' || type === 'starts') ? '%' : ''; - return ` ILIKE (${column}${not ? ' NOT' : ''}, CONCAT('${p}', ${this.allocateParam(param)}, '${s}'))`; - } - castParameter() { if (this.definition().type === 'boolean') { return 'CAST(? AS BOOLEAN)'; diff --git a/packages/cubejs-vertica-driver/test/VerticaQuery.test.js b/packages/cubejs-vertica-driver/test/VerticaQuery.test.js new file mode 100644 index 0000000000000..0f4a232cf9882 --- /dev/null +++ b/packages/cubejs-vertica-driver/test/VerticaQuery.test.js @@ -0,0 +1,116 @@ +/* globals describe, it, afterAll, beforeAll, test, expect, jest */ +const { prepareCompiler } = require('@cubejs-backend/schema-compiler'); +const VerticaQuery = require('../src/VerticaQuery.js'); + +const testCompiler = (content, options) => prepareCompiler({ + localPath: () => __dirname, + dataSchemaFiles: () => Promise.resolve([ + { fileName: 'main.js', content }, + ]), +}, { adapter: 'vertica', ...options }); + +describe('VerticaQuery', () => { + const { compiler, joinGraph, cubeEvaluator } = testCompiler(` + cube(\`visitors\`, { + sql: \` + select * from visitors + \`, + + measures: { + count: { + type: 'count' + } + }, + + dimensions: { + name: { + type: 'string', + sql: 'name' + }, + dnc_address: { + type: 'boolean', + sql: 'dnc_address', + title: 'Unsubscribed (Address)' + }, + createdAt: { + sql: \`created_at\`, + type: 'time', + } + } + + }) + `, {}); + + it('vertica query like test', async () => { + await compiler.compile(); + + const query = new VerticaQuery( + { joinGraph, cubeEvaluator, compiler }, + { + measures: [], + filters: [ + { + member: 'visitors.name', + operator: 'contains', + values: [ + 'demo', + ], + }, + ], + }, + ); + + const queryAndParams = query.buildSqlAndParams(); + expect(queryAndParams[0]).toContain('("visitors".name ILIKE \'%\' || ? || \'%\')'); + }); + + it('vertica query boolean', async () => { + await compiler.compile(); + + const query = new VerticaQuery( + { joinGraph, cubeEvaluator, compiler }, + { + measures: [], + filters: [ + { + member: 'visitors.dnc_address', + operator: 'equals', + values: ['0', null], + }, + ], + }, + ); + + const queryAndParams = query.buildSqlAndParams(); + expect(queryAndParams[0]).toContain('("visitors".dnc_address IN (CAST(? AS BOOLEAN)) OR "visitors".dnc_address IS NULL'); + }); + + it('test equal filters', async () => { + await compiler.compile(); + + const filterValuesVariants = [ + [[true], 'WHERE ("visitors".name = ?)'], + [[false], 'WHERE ("visitors".name = ?)'], + [[''], 'WHERE ("visitors".name = ?)'], + [[null], 'WHERE ("visitors".name IS NULL)'], + ]; + + for (const [values, expected] of filterValuesVariants) { + const query = new VerticaQuery({ joinGraph, cubeEvaluator, compiler }, { + measures: [ + 'visitors.count' + ], + timeDimensions: [], + filters: [{ + member: 'visitors.name', + operator: 'equals', + values + }], + timezone: 'America/Los_Angeles' + }); + + const queryAndParams = query.buildSqlAndParams(); + expect(queryAndParams[0]).toContain(expected); + } + }); +});