diff --git a/packages/cubejs-schema-compiler/adapter/BaseQuery.js b/packages/cubejs-schema-compiler/adapter/BaseQuery.js index 624b865c55a16..bc022e2c72f50 100644 --- a/packages/cubejs-schema-compiler/adapter/BaseQuery.js +++ b/packages/cubejs-schema-compiler/adapter/BaseQuery.js @@ -983,7 +983,7 @@ class BaseQuery { cubeAlias(cubeName) { const prefix = this.safeEvaluateSymbolContext().cubeAliasPrefix || this.cubeAliasPrefix; - return this.aliasName(`${prefix ? prefix + '__' : ''}${cubeName}`); + return this.aliasName(`"${prefix ? prefix + '__' : ''}${cubeName}"`); } collectCubeNamesFor(fn) { diff --git a/packages/cubejs-schema-compiler/scaffolding/ScaffoldingSchema.js b/packages/cubejs-schema-compiler/scaffolding/ScaffoldingSchema.js index 39829cbd4bf7f..a1a952d79ac45 100644 --- a/packages/cubejs-schema-compiler/scaffolding/ScaffoldingSchema.js +++ b/packages/cubejs-schema-compiler/scaffolding/ScaffoldingSchema.js @@ -69,7 +69,7 @@ class ScaffoldingSchema { } if (!this.dbSchema[schema][table]) { throw new UserError(`Can't resolve ${tableName}: '${table}' does not exist`); - } + } return this.dbSchema[schema][table]; } @@ -148,10 +148,15 @@ class ScaffoldingSchema { }; joins(tableName, tableDefinition) { + const key = "id"; return R.unnest(tableDefinition - .filter(column => column.name.toLowerCase().indexOf('id') !== -1 && column.name.toLowerCase() !== 'id') + .filter(column => { + const columnName = column.name.toLowerCase(); + const columnKeyPosition = columnName.length - columnName.lastIndexOf(key) - key.length; + return (columnKeyPosition === 0 && columnName !== 'id') + }) .map(column => { - const withoutId = column.name.replace('_id', '').replace('id', ''); + const withoutId = column.name.replace(new RegExp('_id$', "i"), '').replace(new RegExp('id$', "i"), ''); const tablesToJoin = this.tableNamesToTables[withoutId] || this.tableNamesToTables[inflection.tableize(withoutId)]; if (!tablesToJoin) { diff --git a/packages/cubejs-schema-compiler/scaffolding/ScaffoldingTemplate.js b/packages/cubejs-schema-compiler/scaffolding/ScaffoldingTemplate.js index 0230aed986f67..4815e97caed6e 100644 --- a/packages/cubejs-schema-compiler/scaffolding/ScaffoldingTemplate.js +++ b/packages/cubejs-schema-compiler/scaffolding/ScaffoldingTemplate.js @@ -40,16 +40,16 @@ class ScaffoldingTemplate { schemaDescriptorForTable(tableSchema) { return { cube: tableSchema.cube, - sql: `SELECT * FROM ${tableSchema.schema}.${tableSchema.table}`, // TODO escape + sql: `SELECT * FROM "${tableSchema.schema}"."${tableSchema.table}"`, // TODO escape joins: tableSchema.joins.map(j => ({ [j.cubeToJoin]: { - sql: `\${CUBE}.${j.thisTableColumn} = \${${j.cubeToJoin}}.${j.columnToJoin}`, + sql: `\${CUBE}."${j.thisTableColumn}" = \${${j.cubeToJoin}}."${j.columnToJoin}"`, relationship: j.relationship } })).reduce((a, b) => ({ ...a, ...b }), {}), measures: tableSchema.measures.map(m => ({ [this.memberName(m)]: { - sql: m.name, + sql: `\${CUBE}."${m.name}"`, type: m.types[0], title: this.memberTitle(m) } @@ -61,7 +61,7 @@ class ScaffoldingTemplate { }), dimensions: tableSchema.dimensions.map(m => ({ [this.memberName(m)]: { - sql: m.name, + sql: `\${CUBE}."${m.name}"`, type: m.types[0], title: this.memberTitle(m), primaryKey: m.isPrimaryKey ? true : undefined