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/788c7313 Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/788c7313 Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/788c7313 Branch: refs/heads/master Commit: 788c731337cf76aab14ac388fa06782943cdf711 Parents: 6e28a02 Author: Hongbin Ma <mahong...@apache.org> Authored: Mon Aug 21 22:10:36 2017 +0800 Committer: Hongbin Ma <m...@kyligence.io> Committed: Mon Aug 21 22:55:59 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/788c7313/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/788c7313/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 fd609b8..a5da833 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 @@ -501,7 +501,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/788c7313/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/788c7313/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)