Repository: kylin Updated Branches: refs/heads/KYLIN-1875 e821bf2ca -> be9dfe52c
KYLIN 1875 update modify alias Signed-off-by: zhongjian <jiat...@163.com> Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/be9dfe52 Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/be9dfe52 Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/be9dfe52 Branch: refs/heads/KYLIN-1875 Commit: be9dfe52ca5a589ff47fef10790924b8627140e7 Parents: e821bf2 Author: chenzhx <346839...@qq.com> Authored: Wed Dec 14 16:33:31 2016 +0800 Committer: zhongjian <jiat...@163.com> Committed: Wed Dec 14 16:48:30 2016 +0800 ---------------------------------------------------------------------- webapp/app/css/AdminLTE.css | 5 + webapp/app/js/controllers/modelDataModel.js | 141 ++++++++++++------- webapp/app/js/controllers/modelEdit.js | 8 +- webapp/app/js/services/tree.js | 3 + .../app/partials/modelDesigner/data_model.html | 25 ++-- 5 files changed, 119 insertions(+), 63 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/be9dfe52/webapp/app/css/AdminLTE.css ---------------------------------------------------------------------- diff --git a/webapp/app/css/AdminLTE.css b/webapp/app/css/AdminLTE.css index 6688457..857dbf7 100644 --- a/webapp/app/css/AdminLTE.css +++ b/webapp/app/css/AdminLTE.css @@ -4744,6 +4744,11 @@ Gradient Background colors opacity: 1; filter: alpha(opacity=100); } +.model_graph svg{ + width:1100px !important; + height:600px !important; +} + /* * Misc: print http://git-wip-us.apache.org/repos/asf/kylin/blob/be9dfe52/webapp/app/js/controllers/modelDataModel.js ---------------------------------------------------------------------- diff --git a/webapp/app/js/controllers/modelDataModel.js b/webapp/app/js/controllers/modelDataModel.js index a09101b..b6edd43 100644 --- a/webapp/app/js/controllers/modelDataModel.js +++ b/webapp/app/js/controllers/modelDataModel.js @@ -22,7 +22,7 @@ KylinApp.controller('ModelDataModelCtrl', function ($location,$scope, $modal,cub $scope.modelsManager = modelsManager; angular.forEach($scope.modelsManager.selectedModel.lookups,function(joinTable){ if(!joinTable.alias){ - joinTable.alias=VdmUtil.removeNameSpace(joinTable.table); + joinTable.alias=VdmUtil.removeNameSpace(joinTable.table); } }); $scope.init = function (){ @@ -110,10 +110,21 @@ KylinApp.controller('ModelDataModelCtrl', function ($location,$scope, $modal,cub $scope.editLookup = function (lookup) { $scope.lookupState.editingIndex = lookupList.indexOf(lookup); $scope.lookupState.editing = true; - // Make a copy of model will be editing. $scope.newLookup = angular.copy(lookup); + $scope.newLookup.join.pk_type = []; + $scope.newLookup.join.fk_type = []; + $scope.newLookup.join.isCompatible=[]; $scope.newLookup.joinTable=VdmUtil.getNameSpaceTopName($scope.newLookup.join.foreign_key[0]); + angular.forEach($scope.newLookup.join.primary_key,function(pk,index){ + $scope.newLookup.join.pk_type[index] = TableModel.getColumnType(VdmUtil.removeNameSpace(pk),$scope.newLookup.table); + $scope.newLookup.join.fk_type[index] = TableModel.getColumnType(VdmUtil.removeNameSpace($scope.newLookup.join.foreign_key[index]),$scope.aliasTableMap[$scope.newLookup.joinTable]); + if($scope.newLookup.join.pk_type[index]!==$scope.newLookup.join.fk_type[index]){ + $scope.newLookup.join.isCompatible[index]=false; + }else{ + $scope.newLookup.join.isCompatible[index]=true; + } + }); $scope.openLookupModal(); }; @@ -129,24 +140,51 @@ KylinApp.controller('ModelDataModelCtrl', function ($location,$scope, $modal,cub $scope.doneEditLookup = function () { // Copy edited model to destination model. - $scope.aliasTableMap[VdmUtil.removeNameSpace($scope.modelsManager.selectedModel.fact_table)]=$scope.modelsManager.selectedModel.fact_table; - $scope.aliasName=[VdmUtil.removeNameSpace($scope.modelsManager.selectedModel.fact_table)]; angular.copy($scope.newLookup, lookupList[$scope.lookupState.editingIndex]); - angular.forEach(lookupList,function(joinTable){ - $scope.aliasName.push(joinTable.alias); - $scope.aliasTableMap[joinTable.alias]=joinTable.table; - // $scope.tableAliasMap[joinTable.alias]=joinTable.table; - }); + var oldAlias=$scope.aliasName[$scope.lookupState.editingIndex+1]; + var newAlias=$scope.newLookup.alias; + if(oldAlias!=newAlias){ + $scope.aliasName[$scope.lookupState.editingIndex+1]=newAlias; + for(var i=0;i<$scope.newLookup.join.primary_key.length;i++){ + $scope.newLookup.join.primary_key[i]=$scope.newLookup.join.primary_key[i].replace(oldAlias+'.',newAlias+'.'); + } + + delete $scope.aliasTableMap[oldAlias]; + $scope.aliasTableMap[newAlias]=$scope.newLookup.table; + + for(var i=0;i<lookupList.length;i++){ + for(var j=0;j<lookupList[i].join.foreign_key.length;j++){ + lookupList[i].join.foreign_key[j]=lookupList[i].join.foreign_key[j].replace(oldAlias+'.',newAlias+'.'); + } + } + + for(var i=0;i<modelsManager.selectedModel.dimensions.length;i++){ + if(modelsManager.selectedModel.dimensions[i].table==oldAlias){ + modelsManager.selectedModel.dimensions[i].table=newAlias; + } + } + + if($scope.newLookup.kind=="FACT"){ + for(var i=0;i< modelsManager.selectedModel.metrics.length;i++){ + modelsManager.selectedModel.metrics[i]= modelsManager.selectedModel.metrics[i].replace(oldAlias+'.',newAlias+'.'); + } + modelsManager.selectedModel.partition_desc.partition_date_column = modelsManager.selectedModel.partition_desc.partition_date_column.replace(oldAlias+'.',newAlias+'.'); + } + } + angular.copy($scope.newLookup,lookupList[$scope.lookupState.editingIndex]); $scope.resetParams(); }; $scope.changeFactTable = function () { - delete $scope.aliasTableMap[VdmUtil.removeNameSpace($scope.modelsManager.selectedModel.fact_table)]; + $scope.aliasTableMap={}; $scope.aliasTableMap[VdmUtil.removeNameSpace($scope.FactTable.root)]=$scope.FactTable.root; - delete $scope.tableAliasMap[$scope.modelsManager.selectedModel.fact_table]; + $scope.tableAliasMap={}; $scope.tableAliasMap[$scope.FactTable.root]=VdmUtil.removeNameSpace($scope.FactTable.root); - $scope.aliasName.splice($scope.aliasName.indexOf(VdmUtil.removeNameSpace($scope.modelsManager.selectedModel.fact_table)),1); - $scope.aliasName.push(VdmUtil.removeNameSpace($scope.FactTable.root)); + $scope.aliasName=[VdmUtil.removeNameSpace($scope.FactTable.root)]; + modelsManager.selectedModel.lookups = []; + modelsManager.selectedModel.dimensions = []; + modelsManager.selectedModel.metrics= []; + modelsManager.selectedModel.partition_desc.partition_date_column = null; $scope.modelsManager.selectedModel.fact_table=$scope.FactTable.root; } $scope.changeJoinTable = function () { @@ -158,7 +196,7 @@ KylinApp.controller('ModelDataModelCtrl', function ($location,$scope, $modal,cub $scope.removeLookup = function (lookup) { var dimExist = _.some(modelsManager.selectedModel.dimensions,function(item,index){ - return item.alias===lookup.alias; + return item.table===lookup.alias; }); if(dimExist) { SweetAlert.swal({ @@ -172,7 +210,7 @@ KylinApp.controller('ModelDataModelCtrl', function ($location,$scope, $modal,cub }, function (isConfirm) { if (isConfirm) { for (var i = modelsManager.selectedModel.dimensions.length - 1; i >= 0; i--) { - if (modelsManager.selectedModel.dimensions[i].alias === lookup.alias) { + if (modelsManager.selectedModel.dimensions[i].table === lookup.alias) { modelsManager.selectedModel.dimensions.splice(i, 1); } } @@ -187,13 +225,13 @@ KylinApp.controller('ModelDataModelCtrl', function ($location,$scope, $modal,cub } $scope.changeKey = function(index){ - var join_table = $scope.newLookup.jointable; + var join_table = $scope.newLookup.joinTable; var lookup_table = $scope.newLookup.table; var pk_column = $scope.newLookup.join.primary_key[index]; var fk_column = $scope.newLookup.join.foreign_key[index]; if(pk_column!=='null'&&fk_column!=='null'){ - $scope.newLookup.join.pk_type[index] = TableModel.getColumnType(pk_column,lookup_table); - $scope.newLookup.join.fk_type[index] = TableModel.getColumnType(fk_column,join_table); + $scope.newLookup.join.pk_type[index] = TableModel.getColumnType(VdmUtil.removeNameSpace(pk_column),$scope.newLookup.table); + $scope.newLookup.join.fk_type[index] = TableModel.getColumnType(VdmUtil.removeNameSpace(fk_column),$scope.aliasTableMap[$scope.newLookup.joinTable]); if($scope.newLookup.join.pk_type[index]!==$scope.newLookup.join.fk_type[index]){ $scope.newLookup.join.isCompatible[index]=false; }else{ @@ -226,34 +264,43 @@ KylinApp.controller('ModelDataModelCtrl', function ($location,$scope, $modal,cub }; $scope.checkLookupForm = function(){ - var errors = []; - // null validate - for(var i = 0;i<$scope.newLookup.join.primary_key.length;i++){ - if($scope.newLookup.join.primary_key[i]==='null'){ - errors.push("Primary Key can't be null."); - break; - } - } - for(var i = 0;i<$scope.newLookup.join.foreign_key.length;i++){ - if($scope.newLookup.join.foreign_key[i]==='null'){ - errors.push("Foreign Key can't be null."); - break; - } - } - - var errorInfo = ""; - angular.forEach(errors,function(item){ - errorInfo+="\n"+item; - }); - if(errors.length){ -// SweetAlert.swal('Warning!', errorInfo, ''); - SweetAlert.swal('', errorInfo, 'warning'); - return false; - }else{ - return true; - } - + var errors = []; + for(var i = 0;i<$scope.newLookup.join.primary_key.length;i++){ + if($scope.newLookup.join.primary_key[i]==='null'){ + errors.push("Primary Key can't be null."); + break; + } + } + for(var i = 0;i<$scope.newLookup.join.foreign_key.length;i++){ + if($scope.newLookup.join.foreign_key[i]==='null'){ + errors.push("Foreign Key can't be null."); + break; + } + } + if($scope.aliasName.indexOf($scope.newLookup.alias)!=-1&&$scope.lookupState.editing == false){ + errors.push("Table Alias ["+$scope.newLookup.alias+"] already exist!"); + } + if($scope.aliasName.indexOf($scope.newLookup.alias)!=-1&&$scope.aliasName[$scope.lookupState.editingIndex+1] != $scope.newLookup.alias){ + errors.push("Table Alias ["+$scope.newLookup.alias+"] already exist!"); + } + var errorInfo = ""; + angular.forEach(errors,function(item){ + errorInfo+="\n"+item; + }); + if(errors.length){ + SweetAlert.swal('', errorInfo, 'warning'); + return false; + }else{ + return true; + } }; - - + $scope.filterNotRoot = function (item) { + return item.name!==modelsManager.selectedModel.fact_table; + }; +/* $scope.$watch('$scope.newLookup.alias', function (newValue, oldValue) { + if (newValue&&$scope.lookupState.editing ) { + console.log(newValue); + console.log(oldValue); + } + });*/ }); http://git-wip-us.apache.org/repos/asf/kylin/blob/be9dfe52/webapp/app/js/controllers/modelEdit.js ---------------------------------------------------------------------- diff --git a/webapp/app/js/controllers/modelEdit.js b/webapp/app/js/controllers/modelEdit.js index 4d1e12c..fd78d03 100644 --- a/webapp/app/js/controllers/modelEdit.js +++ b/webapp/app/js/controllers/modelEdit.js @@ -19,7 +19,7 @@ 'use strict'; -KylinApp.controller('ModelEditCtrl', function ($scope, $q, $routeParams, $location, $templateCache, $interpolate, MessageService, TableService, CubeDescService, ModelService, loadingRequest, SweetAlert,$log,cubeConfig,CubeDescModel,ModelDescService,MetaModel,TableModel,ProjectService,ProjectModel,modelsManager,VdmUtil) { +KylinApp.controller('ModelEditCtrl', function ($scope, $q, $routeParams, $location, $templateCache, $interpolate, MessageService, TableService, CubeDescService, ModelService, loadingRequest, SweetAlert,$log,cubeConfig,CubeDescModel,ModelDescService,MetaModel,TableModel,ProjectService,ProjectModel,modelsManager, CubeService, VdmUtil) { //add or edit ? var absUrl = $location.absUrl(); $scope.tableAliasMap={}; @@ -93,9 +93,9 @@ KylinApp.controller('ModelEditCtrl', function ($scope, $q, $routeParams, $locati ModelDescService.query({model_name: modelName}, function (model) { if (model) { modelsManager.selectedModel = model; - if($scope.modelsManager.selectedModel.partition_desc.partition_time_column){ - $scope.partitionColumn.hasSeparateTimeColumn = true; - } + CubeService.list({modelName:model.name}, function (_cubes) { + $scope.cubesLength = _cubes.length; + }); modelsManager.selectedModel.project = ProjectModel.getProjectByCubeModel(modelName); if(!ProjectModel.getSelectedProject()){ ProjectModel.setSelectedProject(modelsManager.selectedModel.project); http://git-wip-us.apache.org/repos/asf/kylin/blob/be9dfe52/webapp/app/js/services/tree.js ---------------------------------------------------------------------- diff --git a/webapp/app/js/services/tree.js b/webapp/app/js/services/tree.js index 08e290b..20de19b 100755 --- a/webapp/app/js/services/tree.js +++ b/webapp/app/js/services/tree.js @@ -47,6 +47,9 @@ KylinApp.service('ModelGraphService', function (VdmUtil) { model.graph = (!!model.graph) ? model.graph : {}; angular.forEach(model.lookups,function (lookup, index) { + if(!lookup.alias){ + lookup.alias=VdmUtil.removeNameSpace(lookup.table); + } if (lookup.join && lookup.join.primary_key.length > 0) { var dimensionNode={ "type": lookup.kind, http://git-wip-us.apache.org/repos/asf/kylin/blob/be9dfe52/webapp/app/partials/modelDesigner/data_model.html ---------------------------------------------------------------------- diff --git a/webapp/app/partials/modelDesigner/data_model.html b/webapp/app/partials/modelDesigner/data_model.html index f1192f4..e032cf9 100644 --- a/webapp/app/partials/modelDesigner/data_model.html +++ b/webapp/app/partials/modelDesigner/data_model.html @@ -29,7 +29,7 @@ <select chosen ng-model="FactTable.root" ng-if="state.mode=='edit'" ng-options="table.name as table.name for table in tableModel.selectProjectTables" style="width:100%;" ng-change="changeFactTable()" - name="table_name" + name="table_name" ng-disabled="cubesLength>0" ng-required="true" data-placeholder="Fact Table Name" class="chosen-select"> @@ -92,17 +92,18 @@ <ul class="list-unstyled"> <li ng-repeat="pk in lookup.join.primary_key track by $index"> <code>{{lookup.join.foreign_key[$index]}} = {{pk}}</code> + </li> </ul> </td> <td ng-if="state.mode=='edit'"> <!-- edit button --> - <button class="btn btn-xs btn-info" ng-disabled="lookupState.editing" - ng-click="editLookup(lookup)" tooltip="Edit Lookup"><i class="fa fa-pencil"></i> + <button class="btn btn-xs btn-info" ng-disabled="lookupState.editing||cubesLength>0" + ng-click="editLookup(lookup)" ><i class="fa fa-pencil"></i> </button> <!-- remove button --> - <button class="btn btn-xs btn-danger" ng-disabled="lookupState.editing" - ng-click="removeLookup(lookup)" tooltip="Remove Lookup"><i class="fa fa-trash-o"></i> + <button class="btn btn-xs btn-danger" ng-disabled="lookupState.editing||cubesLength>0" + ng-click="removeLookup(lookup)" ><i class="fa fa-trash-o"></i> </button> </td> </tr> @@ -126,17 +127,17 @@ <div> <select chosen ng-model="newLookup.joinTable" style="width: 45%" ng-options="table as table for table in aliasName" - name="table_name" + name="table_name" ng-disabled="lookupState.editing" ng-required="true" data-placeholder="Join Table Name" class="chosen-select"> <option value=""> -- Select Join Table -- </option> </select> <small class="help-block" ng-show="lookup_form.table_name.$invalid && (lookup_form.table_name.$dirty||forms.model_info_form.$submitted)">Table name required</small> - <b> </b> + <b> </b> <select chosen ng-model="newLookup.table" style="width: 45%" - ng-options="table.name as table.name for table in tableModel.selectProjectTables" - name="table_name" + ng-options="table.name as table.name for table in tableModel.selectProjectTables|filter:filterNotRoot" + name="table_name" ng-disabled="lookupState.editing" ng-required="true" ng-change="changeJoinTable()" data-placeholder="Join Table Name" class="chosen-select"> @@ -146,7 +147,6 @@ </div> <div class="space-4"></div> - <small class="help-block red" ng-show="newLookup.join.isCompatible[$index]==false"><i class="fa fa-exclamation-triangle"></i> <b>Column Type incompatible {{newLookup.join.foreign_key[$index]}}[{{newLookup.join.fk_type[$index]}}], {{newLookup.join.primary_key[$index]}} [{{newLookup.join.pk_type[$index]}}]</b></small> </div> </div> </div> @@ -154,8 +154,9 @@ <div class="row"> <label class="col-sm-3 control-label font-color-default"><b>Alias</b></label> <div class="col-sm-6"> - <input type="text" class="form-control " placeholder="Input Table Alias" ng-required="true" - ng-model="newLookup.alias" ng-change="changeAlias()" ng-disabled=""> + <input type="text" class="form-control " name="joinTable_alias" placeholder="Input Table Alias" ng-required="true" + ng-model="newLookup.alias" ng-change="changeAlias()" ng-pattern="/^\w+$/"> + <small class="help-block red" ng-show="!lookup_form.joinTable_alias.$error.required&&lookup_form.joinTable_alias.$invalid && (lookup_form.joinTable_alias.$dirty||lookup_form.$submitted)"><i class="fa fa-exclamation-triangle"></i> Alias is invalid.</small> </div> </div> </div>