You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by li...@apache.org on 2016/09/03 06:37:29 UTC
[22/50] [abbrv] kylin git commit: KYLIN-1904-WEB-Global-Dictionary
KYLIN-1904-WEB-Global-Dictionary
Signed-off-by: Jason <ji...@163.com>
Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/1f4675fc
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/1f4675fc
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/1f4675fc
Branch: refs/heads/1.5.x-HBase1.x
Commit: 1f4675fc81c8e8bcad847b4cb405b9f302e3b6d4
Parents: ab6b73b
Author: zx chen <34...@qq.com>
Authored: Thu Aug 25 13:37:24 2016 +0800
Committer: Jason <ji...@163.com>
Committed: Mon Aug 29 11:31:44 2016 +0800
----------------------------------------------------------------------
webapp/app/js/controllers/cubeAdvanceSetting.js | 114 +++++++++++++-
webapp/app/js/controllers/cubeEdit.js | 25 +++-
webapp/app/js/model/cubeDescModel.js | 9 ++
.../cubeDesigner/advanced_settings.html | 150 +++++++++++++++----
4 files changed, 264 insertions(+), 34 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/kylin/blob/1f4675fc/webapp/app/js/controllers/cubeAdvanceSetting.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/controllers/cubeAdvanceSetting.js b/webapp/app/js/controllers/cubeAdvanceSetting.js
index 09fb3d4..be90f65 100644
--- a/webapp/app/js/controllers/cubeAdvanceSetting.js
+++ b/webapp/app/js/controllers/cubeAdvanceSetting.js
@@ -18,14 +18,14 @@
'use strict';
-KylinApp.controller('CubeAdvanceSettingCtrl', function ($scope, $modal,cubeConfig,MetaModel,cubesManager,CubeDescModel) {
+KylinApp.controller('CubeAdvanceSettingCtrl', function ($scope, $modal,cubeConfig,MetaModel,cubesManager,CubeDescModel,SweetAlert) {
$scope.cubesManager = cubesManager;
//rowkey
$scope.convertedRowkeys = [];
angular.forEach($scope.cubeMetaFrame.rowkey.rowkey_columns,function(item){
- //var _isDictionary = item.encoding === "dict"?"true":"false";
+ //var _isDictionaries = item.encoding === "dict"?"true":"false";
var _isFixedLength = item.encoding.substring(0,12) === "fixed_length"?"true":"false";//fixed_length:12
var _isIntLength = item.encoding.substring(0,3) === "int"?"true":"false";//fixed_length:12
var _encoding = item.encoding;
@@ -195,4 +195,114 @@ KylinApp.controller('CubeAdvanceSettingCtrl', function ($scope, $modal,cubeConfi
}
+ $scope.isReuse=false;
+ $scope.addNew=false;
+ $scope.newDictionaries = {
+ "column":null,
+ "builder": null,
+ "reuse": null
+ }
+
+ $scope.initUpdateDictionariesStatus = function(){
+ $scope.updateDictionariesStatus = {
+ isEdit:false,
+ editIndex:-1
+ }
+ };
+ $scope.initUpdateDictionariesStatus();
+
+
+ $scope.addNewDictionaries = function (dictionaries, index) {
+ if(dictionaries&&index>=0){
+ $scope.updateDictionariesStatus.isEdit = true;
+ $scope.addNew=true;
+ $scope.updateDictionariesStatus.editIndex = index;
+ if(dictionaries.builder==null){
+ $scope.isReuse=true;
+ }
+ else{
+ $scope.isReuse=false;
+ }
+ }
+ else{
+ $scope.addNew=!$scope.addNew;
+ }
+ $scope.newDictionaries = (!!dictionaries)? jQuery.extend(true, {},dictionaries):CubeDescModel.createDictionaries();
+ };
+
+ $scope.saveNewDictionaries = function (){
+ if(!$scope.cubeMetaFrame.dictionaries){
+ $scope.cubeMetaFrame.dictionaries=[];
+ }
+
+ if($scope.updateDictionariesStatus.isEdit == true) {
+ if ($scope.cubeMetaFrame.dictionaries[$scope.updateDictionariesStatus.editIndex].column != $scope.newDictionaries.column) {
+ if(!$scope.checkColumn()){
+ return false;
+ }
+ }
+ else {
+ $scope.cubeMetaFrame.dictionaries[$scope.updateDictionariesStatus.editIndex] = $scope.newDictionaries;
+ }
+ }
+ else
+ {
+ if(!$scope.checkColumn()){
+ return false;
+ }
+ $scope.cubeMetaFrame.dictionaries.push($scope.newDictionaries);
+ }
+ $scope.newDictionaries = null;
+ $scope.initUpdateDictionariesStatus();
+ $scope.nextDictionariesInit();
+ $scope.addNew = !$scope.addNew;
+ $scope.isReuse = false;
+ return true;
+
+ };
+
+ $scope.nextDictionariesInit = function(){
+ $scope.nextDic = {
+ "coiumn":null,
+ "builder":null,
+ "reuse":null
+ }
+ }
+
+ $scope.checkColumn = function (){
+ var isColumnExit=false;
+ angular.forEach($scope.cubeMetaFrame.dictionaries,function(dictionaries){
+ if(!isColumnExit){
+ if(dictionaries.column==$scope.newDictionaries.column)
+ isColumnExit=true;
+ }
+ })
+ if(isColumnExit){
+ SweetAlert.swal('Oops...', "The column named [" + $scope.newDictionaries.column + "] already exists", 'warning');
+ return false;
+ }
+ return true;
+ }
+
+ $scope.clearNewDictionaries = function (){
+ $scope.newDictionaries = null;
+ $scope.isReuse=false;
+ $scope.initUpdateDictionariesStatus();
+ $scope.nextDictionariesInit();
+ $scope.addNew=!$scope.addNew;
+ }
+
+ $scope.change = function (){
+ $scope.newDictionaries.builder=null;
+ $scope.newDictionaries.reuse=null;
+ $scope.isReuse=!$scope.isReuse;
+ }
+
+ $scope.removeDictionaries = function(arr,element){
+ var index = arr.indexOf(element);
+ if (index > -1) {
+ arr.splice(index, 1);
+ }
+ };
+
});
http://git-wip-us.apache.org/repos/asf/kylin/blob/1f4675fc/webapp/app/js/controllers/cubeEdit.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/controllers/cubeEdit.js b/webapp/app/js/controllers/cubeEdit.js
index 86c039a..b620d7f 100755
--- a/webapp/app/js/controllers/cubeEdit.js
+++ b/webapp/app/js/controllers/cubeEdit.js
@@ -116,16 +116,33 @@ KylinApp.controller('CubeEditCtrl', function ($scope, $q, $routeParams, $locatio
$scope.getFactColumns = function () {
var me_columns = [];
angular.forEach($scope.cubeMetaFrame.dimensions,function(dimension,index){
- if($scope.metaModel.model.fact_table !== dimension.table){
- return;
- }
if(dimension.column && dimension.derived == null){
me_columns.push(dimension.column);
+
+ }
+ else{
+ angular.forEach(dimension.derived,function(derived){
+ me_columns.push(derived);
+ });
+
}
});
+ angular.forEach($scope.cubeMetaFrame.measure,function(measure){
+ if(measure.function.parameter.type==column){
+ me_columns.push(measure.function.parameter.value);
+ }
+ });
- return me_columns;
+ var unique = []
+
+ angular.forEach(me_columns, function (column) {
+ if (unique.indexOf(column) === -1) {
+ unique.push(column);
+ }
+ });
+
+ return unique;
};
http://git-wip-us.apache.org/repos/asf/kylin/blob/1f4675fc/webapp/app/js/model/cubeDescModel.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/model/cubeDescModel.js b/webapp/app/js/model/cubeDescModel.js
index a6e02ac..57d7e6e 100644
--- a/webapp/app/js/model/cubeDescModel.js
+++ b/webapp/app/js/model/cubeDescModel.js
@@ -41,6 +41,7 @@ KylinApp.service('CubeDescModel', function () {
}
}
],
+ "dictionaries" :[],
"rowkey": {
"rowkey_columns": []
},
@@ -79,6 +80,14 @@ KylinApp.service('CubeDescModel', function () {
return measure;
}
+ this.createDictionaries = function () {
+ var dictionaries = {
+ "column": null,
+ "builder": null,
+ "reuse":null
+ }
+ return dictionaries;
+ }
this.createAggGroup = function () {
var group = {
http://git-wip-us.apache.org/repos/asf/kylin/blob/1f4675fc/webapp/app/partials/cubeDesigner/advanced_settings.html
----------------------------------------------------------------------
diff --git a/webapp/app/partials/cubeDesigner/advanced_settings.html b/webapp/app/partials/cubeDesigner/advanced_settings.html
index ab2b5dc..eac6944 100755
--- a/webapp/app/partials/cubeDesigner/advanced_settings.html
+++ b/webapp/app/partials/cubeDesigner/advanced_settings.html
@@ -16,11 +16,9 @@
* limitations under the License.
-->
-<div ng-controller="CubeAdvanceSettingCtrl">
-
+ <div ng-controller="CubeAdvanceSettingCtrl">
<ng-form name="forms.cube_setting_form">
<div>
-
<div class="form-group">
<h3 style="margin-left:42px;">Aggregation Groups </h3>
<div style="margin-left:22px;">
@@ -30,7 +28,6 @@
</div>
</div>
</div>
-
<table style="margin-left:42px; width:92%"
ng-if="cubeMetaFrame.aggregation_groups.length > 0"
class="table table-hover list">
@@ -97,8 +94,6 @@
<td class="col-xs-1">
</td>
</tr>
-
-
<tr class="row">
<td class="col-xs-3">
Hierarchy Dimensions
@@ -121,7 +116,6 @@
</ui-select>
<p ng-if="state.mode=='view'">
{{hierarchyDims}}</p>
-
</td>
<td class="col-xs-2">
<button class="btn btn-sm btn-info"
@@ -130,7 +124,6 @@
</button>
</td>
</tr>
-
<tr class="row">
<td class="col-xs-12">
<button class="btn btn-sm btn-info"
@@ -139,11 +132,8 @@
</td>
</tr>
</table>
-
</td>
</tr>
-
-
<tr class="row">
<td class="col-xs-3">
Joint Dimensions
@@ -175,7 +165,6 @@
</button>
</td>
</tr>
-
<tr class="row">
<td class="col-xs-12">
<button class="btn btn-sm btn-info"
@@ -184,11 +173,9 @@
</td>
</tr>
</table>
-
</td>
</tr>
</table>
-
</td>
<td ng-if="state.mode=='edit'" class="col-xs-1">
<button class="btn btn-xs btn-info"
@@ -198,15 +185,10 @@
</td>
</tr>
</table>
-
<button class="btn btn-sm btn-info" style="margin-left:42px" ng-click="addNewAggregationGroup()"
ng-show="state.mode=='edit'">New Aggregation Group<i class="fa fa-plus"></i>
</button>
-
-
</div>
-
-
<div class="form-group large-popover" style="overflow:auto">
<h3 style="margin-left:42px">Rowkeys <i kylinpopover placement="right" title="Rowkey" template="rowkeyTip.html" class="fa fa-info-circle"></i></h3>
@@ -291,21 +273,132 @@
</tr>
</tbody>
</table>
-
-
</div>
</div>
-
<button class="btn btn-sm btn-info" style="margin-left:42px"
ng-click="addNewRowkeyColumn()" ng-show="state.mode=='edit'">New Rowkey Column<i class="fa fa-plus"></i>
</button>
</div>
+ <div class="form-group large-popover" style="overflow:auto">
+ <h3 style="margin-left:42px">Advanced Dictionaries <i kylinpopover placement="right" title="Advanced Dictionaries" template="AdvancedDictionariesTip.html" class="fa fa-info-circle"></i></h3>
+ <div style="margin-left:42px">
+ <div class="box-body">
+ <br/>
+ <table class="table table-striped table-hover">
+ <thead>
+ <tr>
+ <th>Column</th>
+ <th>Builder Class</th>
+ <th>Reuse</th>
+ <th ng-if="state.mode=='edit'">Actions</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr ng-repeat="dictionaries in cubeMetaFrame.dictionaries | filter: state.measureFilter track by $index">
+ <td>
+ <!--Column -->
+ <span>{{dictionaries.column}}</span>
+ </td>
+ <td>
+ <!--Builder-->
+ <span>{{dictionaries.builder}}</span>
+ </td>
+ <td>
+ <!--Reuse-->
+ <span>{{dictionaries.reuse}}</span>
+ </td>
+ <td ng-if="state.mode=='edit'">
+ <!--Edit Button -->
+ <button class="btn btn-xs btn-info" ng-click="addNewDictionaries(dictionaries, $index)" >
+ <i class="fa fa-pencil"></i>
+ </button>
+ <!--Remove Button -->
+ <button class="btn btn-xs btn-danger" ng-click="removeDictionaries(cubeMetaFrame.dictionaries, dictionaries)">
+ <i class="fa fa-trash-o"></i>
+ </button>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ <!--Add Dictionaries Button-->
+ <div class="form-group" style="margin-left:42px;">
+ <button class="btn btn-sm btn-info" ng-click="addNewDictionaries()" ng-show="state.mode=='edit' && !addNew">
+ <i class="fa fa-plus"></i> Dictionaries
+ </button>
+ </div>
+ <!--Edit Dictionsry-->
+ <ng-form name="edit_mes_form" style="margin-left:42px;">
+ <div class="box box-solid" ng-if="addNew" style="margin-left:42px;">
+ <div class="box-header">
+ <h4 class="box-title text-info">Edit Dictionaries</h4>
+ </div>
+ <div class="box-body">
+ <div class="row">
+ <div class="col-xs-8">
+ <!--Column-->
+ <div class="form-group middle-popover">
+ <div class="row">
+ <label class="col-xs-12 col-sm-3 control-label no-padding-right font-color-default"><b>Column</b></label>
+ <div class="col-xs-12 col-sm-6">
+ <select class="form-control" chosen
+ ng-model="newDictionaries.column"
+ ng-change="measureReturnTypeUpdate();"
+ ng-options="column as column for column in getFactColumns()" required>
+ <option value="">-- Select a Column --</option>
+ </select>
+ </div>
+ </div>
+ </div>
+ <div class="form-group">
+ <div class="row" style="margin-left:5px;">
+ <label class="radio-inline ng-binding ng-scope">
+ <input type="radio" name="reuse" ng-value=false ng-model="isReuse" ng-change="change()"/><b>Builder Class</b>
+ </label>
+ <label class="radio-inline ng-binding ng-scope">
+ <input type="radio" name="reuse" ng-value=true ng-model="isReuse" ng-change="change()"/><b>Reuse</b>
+ </label>
+ </div>
+ </div>
+ <!--Builder-->
+ <div class="form-group" ng-if="!isReuse" >
+ <div class="row">
+ <label class="col-xs-12 col-sm-3 control-label no-padding-right font-color-default"><b>Builder Class</b></label>
+ <div class="col-xs-12 col-sm-6">
+ <input type="text" name="builder" ng-model="newDictionaries.builder" required style="width:100% " />
+ </div>
+ </div>
+ </div>
+ <!--Reuse-->
+ <div class="form-group middle-popover" ng-if="isReuse" >
+ <div class="row">
+ <label class="col-xs-12 col-sm-3 control-label no-padding-right font-color-default"><b>Reuse</b></label>
+ <div class="col-xs-12 col-sm-6">
+ <select class="form-control" chosen
+ ng-model="newDictionaries.reuse"
+ ng-change="measureReturnTypeUpdate();"
+ ng-options="column as column for column in getFactColumns()" required>
+ <option value="">-- Select a Column --</option>
+ </select>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="box-footer">
+ <button class="btn btn-sm btn-info" ng-disabled="edit_mes_form.$invalid"
+ ng-click="saveNewDictionaries()" ng-show="state.mode=='edit'">OK</button>
+ <button class="btn btn-link" ng-click="clearNewDictionaries()">Cancel</button>
+ </div>
+ </div>
+ </ng-form>
+ </div>
+ </ng-form>
+ </div>
- </div>
-
- </ng-form>
-
-</div>
<script type="text/ng-template" id="rowkeyTip.html">
<div>
<h4>Shard By this column?</h4>
@@ -316,7 +409,7 @@
<h4>RowKey Encoding</h4>
<ol>
<li>
- "dict" encoding will try to build a dictionary for the dimension
+ "dict" encoding will try to build a dictionaries for the dimension
</li>
<li>
"fixed_length" encoding will encode the dimension vlaues by fixed length bytes with padding
@@ -327,3 +420,4 @@
</ol>
</div>
</script>
+<script type="text/ng-template" id="AdvancedDictionariesTip.html"