minor, more checks on computed column
Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/68b2b305 Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/68b2b305 Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/68b2b305 Branch: refs/heads/2.1.x Commit: 68b2b3050118c43807524296d5664eb5c0aa30ee Parents: f7c27a2 Author: Hongbin Ma <mahong...@apache.org> Authored: Mon Aug 21 22:10:36 2017 +0800 Committer: Hongbin Ma <mahong...@apache.org> Committed: Mon Aug 21 22:11:22 2017 +0800 ---------------------------------------------------------------------- .../kylin/metadata/model/ComputedColumnDesc.java | 17 ++++++++++++++++- .../apache/kylin/metadata/model/DataModelDesc.java | 2 +- .../resources/query/sql_computedcolumn/query04.sql | 1 + .../query/sql_computedcolumn/query04.sql.compare | 2 ++ 4 files changed, 20 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/68b2b305/core-metadata/src/main/java/org/apache/kylin/metadata/model/ComputedColumnDesc.java ---------------------------------------------------------------------- diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/model/ComputedColumnDesc.java b/core-metadata/src/main/java/org/apache/kylin/metadata/model/ComputedColumnDesc.java index 9911fd2..bd785c8 100644 --- a/core-metadata/src/main/java/org/apache/kylin/metadata/model/ComputedColumnDesc.java +++ b/core-metadata/src/main/java/org/apache/kylin/metadata/model/ComputedColumnDesc.java @@ -18,6 +18,7 @@ package org.apache.kylin.metadata.model; import java.io.Serializable; +import java.util.Map; import java.util.Set; import org.apache.calcite.sql.SqlAsOperator; @@ -55,7 +56,9 @@ public class ComputedColumnDesc implements Serializable { @JsonProperty private String comment; - public void init(Set<String> aliasSet, String rootFactTableName) { + public void init(Map<String, TableRef> aliasMap, String rootFactTableName) { + Set<String> aliasSet = aliasMap.keySet(); + Preconditions.checkNotNull(tableIdentity, "tableIdentity is null"); Preconditions.checkNotNull(columnName, "columnName is null"); Preconditions.checkNotNull(expression, "expression is null"); @@ -81,6 +84,18 @@ public class ComputedColumnDesc implements Serializable { throw new IllegalArgumentException("Computed column has to be defined on fact table"); } + for (TableRef tableRef : aliasMap.values()) { + if (!rootFactTableName.equals(tableRef.getAlias())) { + for (TblColRef tblColRef : tableRef.getColumns()) { + if (this.columnName.equals(tblColRef.getName())) { + throw new IllegalArgumentException( + "Computed column name " + columnName + " is already found on table " + + tableRef.getTableIdentity() + ", use a different computed column name"); + } + } + } + } + if ("true".equals(System.getProperty("needCheckCC"))) { //conditional execute this because of the calcite dependency is to available every where try { simpleParserCheck(expression, aliasSet); http://git-wip-us.apache.org/repos/asf/kylin/blob/68b2b305/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java ---------------------------------------------------------------------- diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java b/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java index e21ecf3..1bc9729 100644 --- a/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java +++ b/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java @@ -494,7 +494,7 @@ public class DataModelDesc extends RootPersistentEntity { for (ComputedColumnDesc newCC : this.computedColumnDescs) { - newCC.init(aliasMap.keySet(), rootFactTableRef.getAlias()); + newCC.init(aliasMap, rootFactTableRef.getAlias()); final String newCCFullName = newCC.getFullName(); final String newCCColumnName = newCC.getColumnName(); http://git-wip-us.apache.org/repos/asf/kylin/blob/68b2b305/kylin-it/src/test/resources/query/sql_computedcolumn/query04.sql ---------------------------------------------------------------------- diff --git a/kylin-it/src/test/resources/query/sql_computedcolumn/query04.sql b/kylin-it/src/test/resources/query/sql_computedcolumn/query04.sql new file mode 100644 index 0000000..780de5d --- /dev/null +++ b/kylin-it/src/test/resources/query/sql_computedcolumn/query04.sql @@ -0,0 +1 @@ +select count(*) as a , sum (F.DEAL_AMOUNT) as b from test_kylin_fact f inner join test_account a on f.seller_id = a.account_id inner join test_country c on country = account_country group by F.SELLER_ID_AND_COUNTRY_NAME http://git-wip-us.apache.org/repos/asf/kylin/blob/68b2b305/kylin-it/src/test/resources/query/sql_computedcolumn/query04.sql.compare ---------------------------------------------------------------------- diff --git a/kylin-it/src/test/resources/query/sql_computedcolumn/query04.sql.compare b/kylin-it/src/test/resources/query/sql_computedcolumn/query04.sql.compare new file mode 100644 index 0000000..5ee361d --- /dev/null +++ b/kylin-it/src/test/resources/query/sql_computedcolumn/query04.sql.compare @@ -0,0 +1,2 @@ +select count(*) as a, sum (F.PRICE * F.ITEM_COUNT) as b from test_kylin_fact f + inner join test_account a on f.seller_id = a.account_id inner join test_country c on country = account_country group by CONCAT(A.ACCOUNT_ID, C.NAME)