Repository: kylin Updated Branches: refs/heads/master 2651640b7 -> 2814f612a
KYLIN 1321 Add derived checkbox for lookup table columns on Signed-off-by: Jason <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/5a448685 Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/5a448685 Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/5a448685 Branch: refs/heads/master Commit: 5a4486851523117e2944e57cd805d8c2d087078c Parents: 2651640 Author: chenzhx <346839...@qq.com> Authored: Mon Oct 24 10:49:05 2016 +0800 Committer: Jason <jiat...@163.com> Committed: Mon Oct 24 14:46:24 2016 +0800 ---------------------------------------------------------------------- webapp/app/js/controllers/cubeDimensions.js | 133 ++++++++------ .../app/partials/cubeDesigner/dimensions.html | 173 ++++++++----------- 2 files changed, 158 insertions(+), 148 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/5a448685/webapp/app/js/controllers/cubeDimensions.js ---------------------------------------------------------------------- diff --git a/webapp/app/js/controllers/cubeDimensions.js b/webapp/app/js/controllers/cubeDimensions.js index ab07451..5525fe4 100644 --- a/webapp/app/js/controllers/cubeDimensions.js +++ b/webapp/app/js/controllers/cubeDimensions.js @@ -18,7 +18,7 @@ 'use strict'; -KylinApp.controller('CubeDimensionsCtrl', function ($scope, $modal,MetaModel,cubesManager) { +KylinApp.controller('CubeDimensionsCtrl', function ($scope, $modal,MetaModel,cubesManager,SweetAlert) { $scope.cubeManager = cubesManager; // Available columns list derived from cube data model. @@ -74,7 +74,8 @@ KylinApp.controller('CubeDimensionsCtrl', function ($scope, $modal,MetaModel,cub cols[i].isLookup = false; // Default not selected and not disabled. - factSelectAvailable[cols[i].name] = {selected: false, disabled: false}; + factSelectAvailable[cols[i].name] = {name:cols[i].name ,selected: false, disabled: false}; + } $scope.availableColumns[factTable] = cols; @@ -95,7 +96,7 @@ KylinApp.controller('CubeDimensionsCtrl', function ($scope, $modal,MetaModel,cub cols2[k].isLookup = true; // Default not selected and not disabled. - lookupSelectAvailable[cols2[k].name] = {selected: false, disabled: false}; + lookupSelectAvailable[cols2[k].name] = {name:cols2[k].table+"_derived",selected: false, disabled: false}; } $scope.availableColumns[lookups[j].table] = cols2; @@ -112,8 +113,12 @@ KylinApp.controller('CubeDimensionsCtrl', function ($scope, $modal,MetaModel,cub var cols = dimCols(dim); angular.forEach(cols, function (colName) { - $scope.selectedColumns[dim.table][colName] = {selected: true, disabled: true}; - }); + if(dim.derived){ + $scope.selectedColumns[dim.table][colName] = {name:dim.name, selected: true, disabled: true,normal:"false"}; + }else{ + $scope.selectedColumns[dim.table][colName] = {name:dim.name, selected: true, disabled: true,normal:"true"}; + } + }); }); }; @@ -130,14 +135,14 @@ KylinApp.controller('CubeDimensionsCtrl', function ($scope, $modal,MetaModel,cub }; // Init the dimension, dimension name default as the column key. TODO new cube schema change. - var Dimension = function (table, selectedCols, dimType) { + var Dimension = function (name, table, selectedCols, dimType) { var origin = {name: '', table: table,derived:null,column:null}; switch (dimType) { case 'normal': // Default name as 1st column name. if (table && selectedCols.length) { - origin.name = table + '.' + selectedCols[0]; + origin.name = name; } origin.column = selectedCols[0]; @@ -145,20 +150,11 @@ KylinApp.controller('CubeDimensionsCtrl', function ($scope, $modal,MetaModel,cub case 'derived': if (table && selectedCols.length) { - origin.name = table + '_derived'; + origin.name = name; } origin.derived = selectedCols; break; - - //case 'hierarchy': - // if (table && selectedCols.length) { - // origin.name = table + '_hierarchy'; - // } - // - // origin.hierarchy = true; - // origin.column = selectedCols; - // break; } return origin; @@ -226,26 +222,6 @@ KylinApp.controller('CubeDimensionsCtrl', function ($scope, $modal,MetaModel,cub $scope.checkDimension = function(){ var errors = []; - // null validate - - //if($scope.dimType[0]=="hierarchy"){ - // if($scope.newDimension.column.length<2){ - // errors.push("Please define at least 2 hierarchy columns."); - // }else{ - // for(var i = 0;i<$scope.newDimension.column.length;i++){ - // if($scope.newDimension.column[i]===""){ - // errors.push("Hierarchy value can't be null."); - // break; - // } - // } - // var _columns = angular.copy($scope.newDimension.column).sort(); - // for(var i = 0;i<_columns.length-1;i++){ - // if(_columns[i]==_columns[i+1]&&_columns[i]!==""){ - // errors.push("Duplicate column "+_columns[i]+"."); - // } - // } - // } - //} if($scope.dimType[0]=="derived"){ if(!$scope.newDimension.derived.length){ @@ -323,7 +299,11 @@ KylinApp.controller('CubeDimensionsCtrl', function ($scope, $modal,MetaModel,cub var cols = dimCols(dim); angular.forEach(cols, function (colName) { - $scope.selectedColumns[dim.table][colName] = {selected: false, disabled: false}; + if(dim.table==$scope.metaModel.model.fact_table){ + $scope.selectedColumns[dim.table][colName] = {name:colName,selected: false, disabled: false}; + }else{ + $scope.selectedColumns[dim.table][colName] = {name:dim.table+"_derived",selected: false, disabled: false}; + } }); }; @@ -370,12 +350,18 @@ KylinApp.controller('CubeDimensionsCtrl', function ($scope, $modal,MetaModel,cub angular.forEach($scope.selectedColumns, function (value, table) { angular.forEach(value, function (status, colName) { - if (status.selected && !status.disabled) { + if (status.selected) { if (!selectedCols[table]) { selectedCols[table] = []; } - selectedCols[table].push(colName); + var cols={ + name:status.name, + col:colName, + normal:status.normal, + selected:status.selected + } + selectedCols[table].push(cols); } }); }); @@ -386,30 +372,79 @@ KylinApp.controller('CubeDimensionsCtrl', function ($scope, $modal,MetaModel,cub // Auto generate dimensions. $scope.autoGenDims = function () { var selectedCols = $scope.getSelectedCols(); - + dimList=[]; angular.forEach(selectedCols, function (cols, table) { if ($scope.metaModel.model.fact_table == table) { // Fact table: for each selected column, create one normal dimension. for (var i = 0; i < cols.length; i++) { - dimList.push(Dimension(table, [cols[i]], 'normal')); + dimList.push(Dimension(cols[i].name, table, [cols[i].col], 'normal')); } } else { // Per lookup table, create one derived dimension for all its selected columns; - if (cols.length) { - dimList.push(Dimension(table, cols, 'derived')); + for (var i = 0; i < cols.length; i++) { + if(cols[i].normal=="true"){ + dimList.push(Dimension(cols[i].name, table, [cols[i].col], 'normal')); + }else{ + dimList.push(Dimension(cols[i].name, table, [cols[i].col], 'derived')); + } } } }); + $scope.cubeMetaFrame.dimensions = dimList; + }; + $scope.autoChange= function(table,name){ + if($scope.selectedColumns[table][name].selected==false){ + $scope.selectedColumns[table][name].normal=null; + if(table==$scope.metaModel.model.fact_table){ + $scope.selectedColumns[table][name].name=name; + }else{ + $scope.selectedColumns[table][name].name=table+"_derived"; + } + }else{ + if($scope.metaModel.model.fact_table!=table){ + $scope.selectedColumns[table][name].normal="false"; + } + } + + } + $scope.checkAutoDimension=function(){ + var nameNull=false; + angular.forEach($scope.selectedColumns, function (value, table) { + angular.forEach(value, function (status, colName) { + if (status.selected) { + if(status.name==""){ + SweetAlert.swal('', "The name is requested.", 'warning'); + nameNull=true; + } + + } + }); + }); + if(nameNull==true){ + return false; + }else{ + return true; + } + } + + $scope.addNewDimension = function(newDimension){ + if(newDimension.derived==null){ + newDimension.derived=[]; + } + newDimension.derived.push(''); + } + + // Just reset the selected status of columns. $scope.resetGenDims = function () { var selectedCols = $scope.getSelectedCols(); - - angular.forEach(selectedCols, function (cols, table) { - for (var i = 0; i < cols.length; i++) { - $scope.selectedColumns[table][cols[i]].selected = false; - } + angular.forEach($scope.selectedColumns, function (value, table) { + angular.forEach(value, function (status, colName) { + status.selected=false; + status.normal=null; + }); }); }; http://git-wip-us.apache.org/repos/asf/kylin/blob/5a448685/webapp/app/partials/cubeDesigner/dimensions.html ---------------------------------------------------------------------- diff --git a/webapp/app/partials/cubeDesigner/dimensions.html b/webapp/app/partials/cubeDesigner/dimensions.html index a0a1506..4d48167 100644 --- a/webapp/app/partials/cubeDesigner/dimensions.html +++ b/webapp/app/partials/cubeDesigner/dimensions.html @@ -186,52 +186,6 @@ </div> </div> </div> - - <!--Hierarchy Dimension--> - <div class="form-group" ng-if="dimType.indexOf('hierarchy') >= 0"> - <div class="row"> - <div class="col-sm-6 col-sm-offset-3"> - <div ui-sortable="{containment: 'parent', placeholder: 'hierarchy-item-placeholder', forcePlaceholderSize: true, opacity: 0.8}" - ng-model="newDimension.column" class="hierarchy-container"> - <div ng-repeat="hierarchyIndex in [] | range: newDimension.column.length" class="hierarchy-item"> - <div class="row"> - <div class="col-xs-2"> - <span class="badge">{{$index + 1}}</span> - </div> - <div class="col-xs-8"> - <select chosen style="width: 100%" - data-placeholder="Dimension Hierarchy Column" - ng-model="newDimension.column[$index]" - ng-options="columns.name as columns.name for columns in getDimColumnsByTable(newDimension.table)" > - <option value="">-- Select Column --</option> - </select> - </div> - <div class="col-xs-2"> - <button type="button" class="pull-right btn btn-xs btn-danger" style="cursor: pointer " tooltip="Delete" - ng-click="newDimension.column.splice($index, 1);"> - <i class="fa fa-trash-o"></i> - </button> - </div> - </div> - </div> - </div> - - <div class="space-8"></div> - - <div class="row"> - <div class="col-xs-4"> - <button class="btn btn-xs btn-info" - ng-click="newDimension.column.push('');"> - <i class="fa fa-plus"></i> New Hierarchy</button> - </div> - <div class="col-xs-8"> - <p class="help-block">Drag level into the order you prefer.</p> - </div> - </div> - </div> - </div> - </div> - <!--Derived Dimension--> <div ng-if="dimType.indexOf('derived') >= 0"> <div class="form-group"> @@ -251,35 +205,13 @@ <div class="space-4"></div> </div> </div> - <button class="btn btn-xs btn-info" ng-click="newDimension.derived.push('');"> + <button class="btn btn-xs btn-info" ng-click="addNewDimension(newDimension);"> <i class="fa fa-plus"></i> New Derived</button> </div> </div> </div> </div> </div> - - <!--Tips--> - <div class="col-xs-4"> - <div class="box box-solid"> - <div class="box-header"> - <h4 class="box-title">Tips</h4> - </div> - <div class="box-body"> - <div class="row"> - <div class="col-xs-12"> - <ol class="text-info"> - <li>Type in any input box for auto suggestion</li> - <li>Pick up Fact Table from Star Schema Tables first</li> - <li>Data Type should match with Hive Table's Data Type</li> - <li>Join Type have to be same as will be used in query</li> - <li>Using Derived for One-One relationship between columns, like ID and Name</li> - </ol> - </div> - </div> - </div> - </div> - </div> </div> </ng-form> </div> @@ -291,31 +223,71 @@ <script type="text/ng-template" id="autoGenDimension.html"> - <div class="modal-header"> - <h4 class="box-title lighter">Auto Generate Dimensions <small>This is a helper for you to batch generate dimensions.</small></h4> + <div class="modal-header large-popover"> + <h4 class="box-title lighter">Auto Generate Dimensions <small>This is a helper for you to batch generate dimensions.</small><i kylinpopover placement="right" title="Auto Generate Rules" template="AutoDimensionsTip.html" class="fa fa-info-circle"></i></h4> </div> <div class="modal-body"> <div class="row"> - <div class="col-xs-8"> + <div class="col-xs-12"> <div class="box box-solid"> <div class="box-header"><h4>Columns</h4></div> <div class="box-body"> - <ul class="list-unstyled columns-region"> - <li ng-repeat="table in availableTables track by $index"> - <h5 class="table-name-underline"> - <b>{{table}}</b>{{$index == 0 ? ' [Fact Table]' : ' [Lookup Table]'}} - </h5> - <ul class="list-unstyled"> - <li ng-repeat="col in availableColumns[table] track by col.table + '.' + col.name"> - <label> - <input type="checkbox" ng-model="selectedColumns[table][col.name].selected" - ng-disabled="selectedColumns[table][col.name].disabled"> - {{col.name}} - </label> - </li> - </ul> - </li> - </ul> + <ul class="list-unstyled columns-region"> + <accordion close-others=false> + <!--FactTable--> + <div ng-repeat="table in availableTables track by $index" ng-if="$index == 0" accordion-group class="panel-default " heading="{{table}}{{dataKylin.cube.cubeDSFactTable}}" is-open=true> + <table class="table table-striped table-hover ng-scope"> + <tr > + <td class="col-xs-1"></td> + <td class="col-xs-4"><label>Name</label></td> + <td class="col-xs-3"><label>Columns</label></td> + <td colspan="2" class="col-xs-4"></td> + </tr> + <tr ng-repeat="col in availableColumns[table] track by col.table + '.' + col.name" > + <td > + <input type="checkbox" ng-model="selectedColumns[table][col.name].selected" + ng-disabled="selectedColumns[table][col.name].disabled" > + </td> + <td > + <input type="text" placeholder={{col.name}} ng-model="selectedColumns[table][col.name].name" ng-disabled="!selectedColumns[table][col.name].selected" style="width:90%;"> + </td> + <td> + {{col.name}} + </td> + </tr> + </table> + </div> + <!--LookUp Table--> + <div ng-repeat="table in availableTables track by $index" ng-if="$index > 0" accordion-group class="panel-default" heading="{{table}}{{dataKylin.cube.cubeDSLookupTable}}"> + <table class="table table-striped table-hover ng-scope"> + <tr class="row" > + <td class="col-xs-1"></td> + <td class="col-xs-4"><label>Name</label></td> + <td class="col-xs-3"><label>Columns</label></td> + <td colspan="2" class="col-xs-4"></td> + </tr> + <tr ng-repeat="col in availableColumns[table] track by col.table + '.' + col.name" class="row"> + <td class=> + <input type="checkbox" ng-model="selectedColumns[table][col.name].selected" + ng-disabled="selectedColumns[table][col.name].disabled" ng-change="autoChange(table,col.name)"> + </td> + <td > + <input type="text" ng-model="selectedColumns[table][col.name].name" placeholder={{table}}_derived ng-disabled="!selectedColumns[table][col.name].selected" style="width:90%;"> + </td> + <td > + {{col.name}} + </td> + <td > + <label> <input type="radio" ng-model="selectedColumns[table][col.name].normal" value="true" ng-disabled="!selectedColumns[table][col.name].selected"> Normal </label> + </td> + <td > + <label> <input type="radio" ng-model="selectedColumns[table][col.name].normal" value="false" ng-disabled="!selectedColumns[table][col.name].selected"> Derived </label> + </td> + </tr> + </table> + </div> + </accordion> + </ul> </div> </div> </div> @@ -324,27 +296,30 @@ <div class="col-xs-4"> <div class="box box-solid"> <div class="box-header"> - <h4 class="box-title">Auto Generate Rules</h4> + <h4 class="box-title"></h4> </div> <div class="box-body"> - <div class="row"> - <div class="col-xs-12"> - <ol class="text-info"> - <li>Column is disabled once there is already a dimension referred this column.</li> - <li>In fact table: one normal dimension will be auto generated per column.</li> - <li>In lookup table: one derived dimension will be auto generated for all the selected columns.</li> - </ol> - </div> - </div> + </div> </div> </div> </div> </div> <div class="modal-footer"> - <button class="btn btn-primary" ng-disabled="" ng-click="ok()">OK</button> + <button class="btn btn-primary" ng-disabled="" ng-click="checkAutoDimension()?ok():''">OK</button> <button class="btn btn-warning" ng-click="cancel()">Cancel</button> </div> </script> </ng-form> </div> +<script type="text/ng-template" id="AutoDimensionsTip.html"> + <div class="row"> + <div class="col-xs-12"> + <ol class="text-info"> + <li>Column is disabled once there is already a dimension referred this column.</li> + <li>In fact table: one normal dimension will be auto generated per column.</li> + <li>In lookup table: one derived dimension will be auto generated for all the selected columns.</li> + </ol> + </div> + </div> +</script>