You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by ma...@apache.org on 2015/05/15 07:22:14 UTC

[45/52] [abbrv] incubator-kylin git commit: use modelsManager

use modelsManager


Project: http://git-wip-us.apache.org/repos/asf/incubator-kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-kylin/commit/d9e2d046
Tree: http://git-wip-us.apache.org/repos/asf/incubator-kylin/tree/d9e2d046
Diff: http://git-wip-us.apache.org/repos/asf/incubator-kylin/diff/d9e2d046

Branch: refs/heads/0.8.0
Commit: d9e2d046d8bd72a0fd56f6bbf8806c9215dd9035
Parents: 0088884
Author: jiazhong <ji...@ebay.com>
Authored: Wed Apr 8 17:27:04 2015 +0800
Committer: honma <ho...@ebay.com>
Committed: Fri May 15 11:38:33 2015 +0800

----------------------------------------------------------------------
 webapp/app/index.html                           |   3 +-
 webapp/app/js/controllers/cube.js               |  15 +-
 webapp/app/js/controllers/cubeAdvanceSetting.js |   5 +-
 webapp/app/js/controllers/cubeDimensions.js     |   9 +-
 webapp/app/js/controllers/cubeEdit.js           |  66 +++----
 webapp/app/js/controllers/cubeModel.js          |  15 +-
 webapp/app/js/controllers/cubeSchema.js         |  21 +--
 webapp/app/js/controllers/modelDimensions.js    |  15 +-
 webapp/app/js/controllers/modelEdit.js          |  36 ++--
 webapp/app/js/controllers/modelSchema.js        |  14 +-
 webapp/app/js/controllers/models.js             | 101 +++--------
 webapp/app/js/model/cubesManager.js             |   4 +
 webapp/app/js/model/modelList.js                |  91 ----------
 webapp/app/js/model/modelsManager.js            | 178 +++++++++++++++++++
 .../cubeDesigner/advanced_settings.html         |  18 +-
 .../app/partials/cubeDesigner/dimensions.html   |   4 +-
 webapp/app/partials/cubeDesigner/info.html      |  16 +-
 webapp/app/partials/cubeDesigner/measures.html  |   6 +-
 webapp/app/partials/cubeDesigner/overview.html  |   8 +-
 webapp/app/partials/cubes/cube_detail.html      |  98 +++++-----
 webapp/app/partials/jobs/job_merge.html         |  16 +-
 webapp/app/partials/jobs/job_refresh.html       |  12 +-
 webapp/app/partials/jobs/job_submit.html        |  11 +-
 .../modelDesigner/conditions_settings.html      |  28 +--
 .../app/partials/modelDesigner/data_model.html  |  18 +-
 .../modelDesigner/model_dimensions.html         |  12 +-
 .../app/partials/modelDesigner/model_info.html  |   8 +-
 .../partials/modelDesigner/model_measures.html  |   8 +-
 webapp/app/partials/models/model_detail.html    |  38 ++--
 webapp/app/partials/models/model_schema.html    |   8 +-
 webapp/app/partials/models/models.html          |   4 +-
 webapp/app/partials/models/models_tree.html     |   4 +-
 32 files changed, 477 insertions(+), 413 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d9e2d046/webapp/app/index.html
----------------------------------------------------------------------
diff --git a/webapp/app/index.html b/webapp/app/index.html
index 19ced08..8845499 100644
--- a/webapp/app/index.html
+++ b/webapp/app/index.html
@@ -145,9 +145,10 @@
 <script src="js/model/tableModel.js"></script>
 <script src="js/model/cubeListModel.js"></script>
 <script src="js/model/jobListModel.js"></script>
+<script src="js/model/cubesManager.js"></script>
 
 <!--New GUI-->
-<script src="js/model/modelList.js"></script>
+<script src="js/model/modelsManager.js"></script>
 
 <script src="js/controllers/page.js"></script>
 <script src="js/controllers/index.js"></script>

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d9e2d046/webapp/app/js/controllers/cube.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/controllers/cube.js b/webapp/app/js/controllers/cube.js
index f31742a..8e184d1 100755
--- a/webapp/app/js/controllers/cube.js
+++ b/webapp/app/js/controllers/cube.js
@@ -18,10 +18,13 @@
 
 'use strict';
 
-KylinApp.controller('CubeCtrl', function ($scope, AccessService, MessageService, CubeService, TableService, GraphService, UserService,SweetAlert,loadingRequest,ModelList,$modal) {
+KylinApp.controller('CubeCtrl', function ($scope, AccessService, MessageService, CubeService, TableService, GraphService, UserService,SweetAlert,loadingRequest,modelsManager,$modal,cubesManager) {
     $scope.newAccess = null;
     $scope.state = {jsonEdit: false};
 
+    $scope.modelsManager = modelsManager;
+    $scope.cubesManager = cubesManager;
+
     $scope.buildGraph = function (cube) {
        GraphService.buildTree(cube);
     };
@@ -242,7 +245,9 @@ KylinApp.controller('CubeCtrl', function ($scope, AccessService, MessageService,
     };
 
     $scope.startJobSubmit = function (cube) {
-        $scope.metaModel.model = ModelList.getModelByCube(cube.name);
+        $scope.metaModel={
+            model:modelsManager.getModelByCube(cube.name)
+        }
         if ($scope.metaModel.model.name) {
             if ($scope.metaModel.model.partition_desc.partition_date_column) {
                 $modal.open({
@@ -306,6 +311,9 @@ KylinApp.controller('CubeCtrl', function ($scope, AccessService, MessageService,
     };
 
     $scope.startRefresh = function (cube) {
+        $scope.metaModel={
+            model:modelsManager.getModelByCube(cube.name)
+        };
             $modal.open({
                 templateUrl: 'jobRefresh.html',
                 controller: jobSubmitCtrl,
@@ -325,6 +333,9 @@ KylinApp.controller('CubeCtrl', function ($scope, AccessService, MessageService,
     };
 
     $scope.startMerge = function (cube) {
+        $scope.metaModel={
+            model:modelsManager.getModelByCube(cube.name)
+        };
             $modal.open({
                 templateUrl: 'jobMerge.html',
                 controller: jobSubmitCtrl,

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d9e2d046/webapp/app/js/controllers/cubeAdvanceSetting.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/controllers/cubeAdvanceSetting.js b/webapp/app/js/controllers/cubeAdvanceSetting.js
index c9558d8..c29f513 100644
--- a/webapp/app/js/controllers/cubeAdvanceSetting.js
+++ b/webapp/app/js/controllers/cubeAdvanceSetting.js
@@ -18,10 +18,11 @@
 
 'use strict';
 
-KylinApp.controller('CubeAdvanceSettingCtrl', function ($scope, $modal,cubeConfig,MetaModel) {
+KylinApp.controller('CubeAdvanceSettingCtrl', function ($scope, $modal,cubeConfig,MetaModel,cubesManager) {
+    $scope.cubesManager = cubesManager;
 
     //convert some undefined or null value
-    angular.forEach($scope.cubeMetaFrame.rowkey.rowkey_columns,function(rowkey){
+    angular.forEach(cubesManager.cubeMetaFrame.rowkey.rowkey_columns,function(rowkey){
             if(!rowkey.dictionary){
                 rowkey.dictionary = "false";
             }

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d9e2d046/webapp/app/js/controllers/cubeDimensions.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/controllers/cubeDimensions.js b/webapp/app/js/controllers/cubeDimensions.js
index 35b66ab..8608bfc 100644
--- a/webapp/app/js/controllers/cubeDimensions.js
+++ b/webapp/app/js/controllers/cubeDimensions.js
@@ -18,8 +18,9 @@
 
 'use strict';
 
-KylinApp.controller('CubeDimensionsCtrl', function ($scope, $modal,MetaModel) {
+KylinApp.controller('CubeDimensionsCtrl', function ($scope, $modal,MetaModel,cubesManager) {
 
+    $scope.cubeManager = cubesManager;
     // Available columns list derived from cube data model.
     $scope.availableColumns = {};
 
@@ -114,7 +115,7 @@ KylinApp.controller('CubeDimensionsCtrl', function ($scope, $modal,MetaModel) {
 
     // Check column status: selected or disabled based on current cube dimensions.
     $scope.initColumnStatus = function () {
-        angular.forEach($scope.cubeMetaFrame.dimensions, function (dim) {
+        angular.forEach(cubesManager.cubeMetaFrame.dimensions, function (dim) {
             var cols = dimCols(dim);
 
             angular.forEach(cols, function (colName) {
@@ -189,7 +190,7 @@ KylinApp.controller('CubeDimensionsCtrl', function ($scope, $modal,MetaModel) {
         return types;
     };
 
-    var dimList = $scope.cubeMetaFrame.dimensions;
+    var dimList = cubesManager.cubeMetaFrame.dimensions;
 
     // Open add/edit dimension modal.
     $scope.openDimModal = function (dimType) {
@@ -417,7 +418,7 @@ KylinApp.controller('CubeDimensionsCtrl', function ($scope, $modal,MetaModel) {
     // Check whether there is column conflicts.
     $scope.dimConflicts = [];
 
-    $scope.$watch('cubeMetaFrame.dimensions', function (newVal, oldVal) {
+    $scope.$watch('cubesManager.cubeMetaFrame.dimensions', function (newVal, oldVal) {
         if (!newVal || !newVal.length) {
             return;
         }

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d9e2d046/webapp/app/js/controllers/cubeEdit.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/controllers/cubeEdit.js b/webapp/app/js/controllers/cubeEdit.js
index 98fc9a3..94ea27b 100755
--- a/webapp/app/js/controllers/cubeEdit.js
+++ b/webapp/app/js/controllers/cubeEdit.js
@@ -19,7 +19,7 @@
 'use strict';
 
 
-KylinApp.controller('CubeEditCtrl', function ($scope, $q, $routeParams, $location, $templateCache, $interpolate, MessageService, TableService, CubeDescService, CubeService, loadingRequest, SweetAlert,$log,cubeConfig,CubeDescModel,MetaModel,TableModel,ModelDescService,ModelList) {
+KylinApp.controller('CubeEditCtrl', function ($scope, $q, $routeParams, $location, $templateCache, $interpolate, MessageService, TableService, CubeDescService, CubeService, loadingRequest, SweetAlert,$log,cubeConfig,CubeDescModel,MetaModel,TableModel,ModelDescService,modelsManager,cubesManager) {
     $scope.cubeConfig = cubeConfig;
 
     // when add cube will transfer model Name
@@ -115,28 +115,30 @@ KylinApp.controller('CubeEditCtrl', function ($scope, $q, $routeParams, $locatio
     if ($scope.isEdit = !!$routeParams.cubeName) {
         CubeDescService.get({cube_name: $routeParams.cubeName}, function (detail) {
             if (detail.length > 0) {
-                $scope.cubeMetaFrame = detail[0];
+                cubesManager.cubeMetaFrame = detail[0];
+                cubesManager.cubeMetaFrame = detail[0];
                 $scope.metaModel = {};
 
                 //get model from API when page refresh
-                if(!ModelList.getModels().length){
-                    ModelDescService.get({model_name: $scope.cubeMetaFrame.model_name}, function (_model) {
+                if(!modelsManager.getModels().length){
+                    ModelDescService.get({model_name: cubesManager.cubeMetaFrame.model_name}, function (_model) {
                         $scope.metaModel.model = _model;
                     });
                 }
-                $scope.metaModel.model=ModelList.getModel($scope.cubeMetaFrame.model_name);
+                $scope.metaModel.model=modelsManager.getModel(cubesManager.cubeMetaFrame.model_name);
 
-                $scope.state.cubeSchema = angular.toJson($scope.cubeMetaFrame, true);
+                $scope.state.cubeSchema = angular.toJson(cubesManager.cubeMetaFrame, true);
             }
         });
 
     } else {
-        $scope.cubeMetaFrame = CubeDescModel.createNew();
+//        cubesManager.cubeMetaFrame = CubeDescModel.createNew();
+        cubesManager.cubeMetaFrame = CubeDescModel.createNew();
         $scope.metaModel ={
-            model : ModelList.getModel(modelName)
+            model : modelsManager.getModel(modelName)
         }
-        $scope.cubeMetaFrame.model_name = modelName;
-        $scope.state.cubeSchema = angular.toJson($scope.cubeMetaFrame, true);
+        cubesManager.cubeMetaFrame.model_name = modelName;
+        $scope.state.cubeSchema = angular.toJson(cubesManager.cubeMetaFrame, true);
     }
 
 
@@ -161,18 +163,18 @@ KylinApp.controller('CubeEditCtrl', function ($scope, $q, $routeParams, $locatio
         }
         //use cubedesc name as model name
         if($scope.metaModel.model.name===""||angular.isUndefined($scope.metaModel.model.name)){
-            $scope.metaModel.model.name = $scope.cubeMetaFrame.name;
+            $scope.metaModel.model.name = cubesManager.cubeMetaFrame.name;
         }
 
         //set model ref for cubeDesc
-        if($scope.cubeMetaFrame.model_name===""||angular.isUndefined($scope.cubeMetaFrame.model_name)){
-            $scope.cubeMetaFrame.model_name = $scope.cubeMetaFrame.name;
+        if(cubesManager.cubeMetaFrame.model_name===""||angular.isUndefined(cubesManager.cubeMetaFrame.model_name)){
+            cubesManager.cubeMetaFrame.model_name = cubesManager.cubeMetaFrame.name;
         }
 
-        $scope.state.project = $scope.cubeMetaFrame.project;
-//        delete $scope.cubeMetaFrame.project;
+        $scope.state.project = cubesManager.cubeMetaFrame.project;
+//        delete cubesManager.cubeMetaFrame.project;
 
-        $scope.state.cubeSchema = angular.toJson($scope.cubeMetaFrame, true);
+        $scope.state.cubeSchema = angular.toJson(cubesManager.cubeMetaFrame, true);
     };
 
     $scope.cubeResultTmpl = function (notification) {
@@ -210,7 +212,7 @@ KylinApp.controller('CubeEditCtrl', function ($scope, $q, $routeParams, $locatio
 
                         } else {
                             $scope.saveCubeRollBack();
-                            $scope.cubeMetaFrame.project = $scope.state.project;
+                            cubesManager.cubeMetaFrame.project = $scope.state.project;
                                 var message =request.message;
                                 var msg = !!(message) ? message : 'Failed to take action.';
                                 MessageService.sendMsg($scope.cubeResultTmpl({'text':msg,'schema':$scope.state.cubeSchema}), 'error', {}, true, 'top_center');
@@ -237,7 +239,7 @@ KylinApp.controller('CubeEditCtrl', function ($scope, $q, $routeParams, $locatio
                             MessageService.sendMsg($scope.cubeResultTmpl({'text':'Created the cube successfully.',type:'success'}), 'success', {}, true, 'top_center');
                         } else {
                             $scope.saveCubeRollBack();
-                            $scope.cubeMetaFrame.project = $scope.state.project;
+                            cubesManager.cubeMetaFrame.project = $scope.state.project;
                             var message =request.message;
                             var msg = !!(message) ? message : 'Failed to take action.';
                             MessageService.sendMsg($scope.cubeResultTmpl({'text':msg,'schema':$scope.state.cubeSchema}), 'error', {}, true, 'top_center');
@@ -277,7 +279,7 @@ KylinApp.controller('CubeEditCtrl', function ($scope, $q, $routeParams, $locatio
 
     $scope.updateMandatory = function(rowkey_column){
         if(!rowkey_column.mandatory){
-            angular.forEach($scope.cubeMetaFrame.rowkey.aggregation_groups, function (group, index) {
+            angular.forEach(cubesManager.cubeMetaFrame.rowkey.aggregation_groups, function (group, index) {
                    var index = group.indexOf(rowkey_column.column);
                    if(index>-1){
                        group.splice(index,1);
@@ -291,7 +293,7 @@ KylinApp.controller('CubeEditCtrl', function ($scope, $q, $routeParams, $locatio
         var tmpRowKeyColumns = [];
         var tmpAggregationItems = [];//put all aggregation item
         var hierarchyItemArray = [];//put all hierarchy items
-        angular.forEach($scope.cubeMetaFrame.dimensions, function (dimension, index) {
+        angular.forEach(cubesManager.cubeMetaFrame.dimensions, function (dimension, index) {
 
            //derived column
             if(dimension.derived&&dimension.derived.length){
@@ -361,7 +363,7 @@ KylinApp.controller('CubeEditCtrl', function ($scope, $q, $routeParams, $locatio
 
 
         //rm mandatory column from aggregation item
-        angular.forEach($scope.cubeMetaFrame.rowkey.rowkey_columns,function(value,index){
+        angular.forEach(cubesManager.cubeMetaFrame.rowkey.rowkey_columns,function(value,index){
                 if(value.mandatory){
                     tmpAggregationItems = _.filter(tmpAggregationItems,function(item){
                            return item!=value.column;
@@ -369,16 +371,16 @@ KylinApp.controller('CubeEditCtrl', function ($scope, $q, $routeParams, $locatio
                 }
         });
 
-        var rowkeyColumns = $scope.cubeMetaFrame.rowkey.rowkey_columns;
+        var rowkeyColumns = cubesManager.cubeMetaFrame.rowkey.rowkey_columns;
         var newRowKeyColumns = sortSharedData(rowkeyColumns,tmpRowKeyColumns);
         var increasedColumns = increasedColumn(rowkeyColumns,tmpRowKeyColumns);
         newRowKeyColumns = newRowKeyColumns.concat(increasedColumns);
 
         //! here get the latest rowkey_columns
-        $scope.cubeMetaFrame.rowkey.rowkey_columns = newRowKeyColumns;
+        cubesManager.cubeMetaFrame.rowkey.rowkey_columns = newRowKeyColumns;
 
         if($scope.cubeMode==="editExistCube") {
-            var aggregationGroups = $scope.cubeMetaFrame.rowkey.aggregation_groups;
+            var aggregationGroups = cubesManager.cubeMetaFrame.rowkey.aggregation_groups;
             // rm unused item from group,will only rm when [edit] dimension
             angular.forEach(aggregationGroups, function (group, index) {
                 if (group) {
@@ -410,7 +412,7 @@ KylinApp.controller('CubeEditCtrl', function ($scope, $q, $routeParams, $locatio
         if($scope.cubeMode==="addNewCube"){
 
           if(!tmpAggregationItems.length) {
-              $scope.cubeMetaFrame.rowkey.aggregation_groups=[];
+              cubesManager.cubeMetaFrame.rowkey.aggregation_groups=[];
               return;
           }
 
@@ -426,7 +428,7 @@ KylinApp.controller('CubeEditCtrl', function ($scope, $q, $routeParams, $locatio
           //hierarchyItems
           var increasedDataGroups = sliceGroupItemToGroups(unHierarchyItems);
           if(!hierarchyItemArray.length){
-              $scope.cubeMetaFrame.rowkey.aggregation_groups = increasedDataGroups;
+              cubesManager.cubeMetaFrame.rowkey.aggregation_groups = increasedDataGroups;
               return;
           };
 
@@ -474,7 +476,7 @@ KylinApp.controller('CubeEditCtrl', function ($scope, $q, $routeParams, $locatio
               }
           }
             //! here get the latest aggregation groups,only effect when add newCube
-            $scope.cubeMetaFrame.rowkey.aggregation_groups = increasedDataGroups;
+            cubesManager.cubeMetaFrame.rowkey.aggregation_groups = increasedDataGroups;
         }
     }
 
@@ -554,10 +556,10 @@ KylinApp.controller('CubeEditCtrl', function ($scope, $q, $routeParams, $locatio
 
     // ~ private methods
     function generateColumnFamily() {
-        $scope.cubeMetaFrame.hbase_mapping.column_family = [];
+        cubesManager.cubeMetaFrame.hbase_mapping.column_family = [];
         var colFamily = ColFamily();
         var normalMeasures = [], distinctCountMeasures=[];
-        angular.forEach($scope.cubeMetaFrame.measures, function (measure, index) {
+        angular.forEach(cubesManager.cubeMetaFrame.measures, function (measure, index) {
             if(measure.function.expression === 'COUNT_DISTINCT'){
                 distinctCountMeasures.push(measure);
             }else{
@@ -569,7 +571,7 @@ KylinApp.controller('CubeEditCtrl', function ($scope, $q, $routeParams, $locatio
             angular.forEach(normalMeasures, function(normalM, index){
                 nmcf.columns[0].measure_refs.push(normalM.name);
             });
-            $scope.cubeMetaFrame.hbase_mapping.column_family.push(nmcf);
+            cubesManager.cubeMetaFrame.hbase_mapping.column_family.push(nmcf);
         }
 
         if (distinctCountMeasures.length > 0){
@@ -577,7 +579,7 @@ KylinApp.controller('CubeEditCtrl', function ($scope, $q, $routeParams, $locatio
             angular.forEach(distinctCountMeasures, function(dcm, index){
                 dccf.columns[0].measure_refs.push(dcm.name);
             });
-            $scope.cubeMetaFrame.hbase_mapping.column_family.push(dccf);
+            cubesManager.cubeMetaFrame.hbase_mapping.column_family.push(dccf);
         }
     }
 
@@ -601,7 +603,7 @@ KylinApp.controller('CubeEditCtrl', function ($scope, $q, $routeParams, $locatio
     });
 
     $scope.$on('DimensionsEdited', function (event) {
-        if ($scope.cubeMetaFrame) {
+        if (cubesManager.cubeMetaFrame) {
             reGenerateRowKey();
         }
     });

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d9e2d046/webapp/app/js/controllers/cubeModel.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/controllers/cubeModel.js b/webapp/app/js/controllers/cubeModel.js
index cbd7978..dd7991d 100644
--- a/webapp/app/js/controllers/cubeModel.js
+++ b/webapp/app/js/controllers/cubeModel.js
@@ -18,8 +18,9 @@
 
 'use strict';
 
-KylinApp.controller('CubeModelCtrl', function ($scope, $modal,cubeConfig,MetaModel,SweetAlert,GraphService,$log,TableModel,ModelService,loadingRequest) {
+KylinApp.controller('CubeModelCtrl', function ($scope, $modal,cubeConfig,MetaModel,SweetAlert,GraphService,$log,TableModel,ModelService,loadingRequest,modelsManager) {
 
+    $scope.modelsManager = modelsManager;
 
     $scope.buildGraph = function (model) {
 //        var newModel = jQuery.extend(true, {}, model);
@@ -71,7 +72,7 @@ KylinApp.controller('CubeModelCtrl', function ($scope, $modal,cubeConfig,MetaMod
 
     $scope.newLookup = Lookup();
 
-    var lookupList = $scope.model.lookups;
+    var lookupList = modelsManager.selectedModel.lookups;
 
     $scope.openLookupModal = function () {
         var modalInstance = $modal.open({
@@ -134,7 +135,7 @@ KylinApp.controller('CubeModelCtrl', function ($scope, $modal,cubeConfig,MetaMod
     };
 
         $scope.removeLookup = function (lookup) {
-            var dimExist = _.some($scope.model.dimensions,function(item,index){
+            var dimExist = _.some(modelsManager.selectedModel.dimensions,function(item,index){
                 return item.table===lookup.table;
             });
             if(dimExist) {
@@ -148,9 +149,9 @@ KylinApp.controller('CubeModelCtrl', function ($scope, $modal,cubeConfig,MetaMod
                     closeOnConfirm: true
                 }, function (isConfirm) {
                     if (isConfirm) {
-                        for (var i = $scope.model.dimensions.length - 1; i >= 0; i--) {
-                            if ($scope.model.dimensions[i].table === lookup.table) {
-                                $scope.model.dimensions.splice(i, 1);
+                        for (var i = modelsManager.selectedModel.dimensions.length - 1; i >= 0; i--) {
+                            if (modelsManager.selectedModel.dimensions[i].table === lookup.table) {
+                                modelsManager.selectedModel.dimensions.splice(i, 1);
                             }
                         }
                         lookupList.splice(lookupList.indexOf(lookup), 1);
@@ -195,7 +196,7 @@ KylinApp.controller('CubeModelCtrl', function ($scope, $modal,cubeConfig,MetaMod
             }
 
             //column type validate
-            var fact_table = $scope.model.fact_table;
+            var fact_table = modelsManager.selectedModel.fact_table;
             var lookup_table = $scope.newLookup.table;
 
             for(var i = 0;i<$scope.newLookup.join.primary_key.length;i++){

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d9e2d046/webapp/app/js/controllers/cubeSchema.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/controllers/cubeSchema.js b/webapp/app/js/controllers/cubeSchema.js
index 327dc25..89ee492 100755
--- a/webapp/app/js/controllers/cubeSchema.js
+++ b/webapp/app/js/controllers/cubeSchema.js
@@ -18,8 +18,9 @@
 
 'use strict';
 
-KylinApp.controller('CubeSchemaCtrl', function ($scope, QueryService, UserService, ProjectService, AuthenticationService,$filter,ModelService,MetaModel,CubeDescModel,CubeList,TableModel,ProjectModel,ModelDescService,SweetAlert) {
+KylinApp.controller('CubeSchemaCtrl', function ($scope, QueryService, UserService, ProjectService, AuthenticationService,$filter,ModelService,MetaModel,CubeDescModel,CubeList,TableModel,ProjectModel,ModelDescService,SweetAlert,cubesManager) {
 
+    $scope.cubesManager = cubesManager;
     $scope.projects = [];
     $scope.newDimension = null;
     $scope.newMeasure = null;
@@ -42,7 +43,7 @@ KylinApp.controller('CubeSchemaCtrl', function ($scope, QueryService, UserServic
         $scope.state = {mode: "view"};
     }
 
-    $scope.$watch('cubeMetaFrame', function (newValue, oldValue) {
+    $scope.$watch('cubesManager.cubeMetaFrame', function (newValue, oldValue) {
         if(!newValue){
             return;
         }
@@ -66,8 +67,8 @@ KylinApp.controller('CubeSchemaCtrl', function ($scope, QueryService, UserServic
     };
 
     $scope.saveNewMeasure = function () {
-        if ($scope.cubeMetaFrame.measures.indexOf($scope.newMeasure) === -1) {
-            $scope.cubeMetaFrame.measures.push($scope.newMeasure);
+        if (cubesManager.cubeMetaFrame.measures.indexOf($scope.newMeasure) === -1) {
+            cubesManager.cubeMetaFrame.measures.push($scope.newMeasure);
         }
         $scope.newMeasure = null;
     };
@@ -103,7 +104,7 @@ KylinApp.controller('CubeSchemaCtrl', function ($scope, QueryService, UserServic
     }
 
     $scope.addNewRowkeyColumn = function () {
-        $scope.cubeMetaFrame.rowkey.rowkey_columns.push({
+        cubesManager.cubeMetaFrame.rowkey.rowkey_columns.push({
             "column": "",
             "length": 0,
             "dictionary": "true",
@@ -112,7 +113,7 @@ KylinApp.controller('CubeSchemaCtrl', function ($scope, QueryService, UserServic
     };
 
     $scope.addNewAggregationGroup = function () {
-        $scope.cubeMetaFrame.rowkey.aggregation_groups.push([]);
+        cubesManager.cubeMetaFrame.rowkey.aggregation_groups.push([]);
     };
 
     $scope.refreshAggregationGroup = function (list, index, aggregation_groups) {
@@ -212,7 +213,7 @@ KylinApp.controller('CubeSchemaCtrl', function ($scope, QueryService, UserServic
 
     $scope.check_cube_dimension = function(){
         var errors = [];
-        if(!$scope.cubeMetaFrame.dimensions.length){
+        if(!cubesManager.cubeMetaFrame.dimensions.length){
             errors.push("Dimension can't be null");
         }
         var errorInfo = "";
@@ -228,7 +229,7 @@ KylinApp.controller('CubeSchemaCtrl', function ($scope, QueryService, UserServic
     };
 
     $scope.check_cube_measure = function(){
-        var _measures = $scope.cubeMetaFrame.measures;
+        var _measures = cubesManager.cubeMetaFrame.measures;
         var errors = [];
         if(!_measures||!_measures.length){
             errors.push("Please define your metrics.");
@@ -260,7 +261,7 @@ KylinApp.controller('CubeSchemaCtrl', function ($scope, QueryService, UserServic
     $scope.check_cube_setting = function(){
         var errors = [];
 
-        angular.forEach($scope.cubeMetaFrame.rowkey.aggregation_groups,function(group){
+        angular.forEach(cubesManager.cubeMetaFrame.rowkey.aggregation_groups,function(group){
             if(!group.length){
                 errors.push("Each aggregation group can't be empty.");
             }
@@ -304,7 +305,7 @@ KylinApp.controller('CubeSchemaCtrl', function ($scope, QueryService, UserServic
                     TableModel.aceSrcTbLoaded();
                 }
 
-                $scope.cubeMetaFrame.project = projName;
+                cubesManager.cubeMetaFrame.project = projName;
             }
 
             angular.forEach($scope.projects, function (project, index) {

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d9e2d046/webapp/app/js/controllers/modelDimensions.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/controllers/modelDimensions.js b/webapp/app/js/controllers/modelDimensions.js
index c89e6a6..41acd24 100644
--- a/webapp/app/js/controllers/modelDimensions.js
+++ b/webapp/app/js/controllers/modelDimensions.js
@@ -18,7 +18,8 @@
 
 'use strict';
 
-KylinApp.controller('ModelDimensionsCtrl', function ($scope, $modal,MetaModel) {
+KylinApp.controller('ModelDimensionsCtrl', function ($scope, $modal,MetaModel,modelsManager) {
+    $scope.modelsManager = modelsManager;
 
     // Available columns list derived from cube data model.
     $scope.availableColumns = {};
@@ -32,24 +33,24 @@ KylinApp.controller('ModelDimensionsCtrl', function ($scope, $modal,MetaModel) {
 
     // Dump available columns plus column table name, whether is from lookup table.
     $scope.initColumns = function () {
-        var factTable = $scope.model.fact_table;
+        var factTable = modelsManager.selectedModel.fact_table;
 
-        $scope.availableTables.push($scope.model.fact_table);
-        var lookups = $scope.model.lookups;
+        $scope.availableTables.push(modelsManager.selectedModel.fact_table);
+        var lookups = modelsManager.selectedModel.lookups;
         for (var j = 0; j < lookups.length; j++) {
             $scope.availableTables.push(lookups[j].table);
         }
 
 //        init dimension only when dimen
-//        if(!$scope.model.dimensions.length){
+//        if(!modelsManager.selectedModel.dimensions.length){
 
             for(var i = 0;i<$scope.availableTables.length;i++){
-                var tableInUse = _.some($scope.model.dimensions,function(item){
+                var tableInUse = _.some(modelsManager.selectedModel.dimensions,function(item){
                     return item.table == $scope.availableTables[i];
                 });
 
                 if(!tableInUse){
-                    $scope.model.dimensions.push(new Dimension($scope.availableTables[i]));
+                    modelsManager.selectedModel.dimensions.push(new Dimension($scope.availableTables[i]));
                 }
             }
 //        }

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d9e2d046/webapp/app/js/controllers/modelEdit.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/controllers/modelEdit.js b/webapp/app/js/controllers/modelEdit.js
index dc9b87a..c483752 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) {
+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) {
     //add or edit ?
     var absUrl = $location.absUrl();
     $scope.modelMode = absUrl.indexOf("/models/add")!=-1?'addNewModel':absUrl.indexOf("/models/edit")!=-1?'editExistModel':'default';
@@ -29,6 +29,8 @@ KylinApp.controller('ModelEditCtrl', function ($scope, $q, $routeParams, $locati
         $location.path("/models");
     }
 
+    $scope.modelsManager = modelsManager;
+
     $scope.cubeConfig = cubeConfig;
 
     $scope.getPartitonColumns = function(tableName){
@@ -74,11 +76,11 @@ KylinApp.controller('ModelEditCtrl', function ($scope, $q, $routeParams, $locati
         var modelName = $routeParams.modelName;
         ModelDescService.get({model_name: modelName}, function (model) {
                     if (model) {
-                        $scope.model = model;
-                        $scope.model.project = ProjectModel.getProjectByCubeModel(modelName);
+                        modelsManager.selectedModel = model;
+                        modelsManager.selectedModel.project = ProjectModel.getProjectByCubeModel(modelName);
 
                         if(!ProjectModel.getSelectedProject()){
-                            ProjectModel.setSelectedProject($scope.model.project);
+                            ProjectModel.setSelectedProject(modelsManager.selectedModel.project);
                             TableModel.aceSrcTbLoaded();
                         }
 
@@ -95,26 +97,26 @@ KylinApp.controller('ModelEditCtrl', function ($scope, $q, $routeParams, $locati
 
     } else {
         MetaModel.initModel();
-        $scope.model = MetaModel.getMetaModel();
-        $scope.model.project = ProjectModel.getSelectedProject();
+        modelsManager.selectedModel = MetaModel.getMetaModel();
+        modelsManager.selectedModel.project = ProjectModel.getSelectedProject();
     }
 
 
     $scope.prepareModel = function () {
         // generate column family
 
-        if ($scope.model.partition_desc.partition_date_column!=null&&($scope.model.partition_desc.partition_date_start|$scope.model.partition_desc.partition_date_start==0)) {
-            var dateStart = new Date($scope.model.partition_desc.partition_date_start);
+        if (modelsManager.selectedModel.partition_desc.partition_date_column!=null&&(modelsManager.selectedModel.partition_desc.partition_date_start|modelsManager.selectedModel.partition_desc.partition_date_start==0)) {
+            var dateStart = new Date(modelsManager.selectedModel.partition_desc.partition_date_start);
             dateStart = (dateStart.getFullYear() + "-" + (dateStart.getMonth() + 1) + "-" + dateStart.getDate());
             //switch selected time to utc timestamp
-            $scope.model.partition_desc.partition_date_start = new Date(moment.utc(dateStart, "YYYY-MM-DD").format()).getTime();
+            modelsManager.selectedModel.partition_desc.partition_date_start = new Date(moment.utc(dateStart, "YYYY-MM-DD").format()).getTime();
 
 
         }
-        if($scope.model.partition_desc.partition_date_column==null){
-            $scope.model.partition_desc.partition_date_start=null;
+        if(modelsManager.selectedModel.partition_desc.partition_date_column==null){
+            modelsManager.selectedModel.partition_desc.partition_date_start=null;
         }
-        $scope.state.project = $scope.model.project;
+        $scope.state.project = modelsManager.selectedModel.project;
         var _model = angular.copy($scope.model);
         delete _model.project;
         $scope.state.modelSchema = angular.toJson(_model, true);
@@ -215,17 +217,17 @@ KylinApp.controller('ModelEditCtrl', function ($scope, $q, $routeParams, $locati
 
 //    reverse the date
     $scope.saveModelRollBack = function (){
-        if($scope.model.partition_desc.partition_date_start==0){
-            $scope.model.partition_desc.partition_date_start = null;
+        if(modelsManager.selectedModel.partition_desc.partition_date_start==0){
+            modelsManager.selectedModel.partition_desc.partition_date_start = null;
         }
-        if($scope.model&&($scope.model.partition_desc.partition_date_start||$scope.model.partition_desc.partition_date_start==0))
+        if($scope.model&&(modelsManager.selectedModel.partition_desc.partition_date_start||modelsManager.selectedModel.partition_desc.partition_date_start==0))
         {
-            $scope.model.partition_desc.partition_date_start+=new Date().getTimezoneOffset()*60000;
+            modelsManager.selectedModel.partition_desc.partition_date_start+=new Date().getTimezoneOffset()*60000;
         }
     };
 
     $scope.removeTableDimensions = function(tableIndex){
-        $scope.model.dimensions.splice(tableIndex,1);
+        modelsManager.selectedModel.dimensions.splice(tableIndex,1);
     }
 
     $scope.$watch('projectModel.selectedProject', function (newValue, oldValue) {

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d9e2d046/webapp/app/js/controllers/modelSchema.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/controllers/modelSchema.js b/webapp/app/js/controllers/modelSchema.js
index 17a3b06..a2126e8 100644
--- a/webapp/app/js/controllers/modelSchema.js
+++ b/webapp/app/js/controllers/modelSchema.js
@@ -18,9 +18,9 @@
 
 'use strict';
 
-KylinApp.controller('ModelSchemaCtrl', function ($scope, QueryService, UserService, ProjectService, AuthenticationService,$filter,ModelService,MetaModel,CubeDescModel,CubeList,TableModel,ProjectModel,$log,SweetAlert) {
+KylinApp.controller('ModelSchemaCtrl', function ($scope, QueryService, UserService, ProjectService, AuthenticationService,$filter,ModelService,MetaModel,CubeDescModel,CubeList,TableModel,ProjectModel,$log,SweetAlert,modelsManager) {
 
-    $log.info($scope.model);
+    $scope.modelsManager = modelsManager;
 
     $scope.projects = [];
     $scope.newDimension = null;
@@ -135,7 +135,7 @@ KylinApp.controller('ModelSchemaCtrl', function ($scope, QueryService, UserServi
      */
     $scope.check_data_model = function(){
         var errors = [];
-//        if(!$scope.model.lookups.length){
+//        if(!modelsManager.selectedModel.lookups.length){
 //            errors.push("No lookup table defined");
 //        }
         var errorInfo = "";
@@ -158,10 +158,10 @@ KylinApp.controller('ModelSchemaCtrl', function ($scope, QueryService, UserServi
     $scope.check_model_dimensions = function(){
 
         var errors = [];
-        if(!$scope.model.dimensions.length){
+        if(!modelsManager.selectedModel.dimensions.length){
             errors.push("No dimensions defined.");
         }
-        angular.forEach($scope.model.dimensions,function(_dimension){
+        angular.forEach(modelsManager.selectedModel.dimensions,function(_dimension){
             if(!_dimension.columns||!_dimension.columns.length){
             errors.push("No dimension columns defined for Table["+_dimension.table+"]");
             }
@@ -186,7 +186,7 @@ KylinApp.controller('ModelSchemaCtrl', function ($scope, QueryService, UserServi
     $scope.check_model_measure = function(){
 
         var errors = [];
-        if(!$scope.model.metrics||!$scope.model.metrics.length){
+        if(!modelsManager.selectedModel.metrics||!modelsManager.selectedModel.metrics.length){
             errors.push("Please define your metrics.");
         }
         var errorInfo = "";
@@ -203,7 +203,7 @@ KylinApp.controller('ModelSchemaCtrl', function ($scope, QueryService, UserServi
     };
     $scope.check_model_setting = function(){
         var errors = [];
-        if($scope.model.partition_desc.partition_date_column!=null&& $scope.model.partition_desc.partition_date_start==null){
+        if(modelsManager.selectedModel.partition_desc.partition_date_column!=null&& modelsManager.selectedModel.partition_desc.partition_date_start==null){
             errors.push("Please indicate start date when partition date column selected.");
         }
         var errorInfo = "";

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d9e2d046/webapp/app/js/controllers/models.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/controllers/models.js b/webapp/app/js/controllers/models.js
index 557be9c..be7d827 100644
--- a/webapp/app/js/controllers/models.js
+++ b/webapp/app/js/controllers/models.js
@@ -18,11 +18,9 @@
 
 'use strict';
 
-KylinApp.controller('ModelsCtrl', function ($scope, $q, $routeParams, $location, $window,$modal, MessageService, CubeDescService, CubeService, JobService, UserService,  ProjectService,SweetAlert,loadingRequest,$log,modelConfig,ProjectModel,ModelService,MetaModel,ModelList) {
-        //selected model
-        $scope.model = {};
+KylinApp.controller('ModelsCtrl', function ($scope, $q, $routeParams, $location, $window,$modal, MessageService, CubeDescService, CubeService, JobService, UserService,  ProjectService,SweetAlert,loadingRequest,$log,modelConfig,ProjectModel,ModelService,MetaModel,modelsManager,cubesManager) {
+
         //tree data
-        $scope.models_treedata=[];
 
         $scope.cubeSelected = false;
         $scope.cube = {};
@@ -33,9 +31,10 @@ KylinApp.controller('ModelsCtrl', function ($scope, $q, $routeParams, $location,
             $scope.showModels = showModel;
         }
 
-        $scope.modelList = ModelList;
+        $scope.modelsManager = modelsManager;
+        $scope.cubesManager = cubesManager;
         $scope.modelConfig = modelConfig;
-        ModelList.removeAll();
+        modelsManager.removeAll();
         $scope.loading = false;
         $scope.action = {};
         $scope.window = 0.68 * $window.innerHeight;
@@ -52,8 +51,6 @@ KylinApp.controller('ModelsCtrl', function ($scope, $q, $routeParams, $location,
                 defer.resolve([]);
                 return defer.promise;
             }
-//            offset = (!!offset) ? offset : null;
-//            limit = (!!limit) ? limit : null;
 
             var queryParam = {};
             if ($scope.listParams.modelName) {
@@ -63,7 +60,7 @@ KylinApp.controller('ModelsCtrl', function ($scope, $q, $routeParams, $location,
 
             $scope.loading = true;
 
-             ModelList.list(queryParam).then(function(resp){
+             modelsManager.list(queryParam).then(function(resp){
                 $scope.loading = false;
                 defer.resolve(resp);
             },function(resp){
@@ -74,80 +71,38 @@ KylinApp.controller('ModelsCtrl', function ($scope, $q, $routeParams, $location,
             return  defer.promise;
         };
 
+        //add ref for selectedModel
+//        $scope.model = modelsManager.selectedModel;
+//        $scope.cubeSelected = modelsManager.cubeSelected;
+//        $scope.cube = modelsManager.selectedCube;
+//        $scope.cubeMetaFrame =modelsManager.cubeDetail;
+//        $scope.cube={detail: modelsManager.cubeDetail};
+//        $scope.metaModel = {model:modelsManager.curModel};
+
         $scope.init = function(){
-            $scope.list().then(function(resp){
-                $scope.models_treedata = [];
-                angular.forEach(ModelList.models,function(model){
-                    var _model = {
-                        label:model.name,
-                        noLeaf:true,
-                        data:model,
-                        onSelect:function(branch){
-                         // set selected model
-                            $scope.model=branch.data;
-                            $scope.cubeSelected = false;
-                        }
-                    };
-                    var _children = [];
-                    angular.forEach(model.cubes,function(cube){
-                        _children.push(
-                            {
-                                label:cube.name,
-                                data:cube,
-                                onSelect:function(branch){
-                                    $log.info("cube selected:"+branch.data.name);
-                                    $scope.cubeSelected = true;
-//                                    $scope.cubeMetaFrame = branch.data;
-                                    $scope.cube = branch.data;
-                                    $scope.listAccess(cube, 'CubeInstance');
-
-                                    CubeDescService.get({cube_name: cube.name}, {}, function (detail) {
-                                        if (detail.length > 0&&detail[0].hasOwnProperty("name")) {
-                                            //cubeMetaFrame for cube view and edit
-                                            $scope.cubeMetaFrame = detail[0];
-                                            //for show detail info
-                                            $scope.cube.detail = detail[0];
-                                            //add model info
-                                            $scope.metaModel ={
-                                                model : ModelList.getModelByCube(cube.name)
-                                            }
-                                        }else{
-                                            SweetAlert.swal('Oops...', "No cube detail info loaded.", 'error');
-                                        }
-                                    }, function (e) {
-                                        if(e.data&& e.data.exception){
-                                            var message =e.data.exception;
-                                            var msg = !!(message) ? message : 'Failed to take action.';
-                                            SweetAlert.swal('Oops...', msg, 'error');
-                                        }else{
-                                            SweetAlert.swal('Oops...', "Failed to take action.", 'error');
-                                        }
-                                    });
-
-
-
-                                    // set selecte model
-                                }
-                            }
-                        );
-                    });
-                    if(_children.length){
-                         _model.children = _children;
-                    }
-                    $scope.models_treedata.push(_model);
-                });
-                $scope.models_treedata = _.sortBy($scope.models_treedata, function (i) { return i.label.toLowerCase(); });
 
+            var queryParam = {};
+            if ($scope.listParams.modelName) {
+                queryParam.modelName = $scope.listParams.modelName;
+            }
+            queryParam.projectName = $scope.projectModel.selectedProject;
+
+            modelsManager.generatorTreeData(queryParam).then(function(resp){
+//                $scope.models_treedata = resp;
             });
+
         };
 
         $scope.$watch('projectModel.selectedProject', function (newValue, oldValue) {
-                ModelList.removeAll();
+                modelsManager.removeAll();
                 //init selected model
-                $scope.model = {};
+//                $scope.model = {};
+                modelsManager.selectedModel;
                 $scope.init();
+
         });
 
+
     $scope.status = {
         isopen: true
     };

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d9e2d046/webapp/app/js/model/cubesManager.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/model/cubesManager.js b/webapp/app/js/model/cubesManager.js
index 6ba303f..f8e9cd8 100644
--- a/webapp/app/js/model/cubesManager.js
+++ b/webapp/app/js/model/cubesManager.js
@@ -19,4 +19,8 @@
 // TODO add cubes manager
 KylinApp.service('cubesManager',function(){
 
+    this.currentCube = {};
+
+    this.cubeMetaFrame={};
+
 })

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d9e2d046/webapp/app/js/model/modelList.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/model/modelList.js b/webapp/app/js/model/modelList.js
deleted file mode 100644
index 388cabc..0000000
--- a/webapp/app/js/model/modelList.js
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
-*/
-
-KylinApp.service('ModelList',function(ModelService,CubeService,$q,AccessService,ProjectModel,$log){
-    var _this = this;
-    this.models=[];
-
-    this.list = function(queryParam){
-
-        var defer = $q.defer();
-        var cubeDetail = [];
-        var modelPermission = [];
-        ModelService.list(queryParam, function (_models) {
-
-            angular.forEach(_models, function (model, index) {
-                $log.info("Add model permission info");
-                modelPermission.push(
-                AccessService.list({type: "DataModelDesc", uuid: model.uuid}, function (accessEntities) {
-                    model.accessEntities = accessEntities;
-                }).$promise
-                )
-                $log.info("Add cube info to model ,not detail info");
-                cubeDetail.push(
-//                    CubeService.list({offset: 0, limit: 70,modelName:model.name}, function (_cubes) {
-                    CubeService.list({modelName:model.name}, function (_cubes) {
-                    model.cubes = _cubes;
-                    }).$promise
-                );
-
-                model.project = ProjectModel.getProjectByCubeModel(model.name);
-            });
-            $q.all(cubeDetail,modelPermission).then(
-                function(result){
-                    _models = _.filter(_models,function(models){return models.name!=undefined});
-                    _this.models = _this.models.concat(_models);
-                    defer.resolve(_this.models);
-                }
-            );
-        },function(){
-            defer.reject("Failed to load models");
-        });
-        return defer.promise;
-
-    };
-
-
-    this.removemodels = function(models){
-        var modelsIndex = _this.models.indexOf(models);
-        if (modelsIndex > -1) {
-            _this.models.splice(modelsIndex, 1);
-        }
-    }
-
-    this.getModel = function(modelName){
-      return  _.find(_this.models,function(unit){
-            return unit.name == modelName;
-        })
-    }
-
-    this.getModels = function(){
-        return _this.models;
-    }
-
-    this.getModelByCube = function(cubeName){
-        return  _.find(_this.models,function(model){
-            return _.some(model.cubes,function(_cube){
-                return _cube.name == cubeName;
-            });
-        })
-    }
-
-    this.removeAll = function(){
-        _this.models = [];
-    };
-
-});

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d9e2d046/webapp/app/js/model/modelsManager.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/model/modelsManager.js b/webapp/app/js/model/modelsManager.js
new file mode 100644
index 0000000..71b77a4
--- /dev/null
+++ b/webapp/app/js/model/modelsManager.js
@@ -0,0 +1,178 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+KylinApp.service('modelsManager',function(ModelService,CubeService,$q,AccessService,ProjectModel,$log,CubeDescService,SweetAlert,cubesManager){
+    var _this = this;
+    this.models=[];
+    this.modelTreeData = [];
+    this.selectedModel={};
+    this.cubeModel={};
+    this.cubeSelected = false;
+
+    //list models and complemete cube,access info
+    this.list = function(queryParam){
+
+        var defer = $q.defer();
+        var cubeDetail = [];
+        var modelPermission = [];
+        ModelService.list(queryParam, function (_models) {
+
+            angular.forEach(_models, function (model, index) {
+                $log.info("Add model permission info");
+                modelPermission.push(
+                AccessService.list({type: "DataModelDesc", uuid: model.uuid}, function (accessEntities) {
+                    model.accessEntities = accessEntities;
+                }).$promise
+                )
+                $log.info("Add cube info to model ,not detail info");
+                cubeDetail.push(
+//                    CubeService.list({offset: 0, limit: 70,modelName:model.name}, function (_cubes) {
+                    CubeService.list({modelName:model.name}, function (_cubes) {
+                    model.cubes = _cubes;
+                    }).$promise
+                );
+
+                model.project = ProjectModel.getProjectByCubeModel(model.name);
+            });
+            $q.all(cubeDetail,modelPermission).then(
+                function(result){
+                    _models = _.filter(_models,function(models){return models.name!=undefined});
+                    _this.models = _this.models.concat(_models);
+                    defer.resolve(_this.models);
+                }
+            );
+        },function(){
+            defer.reject("Failed to load models");
+        });
+        return defer.promise;
+
+    };
+
+    //generator tree data info
+    this.generatorTreeData = function(queryParam){
+        var defer = $q.defer();
+        _this.list(queryParam).then(function(resp){
+            _this.modelTreeData = [];
+            angular.forEach(_this.models,function(model){
+                var _model = {
+                    label:model.name,
+                    noLeaf:true,
+                    data:model,
+                    onSelect:function(branch){
+                        // set selected model
+                        _this.selectedModel = branch.data;
+                        _this.cubeSelected = false;
+                    }
+                };
+                var _children = [];
+                angular.forEach(model.cubes,function(cube){
+                    _children.push(
+                        {
+                            label:cube.name,
+                            data:cube,
+                            onSelect:function(branch){
+                                $log.info("cube selected:"+branch.data.name);
+                                _this.cubeSelected = true;
+//                                    $scope.cubeMetaFrame = branch.data;
+//                                _this.selectedCube = branch.data;
+                                cubesManager.currentCube = branch.data;
+                                _this.listAccess(cubesManager.currentCube, 'CubeInstance');
+
+                                CubeDescService.get({cube_name: cube.name}, {}, function (detail) {
+                                    if (detail.length > 0&&detail[0].hasOwnProperty("name")) {
+                                        //cubeMetaFrame for cube view and edit
+//                                        $scope.cubeMetaFrame = detail[0];
+                                        //for show detail info
+//                                        $scope.cube.detail = detail[0];
+                                        //add model info
+                                        cubesManager.currentCube.detail = detail[0];
+                                        cubesManager.cubeMetaFrame = detail[0];
+                                        _this.cubeModel = _this.getModelByCube(cubesManager.currentCube.name);
+                                    }else{
+                                        SweetAlert.swal('Oops...', "No cube detail info loaded.", 'error');
+                                    }
+                                }, function (e) {
+                                    if(e.data&& e.data.exception){
+                                        var message =e.data.exception;
+                                        var msg = !!(message) ? message : 'Failed to take action.';
+                                        SweetAlert.swal('Oops...', msg, 'error');
+                                    }else{
+                                        SweetAlert.swal('Oops...', "Failed to take action.", 'error');
+                                    }
+                                });
+                                // set selecte model
+                            }
+                        }
+                    );
+                });
+                if(_children.length){
+                    _model.children = _children;
+                }
+                _this.modelTreeData.push(_model);
+            });
+            _this.modelTreeData = _.sortBy(_this.modelTreeData, function (i) { return i.label.toLowerCase(); });
+            defer.resolve(_this.modelTreeData);
+        });
+        return defer.promise;
+    };
+
+
+    this.removemodels = function(models){
+        var modelsIndex = _this.models.indexOf(models);
+        if (modelsIndex > -1) {
+            _this.models.splice(modelsIndex, 1);
+        }
+    }
+
+    this.getModel = function(modelName){
+      return  _.find(_this.models,function(unit){
+            return unit.name == modelName;
+        })
+    }
+
+    this.getModels = function(){
+        return _this.models;
+    }
+
+    this.getModelByCube = function(cubeName){
+        return  _.find(_this.models,function(model){
+            return _.some(model.cubes,function(_cube){
+                return _cube.name == cubeName;
+            });
+        })
+    }
+
+    this.removeAll = function(){
+        _this.models = [];
+    };
+
+    this.listAccess = function (entity, type) {
+        var defer = $q.defer();
+
+        entity.accessLoading = true;
+        AccessService.list({type: type, uuid: entity.uuid}, function (accessEntities) {
+            entity.accessLoading = false;
+            entity.accessEntities = accessEntities;
+            defer.resolve();
+        });
+
+        return defer.promise;
+    };
+
+
+});

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d9e2d046/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 ba2e20d..e841a1d 100755
--- a/webapp/app/partials/cubeDesigner/advanced_settings.html
+++ b/webapp/app/partials/cubeDesigner/advanced_settings.html
@@ -22,7 +22,7 @@
         <div class="form-group">
             <h4 style="margin-left:42px">Aggregation Groups</h4>
             <table style="margin-left:42px; width:92%"
-                   ng-if="cubeMetaFrame.rowkey.aggregation_groups.length > 0"
+                   ng-if="cubesManager.cubeMetaFrame.rowkey.aggregation_groups.length > 0"
                    class="table table-hover list">
                 <tr class="row">
                     <th class="col-xs-1">ID</th>
@@ -30,7 +30,7 @@
                     <th ng-if="state.mode=='edit'" class="col-xs-1"></th>
                 </tr>
 
-                <tr ng-repeat="aggregation_groups in cubeMetaFrame.rowkey.aggregation_groups" class="row">
+                <tr ng-repeat="aggregation_groups in cubesManager.cubeMetaFrame.rowkey.aggregation_groups" class="row">
                     <td class="col-xs-1">
                         <!-- ID -->
                         <b>{{($index + 1)}}</b>
@@ -39,15 +39,15 @@
                         <!-- Dimensions -->
                         <select ng-if="state.mode=='edit'" style="width: 100%"
                                 ng-model="aggregation_groups"  chosen multiple
-                                ng-change="refreshAggregationGroup(cubeMetaFrame.rowkey.aggregation_groups, $index, aggregation_groups)"
-                                ng-options="rowkey_column.column as rowkey_column.column for rowkey_column in cubeMetaFrame.rowkey.rowkey_columns">
+                                ng-change="refreshAggregationGroup(cubesManager.cubeMetaFrame.rowkey.aggregation_groups, $index, aggregation_groups)"
+                                ng-options="rowkey_column.column as rowkey_column.column for rowkey_column in cubesManager.cubeMetaFrame.rowkey.rowkey_columns">
                             <option value=""></option>
                         </select>
                         <p ng-if="state.mode=='view'" style="word-wrap: break-word; word-break: normal;max-width: 1000px ">{{aggregation_groups}}</p>
                     </td>
                     <td ng-if="state.mode=='edit'" class="col-xs-1">
                         <button class="btn btn-xs btn-info"
-                                ng-click="removeElement(cubeMetaFrame.rowkey.aggregation_groups, aggregation_groups)"><i
+                                ng-click="removeElement(cubesManager.cubeMetaFrame.rowkey.aggregation_groups, aggregation_groups)"><i
                                 class="fa fa-minus"></i>
                         </button>
                     </td>
@@ -65,7 +65,7 @@
         <div class="form-group">
             <h4 style="margin-left:42px">Rowkeys</h4>
             <table style="margin-left:42px; width:92%"
-                   ng-if="cubeMetaFrame.rowkey.rowkey_columns.length > 0"
+                   ng-if="cubesManager.cubeMetaFrame.rowkey.rowkey_columns.length > 0"
                    class="table table-hover list"
                     >
                <thead>
@@ -79,9 +79,9 @@
                     </tr>
                </thead>
 
-                <tbody ui-sortable="state.mode=='edit'" ng-model="cubeMetaFrame.rowkey.rowkey_columns">
+                <tbody ui-sortable="state.mode=='edit'" ng-model="cubesManager.cubeMetaFrame.rowkey.rowkey_columns">
 
-                    <tr  ng-repeat="rowkey_column in cubeMetaFrame.rowkey.rowkey_columns" ng-class="state.mode=='edit'?'sort-item':''">
+                    <tr  ng-repeat="rowkey_column in cubesManager.cubeMetaFrame.rowkey.rowkey_columns" ng-class="state.mode=='edit'?'sort-item':''">
 
                         <td>
                             <!-- ID -->
@@ -134,7 +134,7 @@
 
                         <td ng-if="state.mode=='edit'">
                             <button class="btn btn-xs btn-info"
-                                    ng-click="removeElement(cubeMetaFrame.rowkey.rowkey_columns, rowkey_column)"><i
+                                    ng-click="removeElement(cubesManager.cubeMetaFrame.rowkey.rowkey_columns, rowkey_column)"><i
                                     class="fa fa-minus"></i>
                             </button>
                         </td>

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d9e2d046/webapp/app/partials/cubeDesigner/dimensions.html
----------------------------------------------------------------------
diff --git a/webapp/app/partials/cubeDesigner/dimensions.html b/webapp/app/partials/cubeDesigner/dimensions.html
index 94ce1fd..c2da223 100644
--- a/webapp/app/partials/cubeDesigner/dimensions.html
+++ b/webapp/app/partials/cubeDesigner/dimensions.html
@@ -47,7 +47,7 @@
                 </span>
             </div>
         </div>
-        <table class="table table-striped table-hover" ng-if="cubeMetaFrame.dimensions.length > 0">
+        <table class="table table-striped table-hover" ng-if="cubesManager.cubeMetaFrame.dimensions.length > 0">
             <thead>
                 <tr>
                     <th>ID</th>
@@ -59,7 +59,7 @@
                 </tr>
             </thead>
             <tbody class="cube-dimension">
-                <tr ng-repeat="dimension in cubeMetaFrame.dimensions | filter:dimState.filter track by $index">
+                <tr ng-repeat="dimension in cubesManager.cubeMetaFrame.dimensions | filter:dimState.filter track by $index">
                     <!--ID -->
                     <td>
                         <b>{{dimension.id = ($index + 1)}}</b>

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d9e2d046/webapp/app/partials/cubeDesigner/info.html
----------------------------------------------------------------------
diff --git a/webapp/app/partials/cubeDesigner/info.html b/webapp/app/partials/cubeDesigner/info.html
index 1833818..7fda22a 100644
--- a/webapp/app/partials/cubeDesigner/info.html
+++ b/webapp/app/partials/cubeDesigner/info.html
@@ -29,12 +29,12 @@
                         <input disabled ng-if="state.mode=='edit'" name="model_name" type="text" required class="form-control"
                                placeholder="You can use letters, numbers, and '_'"
                                ng-maxlength=100 ng-pattern="/^\w+$/"
-                               ng-model="cubeMetaFrame.model_name"/>
+                               ng-model="cubesManager.cubeMetaFrame.model_name"/>
                         <small class="help-block" ng-show="forms.cube_info_form.model_name.$error.required && (forms.cube_info_form.model_name.$dirty||forms.cube_info_form.$sbumitted)">Model name is required.</small>
                         <small class="help-block" ng-show="!forms.cube_info_form.model_name.$error.required&&forms.cube_info_form.model_name.$invalid && (forms.cube_info_form.model_name.$dirty||forms.cube_info_form.$sbumitted)">Model name is invalid.</small>
 
                         <span ng-if="state.mode=='view'">
-                            {{cubeMetaFrame.model_name}}
+                            {{cubesManager.cubeMetaFrame.model_name}}
                         </span>
                     </div>
                 </div>
@@ -48,13 +48,13 @@
                     </label>
                     <div class="col-xs-12 col-sm-6" ng-class="{'has-error':forms.cube_info_form.cube_name.$invalid && (forms.cube_info_form.cube_name.$dirty||forms.cube_info_form.cube_name.$sbumitted)}">
                         <input ng-if="state.mode=='edit'" name="cube_name" type="text" class="form-control"
-                               ng-model="cubeMetaFrame.name" required
+                               ng-model="cubesManager.cubeMetaFrame.name" required
                                placeholder="You can use letters, numbers, and '_'"
                                ng-maxlength=100 ng-pattern="/^\w+$/" />
                         <small class="help-block" ng-show="forms.cube_info_form.cube_name.$error.required && (forms.cube_info_form.cube_name.$dirty||forms.cube_info_form.$sbumitted)">Cube name is required.</small>
                         <small class="help-block" ng-show="!forms.cube_info_form.cube_name.$error.required&&forms.cube_info_form.cube_name.$invalid && (forms.cube_info_form.cube_name.$dirty||forms.cube_info_form.$sbumitted)">Cube name is invalid.</small>
 
-                        <span ng-if="state.mode=='view'">{{cubeMetaFrame.name}}</span>
+                        <span ng-if="state.mode=='view'">{{cubesManager.cubeMetaFrame.name}}</span>
                     </div>
                 </div>
             </div>
@@ -67,8 +67,8 @@
                     </label>
                     <div class="col-xs-12 col-sm-6">
                         <input type="text" class="form-control" placeholder="Comma Separated"
-                               ng-model="cubeMetaFrame.notify_list" ng-if="state.mode=='edit'" ng-list>
-                        <span ng-if="state.mode=='view'">{{cubeMetaFrame.notify_list}}</span>
+                               ng-model="cubesManager.cubeMetaFrame.notify_list" ng-if="state.mode=='edit'" ng-list>
+                        <span ng-if="state.mode=='view'">{{cubesManager.cubeMetaFrame.notify_list}}</span>
                     </div>
                 </div>
             </div>
@@ -81,8 +81,8 @@
                     </label>
                     <div class="col-xs-12 col-sm-6">
                         <textarea ng-if="state.mode=='edit'" class="form-control box-default"
-                            name="comment" id="comment" ng-model="cubeMetaFrame.description"></textarea>
-                        <span ng-if="state.mode=='view'">{{cubeMetaFrame.description}}</span>
+                            name="comment" id="comment" ng-model="cubesManager.cubeMetaFrame.description"></textarea>
+                        <span ng-if="state.mode=='view'">{{cubesManager.cubeMetaFrame.description}}</span>
                     </div>
                 </div>
             </div>

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d9e2d046/webapp/app/partials/cubeDesigner/measures.html
----------------------------------------------------------------------
diff --git a/webapp/app/partials/cubeDesigner/measures.html b/webapp/app/partials/cubeDesigner/measures.html
index c426e95..c45ae8e 100755
--- a/webapp/app/partials/cubeDesigner/measures.html
+++ b/webapp/app/partials/cubeDesigner/measures.html
@@ -18,7 +18,7 @@
 
 <!-- Measures Summary -->
 <ng-form name="forms.cube_measure_form">
-    <div class="dataTables_wrapper form-inline no-footer" ng-if="cubeMetaFrame.measures.length > 0">
+    <div class="dataTables_wrapper form-inline no-footer" ng-if="cubesManager.cubeMetaFrame.measures.length > 0">
             <div class="row">
                 <span class="nav-search input-icon input-icon-right" style="margin-left: 22px;">
                     <input type="text" placeholder="Filter ..." class="nav-search-input" ng-model="state.dimensionFilter"/>
@@ -38,7 +38,7 @@
                     </tr>
                 </thead>
                 <tbody>
-                    <tr ng-repeat="measure in cubeMetaFrame.measures | filter: state.measureFilter track by $index">
+                    <tr ng-repeat="measure in cubesManager.cubeMetaFrame.measures | filter: state.measureFilter track by $index">
                         <td>
                             <!--ID -->
                             <b>{{measure.id = ($index + 1)}}</b>
@@ -69,7 +69,7 @@
                                 <i class="fa fa-pencil"></i>
                             </button>
                             <!--Remove Button -->
-                            <button class="btn btn-xs  btn-danger" ng-click="removeElement(cubeMetaFrame.measures, measure)">
+                            <button class="btn btn-xs  btn-danger" ng-click="removeElement(cubesManager.cubeMetaFrame.measures, measure)">
                                 <i class="fa fa-trash-o"></i>
                             </button>
                         </td>

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d9e2d046/webapp/app/partials/cubeDesigner/overview.html
----------------------------------------------------------------------
diff --git a/webapp/app/partials/cubeDesigner/overview.html b/webapp/app/partials/cubeDesigner/overview.html
index 4bf14ff..28f02c3 100644
--- a/webapp/app/partials/cubeDesigner/overview.html
+++ b/webapp/app/partials/cubeDesigner/overview.html
@@ -29,7 +29,7 @@
                     <!--Cube Name-->
                     <tr>
                         <th>Cube Name</th>
-                        <td class="tb-breakword">{{cubeMetaFrame.name}}</td>
+                        <td class="tb-breakword">{{cubesManager.cubeMetaFrame.name}}</td>
                     </tr>
                     <!--Fact Table-->
                     <tr>
@@ -46,12 +46,12 @@
                     <!--Dimensions-->
                     <tr>
                         <th>Dimensions</th>
-                        <td>{{cubeMetaFrame.dimensions.length}}</td>
+                        <td>{{cubesManager.cubeMetaFrame.dimensions.length}}</td>
                     </tr>
                     <!--Measures-->
                     <tr>
                         <th>Measures</th>
-                        <td>{{cubeMetaFrame.measures.length}}</td>
+                        <td>{{cubesManager.cubeMetaFrame.measures.length}}</td>
                     </tr>
                 </tbody>
             </table>
@@ -68,7 +68,7 @@
             </div>
             <div class="box-body">
                 <p class="muted">
-                    {{cubeMetaFrame.description}}
+                    {{cubesManager.cubeMetaFrame.description}}
                 </p>
             </div>
         </div>

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d9e2d046/webapp/app/partials/cubes/cube_detail.html
----------------------------------------------------------------------
diff --git a/webapp/app/partials/cubes/cube_detail.html b/webapp/app/partials/cubes/cube_detail.html
index 93084e3..ae1ed5b 100755
--- a/webapp/app/partials/cubes/cube_detail.html
+++ b/webapp/app/partials/cubes/cube_detail.html
@@ -18,120 +18,120 @@
 
 <div ng-controller="CubeCtrl" class="nav-tabs-custom" style="margin-top:40px;">
     <ul class="nav nav-tabs">
-        <li class="{{(!cube.visiblePage || cube.visiblePage=='metadata')? 'active':''}}">
-            <a href="" ng-click="cube.visiblePage='metadata'">Grid</a>
+        <li class="{{(!cubesManager.currentCube.visiblePage || cubesManager.currentCube.visiblePage=='metadata')? 'active':''}}">
+            <a href="" ng-click="cubesManager.currentCube.visiblePage='metadata'">Grid</a>
         </li>
-        <!--<li class="{{cube.visiblePage=='graph'? 'active':''}}">-->
-            <!--<a href="" ng-click="cube.visiblePage='graph';buildGraph(cube);">Visualization</a>-->
+        <!--<li class="{{cubesManager.currentCube.visiblePage=='graph'? 'active':''}}">-->
+            <!--<a href="" ng-click="cubesManager.currentCube.visiblePage='graph';buildGraph(cubesManager.currentCube);">Visualization</a>-->
         <!--</li>-->
-        <li class="{{cube.visiblePage=='sql'? 'active':''}}">
-            <a href="" ng-click="cube.visiblePage='sql';getCubeSql(cube)">SQL</a>
+        <li class="{{cubesManager.currentCube.visiblePage=='sql'? 'active':''}}">
+            <a href="" ng-click="cubesManager.currentCube.visiblePage='sql';getCubeSql(cubesManager.currentCube)">SQL</a>
         </li>
-        <li class="{{cube.visiblePage=='json'? 'active':''}}"
-            ng-if="userService.hasRole('ROLE_ADMIN') || hasPermission(cube, 16) && !newAccess">
-            <a href="" ng-click="cube.visiblePage='json';">JSON(Cube)</a>
+        <li class="{{cubesManager.currentCube.visiblePage=='json'? 'active':''}}"
+            ng-if="userService.hasRole('ROLE_ADMIN') || hasPermission(cubesManager.currentCube, 16) && !newAccess">
+            <a href="" ng-click="cubesManager.currentCube.visiblePage='json';">JSON(Cube)</a>
         </li>
-      <!--<li class="{{cube.visiblePage=='json_model'? 'active':''}}"-->
+      <!--<li class="{{cubesManager.currentCube.visiblePage=='json_model'? 'active':''}}"-->
           <!--ng-if="userService.hasRole('ROLE_ADMIN') || hasPermission(cube, 16) && !newAccess">-->
-        <!--<a href="" ng-click="cube.visiblePage='json_model';">JSON(Model)</a>-->
+        <!--<a href="" ng-click="cubesManager.currentCube.visiblePage='json_model';">JSON(Model)</a>-->
       <!--</li>-->
-        <li class="{{cube.visiblePage=='access'? 'active':''}}">
-            <a href="" ng-click="cube.visiblePage='access';listAccess(cube, 'CubeInstance');">Access</a>
+        <li class="{{cubesManager.currentCube.visiblePage=='access'? 'active':''}}">
+            <a href="" ng-click="cubesManager.currentCube.visiblePage='access';listAccess(cubesManager.currentCube, 'CubeInstance');">Access</a>
         </li>
-        <li class="{{cube.visiblePage=='notification'? 'active':''}}"
-            ng-if="userService.hasRole('ROLE_ADMIN') || hasPermission(cube, 16) && !newAccess">
-            <a href="" ng-click="cube.visiblePage='notification';getNotifyListString(cube);">Notification</a>
+        <li class="{{cubesManager.currentCube.visiblePage=='notification'? 'active':''}}"
+            ng-if="userService.hasRole('ROLE_ADMIN') || hasPermission(cubesManager.currentCube, 16) && !newAccess">
+            <a href="" ng-click="cubesManager.currentCube.visiblePage='notification';getNotifyListString(cubesManager.currentCube);">Notification</a>
         </li>
-        <li class="{{cube.visiblePage=='hbase'? 'active':''}}"
+        <li class="{{cubesManager.currentCube.visiblePage=='hbase'? 'active':''}}"
             ng-if="userService.hasRole('ROLE_ADMIN')">
-            <a href="" ng-click="cube.visiblePage='hbase';getHbaseInfo(cube)">HBase</a>
+            <a href="" ng-click="cubesManager.currentCube.visiblePage='hbase';getHbaseInfo(cubesManager.currentCube)">HBase</a>
         </li>
-        <li class="dropdown" ng-if="userService.hasRole('ROLE_ADMIN') || hasPermission(cube, permissions.ADMINISTRATION.mask, permissions.MANAGEMENT.mask, permissions.OPERATION.mask)">
+        <li class="dropdown" ng-if="userService.hasRole('ROLE_ADMIN') || hasPermission(cubesManager.currentCube, permissions.ADMINISTRATION.mask, permissions.MANAGEMENT.mask, permissions.OPERATION.mask)">
             <a class="dropdown-toggle highlight-bule" data-toggle="dropdown" href="#" aria-expanded="true">
                 <i class="fa fa-cubes">Action</i> <span class="caret"></span>
             </a>
             <ul class="dropdown-menu">
-                <li ng-if="cube.status=='DISABLED' && userService.hasRole('ROLE_ADMIN') ">
-                    <a ng-click="dropCube(cube)" tooltip="Drop the cube, related jobs and data permanently.">Drop</a></li>
-                <li ng-if="cube.status=='DISABLED' && (userService.hasRole('ROLE_ADMIN') || hasPermission(cube, permissions.ADMINISTRATION.mask, permissions.MANAGEMENT.mask))">
-                    <a href="cubes/edit/{{cube.name}}">Edit</a></li>
-                <li><a ng-click="startJobSubmit(cube);">Build</a></li>
-                <li><a ng-click="startRefresh(cube)">Refresh</a></li>
-                <li><a ng-click="startMerge(cube)">Merge</a></li>
-                <li ng-if="cube.status!='DISABLED'"><a ng-click="disable(cube)">Disable</a></li>
-                <li ng-if="cube.status=='DISABLED'"><a ng-click="enable(cube)">Enable</a></li>
-                <li ng-if="cube.status=='DISABLED'"><a ng-click="purge(cube)">Purge</a></li>
+                <li ng-if="cubesManager.currentCube.status=='DISABLED' && userService.hasRole('ROLE_ADMIN') ">
+                    <a ng-click="dropCube(cubesManager.currentCube)" tooltip="Drop the cube, related jobs and data permanently.">Drop</a></li>
+                <li ng-if="cubesManager.currentCube.status=='DISABLED' && (userService.hasRole('ROLE_ADMIN') || hasPermission(cubesManager.currentCube, permissions.ADMINISTRATION.mask, permissions.MANAGEMENT.mask))">
+                    <a href="cubes/edit/{{cubesManager.currentCube.name}}">Edit</a></li>
+                <li><a ng-click="startJobSubmit(cubesManager.currentCube);">Build</a></li>
+                <li><a ng-click="startRefresh(cubesManager.currentCube)">Refresh</a></li>
+                <li><a ng-click="startMerge(cubesManager.currentCube)">Merge</a></li>
+                <li ng-if="cubesManager.currentCube.status!='DISABLED'"><a ng-click="disable(cubesManager.currentCube)">Disable</a></li>
+                <li ng-if="cubesManager.currentCube.status=='DISABLED'"><a ng-click="enable(cubesManager.currentCube)">Enable</a></li>
+                <li ng-if="cubesManager.currentCube.status=='DISABLED'"><a ng-click="purge(cubesManager.currentCube)">Purge</a></li>
             </ul>
         </li>
 
     </ul>
 
-    <div class="cube-detail" ng-if="!cube.visiblePage || cube.visiblePage=='metadata'">
+    <div class="cube-detail" ng-if="!cubesManager.currentCube.visiblePage || cubesManager.currentCube.visiblePage=='metadata'">
         <div ng-include="'partials/cubes/cube_schema.html'" ng-controller="CubeSchemaCtrl"
-             ng-init="state={mode:'view', cubeName:cube.name}"></div>
+             ng-init="state={mode:'view', cubeName:cubesManager.currentCube.name}"></div>
     </div>
 
-    <div ng-show="cube.visiblePage=='sql'" class="cube-detail">
-        <div ng-if="cube.sql">
-            <pre style="background-color: white;border: 0px">{{cube.sql}}</pre>
+    <div ng-show="cubesManager.currentCube.visiblePage=='sql'" class="cube-detail">
+        <div ng-if="cubesManager.currentCube.sql">
+            <pre style="background-color: white;border: 0px">{{cubesManager.currentCube.sql}}</pre>
         </div>
 
-        <div ng-if="!cube.sql">
+        <div ng-if="!cubesManager.currentCube.sql">
             <span calss="text-info">No SQL GENERATED.</span>
         </div>
     </div>
 
-    <div ng-show="cube.visiblePage=='json'" class="cube-detail">
+    <div ng-show="cubesManager.currentCube.visiblePage=='json'" class="cube-detail">
         <pre ng-if="!state.jsonEdit"
-             style="background-color: white;border: 0px">{{angular.toJson(cleanStatus(cube.detail), true)}}</pre>
+             style="background-color: white;border: 0px">{{angular.toJson(cleanStatus(cubesManager.currentCube.detail), true)}}</pre>
     </div>
 
-    <!--<div ng-show="cube.visiblePage=='json_model'" class="cube-detail">-->
+    <!--<div ng-show="cubesManager.currentCube.visiblePage=='json_model'" class="cube-detail">-->
           <!--<pre ng-if="!state.jsonEdit"-->
                <!--style="background-color: white;border: 0px">{{angular.toJson(cleanStatus(model), true)}}</pre>-->
     <!--</div>-->
-    <!--<div ng-show="cube.visiblePage=='graph'" id="cube_graph_{{cube.name}}" class="cube-detail cube_graph">-->
+    <!--<div ng-show="cubesManager.currentCube.visiblePage=='graph'" id="cube_graph_{{cubesManager.currentCube.name}}" class="cube-detail cube_graph">-->
     <!--</div>-->
 
-    <div class="cube-detail" ng-if="cube.visiblePage=='access'">
+    <div class="cube-detail" ng-if="cubesManager.currentCube.visiblePage=='access'">
         <div class="row">
             <div class="col-xs-1"></div>
             <div class="col-xs-10">
-                <div ng-include src="'partials/common/access.html'" ng-init="entity=cube;type='CubeInstance';"></div>
+                <div ng-include src="'partials/common/access.html'" ng-init="entity=cubesManager.currentCube;type='CubeInstance';"></div>
             </div>
             <div class="col-xs-1"></div>
         </div>
     </div>
 
-    <div class="cube-detail" ng-show="cube.visiblePage=='notification'">
+    <div class="cube-detail" ng-show="cubesManager.currentCube.visiblePage=='notification'">
         <div style="margin: 15px;">
             <form>
                 <h5>Notification List(Common Separated)</h5>
                 <div class="form-group">
-                    <input ng-model="cube.notifyListString" class="form-control" placeholder="Notification List..." />
+                    <input ng-model="cubesManager.currentCube.notifyListString" class="form-control" placeholder="Notification List..." />
                 </div>
                 <div class="form-group">
-                    <button class="btn btn-primary btn-sm" ng-click="updateNotifyList(cube)">Save</button>
+                    <button class="btn btn-primary btn-sm" ng-click="updateNotifyList(cubesManager.currentCube)">Save</button>
                 </div>
                 <div class="space-4"></div>
             </form>
         </div>
     </div>
 
-    <div class="cube-detail" ng-show="cube.visiblePage=='hbase'">
+    <div class="cube-detail" ng-show="cubesManager.currentCube.visiblePage=='hbase'">
         <div style="margin: 15px;">
-            <div ng-repeat="table in cube.hbase">
+            <div ng-repeat="table in cubesManager.currentCube.hbase">
                 <h5><b>HTable:</b> {{table.tableName}}</h5>
                 <ul>
                     <li>Region Count: <span class="red">{{table.regionCount}}</span></li>
                     <li>Size: <span class="red">{{table.tableSize | bytes:2}}</span></li>
                 </ul>
             </div>
-            <div ng-if="cube.hbase">
+            <div ng-if="cubesManager.currentCube.hbase">
                 <div class="hr hr8 hr-double hr-dotted"></div>
-                <h5><b>Total Size:</b> <span class="red">{{cube.totalSize | bytes:2}}</span></h5>
+                <h5><b>Total Size:</b> <span class="red">{{cubesManager.currentCube.totalSize | bytes:2}}</span></h5>
             </div>
-            <div ng-if="cube.hbase.length == 0">
+            <div ng-if="cubesManager.currentCube.hbase.length == 0">
                 <h5>No HBase Info.</h5>
             </div>
         </div>

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d9e2d046/webapp/app/partials/jobs/job_merge.html
----------------------------------------------------------------------
diff --git a/webapp/app/partials/jobs/job_merge.html b/webapp/app/partials/jobs/job_merge.html
index c55b280..35f88fe 100644
--- a/webapp/app/partials/jobs/job_merge.html
+++ b/webapp/app/partials/jobs/job_merge.html
@@ -24,11 +24,11 @@
         <div ng-if="metaModel.model.partition_desc.partition_date_column" class="row">
             <div class="col-md-2"></div>
             <div class="col-md-8">
-                <div ng-if="!!!(cube.segments) || cube.segments.length < 2">
+                <div ng-if="!!!(cubesManager.currentCube.segments) || cubesManager.currentCube.segments.length < 2">
                     <span class="text-info">NO SEGMENT TO MERGE.</span>
                 </div>
-                <div ng-if="cube.segments.length >= 2" class="row">
-                    <table class="table table-striped list" ng-if="(cube.segments|filter: {status: 'NEW'}).length == 0">
+                <div ng-if="cubesManager.currentCube.segments.length >= 2" class="row">
+                    <table class="table table-striped list" ng-if="(cubesManager.currentCube.segments|filter: {status: 'NEW'}).length == 0">
                         <tbody>
                         <tr>
                             <td>PARTITION DATE COLUMN</td>
@@ -38,8 +38,8 @@
                             <td>MERGE START SEGMENT</td>
                             <td>
                                 <select ng-model="mergeStartSeg"
-                                        ng-init="mergeStartSeg=cube.segments[0];mergeStartSelected(mergeStartSeg)"
-                                        ng-options="segment as segment.name for segment in cube.segments"
+                                        ng-init="mergeStartSeg=cubesManager.currentCube.segments[0];mergeStartSelected(mergeStartSeg)"
+                                        ng-options="segment as segment.name for segment in cubesManager.currentCube.segments"
                                         ng-change="mergeStartSelected(mergeStartSeg)">
                                 </select>
                             </td>
@@ -48,8 +48,8 @@
                             <td>MERGE END SEGMENT</td>
                             <td>
                                 <select ng-model="mergeEndSeg"
-                                        ng-init="mergeEndSeg=cube.segments[cube.segments.length-1];mergeEndSelected(mergeEndSeg)"
-                                        ng-options="segment as segment.name for segment in cube.segments"
+                                        ng-init="mergeEndSeg=cubesManager.currentCube.segments[cubesManager.currentCube.segments.length-1];mergeEndSelected(mergeEndSeg)"
+                                        ng-options="segment as segment.name for segment in cubesManager.currentCube.segments"
                                         ng-change="mergeEndSelected(mergeEndSeg)">
                                 </select>
                             </td>
@@ -103,7 +103,7 @@
                         </tbody>
                     </table>
 
-                    <div ng-if="(cube.segments|filter: {status: 'NEW'}).length > 0">
+                    <div ng-if="(cubesManager.currentCube.segments|filter: {status: 'NEW'}).length > 0">
                         <span class="text-warning">There exists a build request of this cube, the job may be running or error. If you need a new build, please wait for its complete or discard it.</span>
                     </div>
                 </div>