From 1ebf8c1eaefb2775ed28d4919121777b119031ac Mon Sep 17 00:00:00 2001 From: kangkaisen Date: Wed, 30 Nov 2016 12:47:59 +0800 Subject: [PATCH] KYLIN-2237 Ensure dimensions and measures of model don't have null column --- .../apache/kylin/metadata/model/DataModelDesc.java | 30 +++++++++++++++++++--- webapp/app/js/controllers/modelDimensions.js | 5 ++++ webapp/app/js/controllers/modelMeasures.js | 7 +++-- .../app/partials/modelDesigner/model_measures.html | 2 ++ 4 files changed, 38 insertions(+), 6 deletions(-) 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 d917571..6c69bcf 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 @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.apache.commons.lang.ArrayUtils; import org.apache.kylin.common.KylinConfig; import org.apache.kylin.common.persistence.ResourceStore; import org.apache.kylin.common.persistence.RootPersistentEntity; @@ -153,7 +154,7 @@ public class DataModelDesc extends RootPersistentEntity { public JoinDesc getJoinByPKSide(TableRef table) { return joinsTree.getJoinByPKSide(table); } - + public JoinsTree getJoinsTree() { return joinsTree; } @@ -181,7 +182,7 @@ public class DataModelDesc extends RootPersistentEntity { } return false; } - + public boolean isFactTable(TableRef t) { if (t == null) return false; @@ -196,7 +197,7 @@ public class DataModelDesc extends RootPersistentEntity { } return false; } - + public boolean containsTable(String fullTableName) { for (TableRef t : allTableRefs) { if (t.getTableIdentity().equals(fullTableName)) @@ -204,7 +205,7 @@ public class DataModelDesc extends RootPersistentEntity { } return false; } - + public String getFilterCondition() { return filterCondition; } @@ -282,10 +283,31 @@ public class DataModelDesc extends RootPersistentEntity { initTableAlias(tables); initJoinColumns(); initJoinsTree(); + validateDimensions(dimensions); ModelDimensionDesc.capicalizeStrings(dimensions); + validateMetrics(metrics); initPartitionDesc(); } + private void validateDimensions(List dimensions) { + if (dimensions == null) { + throw new IllegalStateException("Model dimensions could not be null"); + } + + for (ModelDimensionDesc modelDimensionDesc : dimensions) { + String[] columns = modelDimensionDesc.getColumns(); + if (ArrayUtils.contains(columns, null)) { + throw new IllegalStateException(modelDimensionDesc.getTable() + " contains null column, please check"); + } + } + } + + private void validateMetrics(String[] metrics) { + if (ArrayUtils.contains(metrics, null)) { + throw new IllegalStateException("metrics contains null column, please check"); + } + } + private void initJoinTablesForUpgrade() { if (joinTables == null) { joinTables = new JoinTableDesc[0]; diff --git a/webapp/app/js/controllers/modelDimensions.js b/webapp/app/js/controllers/modelDimensions.js index 1b0e889..6cc70c7 100644 --- a/webapp/app/js/controllers/modelDimensions.js +++ b/webapp/app/js/controllers/modelDimensions.js @@ -40,6 +40,11 @@ KylinApp.controller('ModelDimensionsCtrl', function ($scope, $modal,MetaModel,mo $scope.availableTables.push(lookups[j].table); } + //ensure dimensions don't have null column + for (var i = 0; i < modelsManager.selectedModel.dimensions.length; i++) { + modelsManager.selectedModel.dimensions[i].columns = _.compact(modelsManager.selectedModel.dimensions[i].columns); + } + for(var i = 0;i<$scope.availableTables.length;i++){ var tableInUse = _.some(modelsManager.selectedModel.dimensions,function(item){ return item.table == $scope.availableTables[i]; diff --git a/webapp/app/js/controllers/modelMeasures.js b/webapp/app/js/controllers/modelMeasures.js index 01cd35a..17aaccd 100644 --- a/webapp/app/js/controllers/modelMeasures.js +++ b/webapp/app/js/controllers/modelMeasures.js @@ -22,6 +22,9 @@ 'use strict'; -KylinApp.controller('ModelMeasuresCtrl', function ($scope) { - +KylinApp.controller('ModelMeasuresCtrl', function ($scope, modelsManager) { + if ($scope.state.mode == 'edit') { + //ensure measures don't have null column + modelsManager.selectedModel.metrics = _.compact(modelsManager.selectedModel.metrics); + } }); diff --git a/webapp/app/partials/modelDesigner/model_measures.html b/webapp/app/partials/modelDesigner/model_measures.html index 20c73c3..6c7a48f 100644 --- a/webapp/app/partials/modelDesigner/model_measures.html +++ b/webapp/app/partials/modelDesigner/model_measures.html @@ -16,6 +16,7 @@ * limitations under the License. --> +
+
-- 2.9.3 (Apple Git-75)