KYLIN-2423 add toggle on whether allowed dup column in dim and metrics on data model
Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/eb472a33 Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/eb472a33 Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/eb472a33 Branch: refs/heads/master-hbase0.98 Commit: eb472a335856e4e7952edc7e34323f97c6453c5a Parents: 11617a9 Author: lidongsjtu <lid...@apache.org> Authored: Tue Feb 14 19:50:20 2017 +0800 Committer: lidongsjtu <lid...@apache.org> Committed: Tue Feb 14 19:50:32 2017 +0800 ---------------------------------------------------------------------- .../apache/kylin/common/KylinConfigBase.java | 4 +++ .../kylin/metadata/model/DataModelDesc.java | 32 +++++++++++--------- 2 files changed, 21 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/eb472a33/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java ---------------------------------------------------------------------- diff --git a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java index c77788b..fafa96d 100644 --- a/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java +++ b/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java @@ -329,6 +329,10 @@ abstract public class KylinConfigBase implements Serializable { return Boolean.parseBoolean(getOptional("kylin.cube.allow-appear-in-multiple-projects", "false")); } + public boolean allowModelDimensionMetricsOverlap() { + return Boolean.parseBoolean(getOptional("kylin.model.allow-dimension-metrics-overlap", "false")); + } + // ============================================================================ // JOB // ============================================================================ http://git-wip-us.apache.org/repos/asf/kylin/blob/eb472a33/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 86eea55..6b800bb 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 @@ -216,7 +216,7 @@ public class DataModelDesc extends RootPersistentEntity { public void setFilterCondition(String filterCondition) { this.filterCondition = filterCondition; } - + public PartitionDesc getPartitionDesc() { return partitionDesc; } @@ -297,7 +297,7 @@ public class DataModelDesc extends RootPersistentEntity { initJoinsTree(); initDimensionsAndMetrics(); initPartitionDesc(); - + boolean reinit = validate(); if (reinit) { // model slightly changed by validate() and must init() again init(config, tables); @@ -456,17 +456,19 @@ public class DataModelDesc extends RootPersistentEntity { for (String m : metrics) { mcols.add(findColumn(m)); } - - // validate no dup between dimensions/metrics - for (ModelDimensionDesc dim : dimensions) { - String table = dim.getTable(); - for (String c : dim.getColumns()) { - TblColRef dcol = findColumn(table, c); - if (mcols.contains(dcol)) - throw new IllegalStateException(dcol + " cannot be both dimension and metrics at the same time in " + this); + + if (!KylinConfig.getInstanceFromEnv().allowModelDimensionMetricsOverlap()) { + // validate no dup between dimensions/metrics + for (ModelDimensionDesc dim : dimensions) { + String table = dim.getTable(); + for (String c : dim.getColumns()) { + TblColRef dcol = findColumn(table, c); + if (mcols.contains(dcol)) + throw new IllegalStateException(dcol + " cannot be both dimension and metrics at the same time in " + this); + } } } - + // validate PK/FK are in dimensions boolean pkfkDimAmended = false; for (Chain chain : joinsTree.tableChains.values()) { @@ -478,9 +480,9 @@ public class DataModelDesc extends RootPersistentEntity { private boolean validatePkFkDim(JoinDesc join, Set<TblColRef> mcols) { if (join == null) return false; - + boolean pkfkDimAmended = false; - + for (TblColRef c : join.getForeignKeyColumns()) { if (!mcols.contains(c)) { pkfkDimAmended = validatePkFkDim(c) || pkfkDimAmended; @@ -503,7 +505,7 @@ public class DataModelDesc extends RootPersistentEntity { break; } } - + if (dimDesc == null) { dimDesc = new ModelDimensionDesc(); dimDesc.setTable(t); @@ -515,7 +517,7 @@ public class DataModelDesc extends RootPersistentEntity { dimDesc.setColumns(newCols); return true; } - + return false; }