Skip to content

Commit

Permalink
feat: Rewrite SQL for more places
Browse files Browse the repository at this point in the history
  • Loading branch information
paveltiunov committed Apr 4, 2020
1 parent 5f78974 commit 2412821
Showing 1 changed file with 29 additions and 18 deletions.
47 changes: 29 additions & 18 deletions packages/cubejs-schema-compiler/adapter/BaseQuery.js
Original file line number Diff line number Diff line change
Expand Up @@ -338,8 +338,7 @@ class BaseQuery {
// eslint-disable-next-line prefer-template
const inlineWhereConditions = [];
const commonQuery = this.rewriteInlineWhere(() => this.commonQuery(), inlineWhereConditions);
const inlineFilters = inlineWhereConditions.map(f => ({ filterToWhere: () => f }));
return `${commonQuery} ${this.baseWhere(this.allFilters.concat(inlineFilters))}` +
return `${commonQuery} ${this.baseWhere(this.allFilters.concat(inlineWhereConditions))}` +
this.groupByClause() +
this.baseHaving(this.measureFilters) +
this.orderBy() +
Expand Down Expand Up @@ -632,7 +631,8 @@ class BaseQuery {
this.cubeEvaluator.cubeFromPath(cube).rewriteQueries &&
parser.isSimpleAsteriskQuery()
) {
this.safeEvaluateSymbolContext().inlineWhereConditions.push(parser.extractWhereConditions(cubeAlias));
const conditions = parser.extractWhereConditions(cubeAlias);
this.safeEvaluateSymbolContext().inlineWhereConditions.push({ filterToWhere: () => conditions });
return [parser.extractTableFrom(), cubeAlias];
} else {
return [sql, cubeAlias];
Expand Down Expand Up @@ -719,15 +719,18 @@ class BaseQuery {
regularMeasuresSubQuery(measures, filters) {
filters = filters || this.allFilters;

return `SELECT ${this.selectAllDimensionsAndMeasures(measures)} FROM ${
this.joinQuery(
this.join,
this.collectFrom(
this.dimensionsForSelect().concat(measures).concat(this.allFilters),
this.collectSubQueryDimensionsFor.bind(this)
)
const inlineWhereConditions = [];

const query = this.rewriteInlineWhere(() => this.joinQuery(
this.join,
this.collectFrom(
this.dimensionsForSelect().concat(measures).concat(this.allFilters),
this.collectSubQueryDimensionsFor.bind(this)
)
} ${this.baseWhere(filters)}` +
), inlineWhereConditions);
return `SELECT ${this.selectAllDimensionsAndMeasures(measures)} FROM ${
query
} ${this.baseWhere(filters.concat(inlineWhereConditions))}` +
(!this.safeEvaluateSymbolContext().ungrouped && this.groupByClause() || '');
}

Expand All @@ -736,8 +739,8 @@ class BaseQuery {
const primaryKeyDimension = this.newDimension(this.primaryKeyName(keyCubeName));
const shouldBuildJoinForMeasureSelect = this.checkShouldBuildJoinForMeasureSelect(measures, keyCubeName);

let keyCubeSql = this.cubeSql(keyCubeName);

let keyCubeSql;
const inlineWhereConditionsForKeyCube = [];
const measureSubQueryDimensions = this.collectFrom(measures, this.collectSubQueryDimensionsFor.bind(this));

if (shouldBuildJoinForMeasureSelect) {
Expand All @@ -749,6 +752,11 @@ class BaseQuery {
);
}
keyCubeSql = `(${this.aggregateSubQueryMeasureJoin(keyCubeName, measures, measuresJoin, primaryKeyDimension, measureSubQueryDimensions)})`;
} else {
[keyCubeSql] = this.rewriteInlineWhere(
() => this.rewriteInlineCubeSql(keyCubeName),
inlineWhereConditionsForKeyCube
);
}

const measureSelectFn = () => measures.map(m => m.selectColumns());
Expand All @@ -769,6 +777,7 @@ class BaseQuery {
`LEFT OUTER JOIN ${keyCubeSql} ${this.asSyntaxJoin} ${this.cubeAlias(keyCubeName)} ON
${this.escapeColumnName('keys')}.${primaryKeyDimension.aliasName()} = ${keyInMeasureSelect} ` +
subQueryJoins +
this.baseWhere(inlineWhereConditionsForKeyCube) +
(!this.safeEvaluateSymbolContext().ungrouped && this.groupByClause() || '');
}

Expand Down Expand Up @@ -817,12 +826,14 @@ class BaseQuery {
}

keysQuery(primaryKeyDimension, filters) {
const inlineWhereConditions = [];
const query = this.rewriteInlineWhere(() => this.joinQuery(
this.join,
this.collectFrom(this.keyDimensions(primaryKeyDimension), this.collectSubQueryDimensionsFor.bind(this))
), inlineWhereConditions);
return `SELECT DISTINCT ${this.keysSelect(primaryKeyDimension)} FROM ${
this.joinQuery(
this.join,
this.collectFrom(this.keyDimensions(primaryKeyDimension), this.collectSubQueryDimensionsFor.bind(this))
)
} ${this.baseWhere(filters)}`;
query
} ${this.baseWhere(filters.concat(inlineWhereConditions))}`;
}

keysSelect(primaryKeyDimension) {
Expand Down

0 comments on commit 2412821

Please sign in to comment.