This is an automated email from the ASF dual-hosted git repository. shaofengshi pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/kylin.git
commit 4b5fe6de6278f54751ed9a58c336b133895b05c9 Author: Emiya0306 <worfandsh...@qq.com> AuthorDate: Mon Jul 16 17:10:09 2018 +0800 KYLIN-3186 add partition_time other feature, abstract the 'initialPartitionSetting' method and enable the partition format editable of all data type - enable the partition format editable of all data type - optimize stylesheet for responsive style - add partition_time other feature and abstract the 'initialPartitionSetting' method but not enabled --- .../app/js/controllers/modelConditionsSettings.js | 113 ++++++++++++++++++--- webapp/app/js/model/cubeConfig.js | 12 ++- webapp/app/less/app.less | 14 +++ .../modelDesigner/conditions_settings.html | 48 ++++++--- 4 files changed, 155 insertions(+), 32 deletions(-) diff --git a/webapp/app/js/controllers/modelConditionsSettings.js b/webapp/app/js/controllers/modelConditionsSettings.js index 82abe0b..500db40 100644 --- a/webapp/app/js/controllers/modelConditionsSettings.js +++ b/webapp/app/js/controllers/modelConditionsSettings.js @@ -25,6 +25,12 @@ KylinApp.controller('ModelConditionsSettingsCtrl', function ($scope, $modal,MetaModel,modelsManager,VdmUtil) { $scope.modelsManager = modelsManager; $scope.availableFactTables = []; + // partition date temporary object. + // Because ng-chosen cannot watch string value, partition date should be object. + // firstValue: For fixing ng-chosen cannot watch first value change. + $scope.partition_date = { type: '', format: '', firstValue: '' }; + $scope.partition_time = { type: '', format: '', firstValue: '' }; + $scope.initSetting = function (){ $scope.selectedTables={fact:VdmUtil.getNameSpaceAliasName($scope.modelsManager.selectedModel.partition_desc.partition_date_column)} $scope.selectedTablesForPartitionTime={fact:VdmUtil.getNameSpaceAliasName($scope.modelsManager.selectedModel.partition_desc.partition_time_column)} @@ -35,31 +41,94 @@ KylinApp.controller('ModelConditionsSettingsCtrl', function ($scope, $modal,Meta $scope.availableFactTables.push(joinTable[j].alias); } } + + $scope.initialPartitionSetting('Date'); + $scope.initialPartitionSetting('Time'); } $scope.isFormatEdit = {editable:false}; + + /** + * initial date or time partition select + * + * @param {String: 'Date' | 'Time'} partitionFieldName + * @desc cubeConfigName: 'partitionDateFormatOpt' or 'partitionTimeFormatOpt' + * modelFormatKey: 'partition_date_format' or 'partition_time_format' + * scopeName: 'partition_date' or 'partition_time' + */ + $scope.initialPartitionSetting = function(partitionFieldName) { + var cubeConfigName = 'partition' + partitionFieldName + 'FormatOpt'; + + var lowerCaseName = partitionFieldName.toLowerCase(), + modelFormatKey = 'partition_' + lowerCaseName + '_format', + scopeName = 'partition_' + lowerCaseName, + scopePartitionTypeWatchName = 'partition_' + lowerCaseName + '.type', + scopePartitionFormatWatchName = 'partition_' + lowerCaseName + '.format'; + + var partitionFormatOpt = $scope.cubeConfig[cubeConfigName]; + var partition_format = $scope.modelsManager.selectedModel.partition_desc[modelFormatKey]; + + if(partitionFormatOpt.indexOf(partition_format) === -1) { + $scope[scopeName].type = 'other'; + $scope[scopeName].format = partition_format; + $scope[scopeName].firstValue = partition_format; + } else { + $scope[scopeName].type = partition_format; + $scope[scopeName].format = ''; + $scope[scopeName].firstValue = partition_format; + } + + // Add form change watcher. SetTimeout can escape the first render loop. + setTimeout(function() { + $scope.$watch(scopePartitionTypeWatchName, function (newValue, oldValue) { + // Ng-chosen will change the value of all selects on DOM when you select each first. + // So for fixing this bug, we should compare the newValue and oldValue. + // firstValue: For fixing ng-chosen cannot watch first value change. + if(newValue !== oldValue || ($scope[scopeName].firstValue && $scope[scopeName].firstValue !== newValue && newValue !== 'other')) { + if(newValue !== 'other') { + $scope.modelsManager.selectedModel.partition_desc[modelFormatKey] = $scope[scopeName].format = newValue; + } else { + $scope[scopeName].format = ''; + } + $scope[scopeName].firstValue = ''; + } + }); + + $scope.$watch(scopePartitionFormatWatchName, function (newValue, oldValue) { + if(newValue !== oldValue) { + $scope.modelsManager.selectedModel.partition_desc[modelFormatKey] = newValue; + } + }); + }); + }; + var judgeFormatEditable = function(dateColumn){ if(dateColumn == null){ $scope.isFormatEdit.editable = false; return; } - var column = _.filter($scope.getColumnsByAlias(VdmUtil.getNameSpaceAliasName(dateColumn)),function(_column){ - var columnName=VdmUtil.getNameSpaceAliasName(dateColumn)+"."+_column.name; - if(dateColumn == columnName){ - return _column; - } - }); - var data_type = column[0].datatype; - if(data_type ==="bigint" ||data_type ==="int" ||data_type ==="integer"){ - $scope.isFormatEdit.editable = false; - $scope.modelsManager.selectedModel.partition_desc.partition_date_format='yyyyMMdd'; - $scope.partitionColumn.hasSeparateTimeColumn=false; - $scope.modelsManager.selectedModel.partition_desc.partition_time_column=null; - $scope.modelsManager.selectedModel.partition_desc.partition_time_format=null; + /** + * enable the partition format editable of all data type + * Edit date: 2018/07/12 + * Author: Roger + */ + // var column = _.filter($scope.getColumnsByAlias(VdmUtil.getNameSpaceAliasName(dateColumn)),function(_column){ + // var columnName=VdmUtil.getNameSpaceAliasName(dateColumn)+"."+_column.name; + // if(dateColumn == columnName){ + // return _column; + // } + // }); + // var data_type = column[0].datatype; + // if(data_type ==="bigint" ||data_type ==="int" ||data_type ==="integer"){ + // $scope.isFormatEdit.editable = false; + // $scope.modelsManager.selectedModel.partition_desc.partition_date_format='yyyyMMdd'; + // $scope.partitionColumn.hasSeparateTimeColumn=false; + // $scope.modelsManager.selectedModel.partition_desc.partition_time_column=null; + // $scope.modelsManager.selectedModel.partition_desc.partition_time_format=null; - return; - } + // return; + // } $scope.isFormatEdit.editable = true; return; @@ -96,6 +165,20 @@ KylinApp.controller('ModelConditionsSettingsCtrl', function ($scope, $modal,Meta "hasSeparateTimeColumn" : false } + $scope.addFormValueWatcher = function() { + $scope.$watch('partition_date.type', function (newValue) { + if(newValue !== 'other') { + $scope.modelsManager.selectedModel.partition_desc.partition_date_format = $scope.partition_date.format = newValue; + } else { + $scope.partition_date.format = ''; + } + }); + + $scope.$watch('partition_date.format', function (newValue) { + $scope.modelsManager.selectedModel.partition_desc.partition_date_format = newValue; + }); + }; + if ($scope.state.mode=='edit'){ $scope.initSetting(); judgeFormatEditable($scope.modelsManager.selectedModel.partition_desc.partition_date_column); diff --git a/webapp/app/js/model/cubeConfig.js b/webapp/app/js/model/cubeConfig.js index eacb915..a83d4c9 100644 --- a/webapp/app/js/model/cubeConfig.js +++ b/webapp/app/js/model/cubeConfig.js @@ -96,14 +96,22 @@ KylinApp.constant('cubeConfig', { {name:"minute_start",type:"timestamp"} ], partitionDateFormatOpt:[ + 'yyyy-MM-dd HH:mm:ss', + 'yyyy-MM-dd HH:mm', + 'yyyy-MM-dd HH', 'yyyy-MM-dd', + 'yyyyMMddHHMMSS', + 'yyyyMMddHHMM', + 'yyyyMMddHH', 'yyyyMMdd', - 'yyyy-MM-dd HH:mm:ss' + // 'timestamp', + // 'other' ], partitionTimeFormatOpt:[ 'HH:mm:ss', 'HH:mm', - 'HH' + 'HH', + // 'other' ], rowKeyShardOptions:[ true,false diff --git a/webapp/app/less/app.less b/webapp/app/less/app.less index 7aa7283..cf9748e 100644 --- a/webapp/app/less/app.less +++ b/webapp/app/less/app.less @@ -936,4 +936,18 @@ td.snapshot-usage .tooltip { } td.snapshot-usage .tooltip-inner { max-width: 1024px; +} + +div[ng-controller="ModelConditionsSettingsCtrl"] { + .format-input { + margin-top: 15px; + } + select.col-5 + .chosen-container { + width: 49% !important; + } + .format-input.col-5 { + display: inline-block; + width: 49%; + margin-top: 0; + } } \ No newline at end of file diff --git a/webapp/app/partials/modelDesigner/conditions_settings.html b/webapp/app/partials/modelDesigner/conditions_settings.html index cce5de2..10aee84 100644 --- a/webapp/app/partials/modelDesigner/conditions_settings.html +++ b/webapp/app/partials/modelDesigner/conditions_settings.html @@ -27,7 +27,7 @@ <div class="row middle-popover"> <label class="control-label col-xs-12 col-sm-3 no-padding-right font-color-default"><b>Partition Date Column</b> <i kylinpopover placement="right" title="Partition Date Column" template="partitionTip.html" class="fa fa-info-circle"></i></label> <div class="col-xs-12 col-sm-6" ng-if="state.mode=='edit'"> - <select style="width: 49%" chosen data-placeholder="e.g. DEFAULT.TEST_KYLIN_FACT.CAL_DT" + <select width="'49%'" chosen data-placeholder="e.g. DEFAULT.TEST_KYLIN_FACT.CAL_DT" ng-model="selectedTables.fact" ng-change="tableChange(selectedTables.fact)" data-placement="" @@ -35,7 +35,7 @@ <option value="">--Select Partition Table--</option> </select> - <select style="width: 49%" chosen data-placeholder="e.g. DEFAULT.TEST_KYLIN_FACT.CAL_DT" + <select width="'49%'" chosen data-placeholder="e.g. DEFAULT.TEST_KYLIN_FACT.CAL_DT" ng-model="modelsManager.selectedModel.partition_desc.partition_date_column" ng-change="partitionChange(modelsManager.selectedModel.partition_desc.partition_date_column)" data-placement="" @@ -57,15 +57,24 @@ <div class="row"> <label class="control-label col-xs-12 col-sm-3 no-padding-right font-color-default"><b>Date Format</b></label> <div class="col-xs-12 col-sm-6"> - <select style="width: 100%" chosen - ng-required="modelsManager.selectedModel.partition_desc.partition_date_format" - ng-model="modelsManager.selectedModel.partition_desc.partition_date_format" + <select chosen + width="'98.5%'" ng-if="state.mode=='edit'" + ng-model="partition_date.type" + ng-required="partition_date.type" ng-disabled="$parent.isFormatEdit.editable!==true" - data-placement="" - ng-options="ddt as ddt for ddt in cubeConfig.partitionDateFormatOpt"> + ng-class="{ 'col-5': partition_date.type === 'other' }" + ng-options="ddt as ddt for ddt in cubeConfig.partitionDateFormatOpt" + data-placement=""> <option value="">--Select Date Format--</option> </select> + <input + class="form-control format-input" + ng-if="partition_date.type === 'other'" + ng-model="partition_date.format" + ng-required="partition_date.format" + ng-class="{ 'col-5': partition_date.type === 'other' }" + placeholder="Please enter your custom date format."/> <span ng-if="state.mode=='view'&&modelsManager.selectedModel.partition_desc.partition_date_column">{{(modelsManager.selectedModel.partition_desc.partition_date_format)}}</span> </div> </div> @@ -85,14 +94,14 @@ <div class="row middle-popover"> <label class="control-label col-xs-12 col-sm-3 no-padding-right font-color-default align-right"><b>Partition Time Column </b> <i kylinpopover placement="right" ng-title="Partition Time Column" template="partitionTimeTip.html" class="fa fa-info-circle"></i> </label> <div class="col-xs-12 col-sm-6"> - <select style="width: 49%" chosen + <select width="'49%'" chosen ng-model="selectedTablesForPartitionTime.fact" ng-if="state.mode=='edit'" data-placement="" ng-options="alias as alias for alias in availableFactTables" > <option value="">--Select Partition Table--</option> </select> - <select style="width: 49%" chosen + <select width="'49%'" chosen ng-model="modelsManager.selectedModel.partition_desc.partition_time_column" ng-if="state.mode=='edit'" data-placement="" @@ -109,14 +118,23 @@ <div class="row"> <label class="control-label col-xs-12 col-sm-3 no-padding-right font-color-default"><b>Time Format</b></label> <div class="col-xs-12 col-sm-6"> - <select style="width: 100%" chosen - ng-required="modelsManager.selectedModel.partition_desc.partition_time_format" - ng-model="modelsManager.selectedModel.partition_desc.partition_time_format" - ng-if="state.mode=='edit'" - data-placement="" - ng-options="ddt as ddt for ddt in cubeConfig.partitionTimeFormatOpt"> + <select chosen + width="'98.5%'" + ng-if="state.mode=='edit'" + ng-model="partition_time.type" + ng-required="partition_time.type" + ng-class="{ 'col-5': partition_time.type === 'other' }" + ng-options="ddt as ddt for ddt in cubeConfig.partitionTimeFormatOpt" + data-placement=""> <option value="">--Select Time Format--</option> </select> + <input + class="form-control format-input" + ng-if="partition_time.type === 'other'" + ng-model="partition_time.format" + ng-required="partition_time.format" + ng-class="{ 'col-5': partition_time.type === 'other' }" + placeholder="Please enter your custom time format."/> <span ng-if="state.mode=='view'&&modelsManager.selectedModel.partition_desc.partition_time_column">{{(modelsManager.selectedModel.partition_desc.partition_time_format)}}</span> </div> </div>