From 78c6d4be1a5d55aeb85ebb79509e72f40899e78e Mon Sep 17 00:00:00 2001 From: kangkaisen Date: Wed, 14 Dec 2016 20:08:14 +0800 Subject: [PATCH] KYLIN-2287 Speed up model and cube list load in Web --- webapp/app/js/controllers/cubeSchema.js | 25 +-- webapp/app/js/controllers/cubes.js | 318 ++++++++++++---------------- webapp/app/js/controllers/models.js | 54 +++-- webapp/app/js/model/cubeListModel.js | 4 - webapp/app/js/model/modelsManager.js | 49 +---- webapp/app/partials/cubes/cubes.html | 12 +- webapp/app/partials/models/models_tree.html | 16 +- 7 files changed, 215 insertions(+), 263 deletions(-) diff --git a/webapp/app/js/controllers/cubeSchema.js b/webapp/app/js/controllers/cubeSchema.js index d7dfc09..ad39c19 100755 --- a/webapp/app/js/controllers/cubeSchema.js +++ b/webapp/app/js/controllers/cubeSchema.js @@ -45,18 +45,6 @@ KylinApp.controller('CubeSchemaCtrl', function ($scope, QueryService, UserServic $scope.state = {mode: "view"}; } - var queryParam = {offset: 0, limit: 65535}; - - CubeService.list(queryParam, function (all_cubes) { - if($scope.allCubes.length > 0){ - $scope.allCubes.splice(0,$scope.allCubes.length); - } - - for (var i = 0; i < all_cubes.length; i++) { - $scope.allCubes.push(all_cubes[i].name.toUpperCase()); - } - }); - $scope.$watch('cubeMetaFrame', function (newValue, oldValue) { if(!newValue){ return; @@ -199,6 +187,19 @@ KylinApp.controller('CubeSchemaCtrl', function ($scope, QueryService, UserServic }; $scope.check_cube_info = function(){ + + var queryParam = {offset: 0, limit: 65535}; + + CubeService.list(queryParam, function (all_cubes) { + if($scope.allCubes.length > 0){ + $scope.allCubes.splice(0,$scope.allCubes.length); + } + + for (var i = 0; i < all_cubes.length; i++) { + $scope.allCubes.push(all_cubes[i].name.toUpperCase()); + } + }); + if(($scope.state.mode === "edit") &&$scope.cubeMode=="addNewCube"&&($scope.allCubes.indexOf($scope.cubeMetaFrame.name.toUpperCase()) >= 0)){ SweetAlert.swal('Oops...', "The cube named [" + $scope.cubeMetaFrame.name.toUpperCase() + "] already exists", 'warning'); return false; diff --git a/webapp/app/js/controllers/cubes.js b/webapp/app/js/controllers/cubes.js index b672d3f..cbdbb7d 100644 --- a/webapp/app/js/controllers/cubes.js +++ b/webapp/app/js/controllers/cubes.js @@ -79,43 +79,6 @@ KylinApp.controller('CubesCtrl', function ($scope, $q, $routeParams, $location, return CubeList.list(queryParam).then(function (resp) { angular.forEach($scope.cubeList.cubes,function(cube,index){ - cube.streaming = false; - CubeDescService.query({cube_name: cube.name}, {}, function (detail) { - if (detail.length > 0 && detail[0].hasOwnProperty("name")) { - cube.detail = detail[0]; - ModelService.list({projectName:$scope.projectModel.selectedProject,modelName:cube.detail.model_name}, function (_models) { - if(_models && _models.length){ - for(var i=0;i<=_models.length;i++){ - if(_models[i].name == cube.detail.model_name){ - cube.model = _models[i]; - var factTable = cube.model.fact_table; - TableService.get({tableName:factTable},function(table){ - if(table && table.source_type == 1){ - cube.streaming = true; - } - }) - break; - } - } - } - - }) - //cube.model = modelsManager.getModel(cube.detail.model_name); - - defer.resolve(cube.detail); - - } 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'); - } - }); }) $scope.loading = false; @@ -331,140 +294,139 @@ KylinApp.controller('CubesCtrl', function ($scope, $q, $routeParams, $location, }; $scope.startJobSubmit = function (cube) { - $scope.loadDetail(cube); - // for streaming cube build tip - if(cube.streaming){ - - SweetAlert.swal({ - title: '', - text: "Are you sure to start the build?", - type: '', - showCancelButton: true, - confirmButtonColor: '#DD6B55', - confirmButtonText: "Yes", - closeOnConfirm: true - }, function(isConfirm) { - if(isConfirm){ - loadingRequest.show(); - CubeService.rebuildStreamingCube( - { - cubeId: cube.name - }, - { - sourceOffsetStart:0, - sourceOffsetEnd:'9223372036854775807', - buildType:'BUILD' - }, function (job) { - loadingRequest.hide(); - SweetAlert.swal('Success!', 'Rebuild job was submitted successfully', 'success'); - },function(e){ - - loadingRequest.hide(); - 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'); + + $scope.loadDetail(cube).then(function () { + $scope.metaModel={ + model:cube.model + }; + + TableService.get({tableName:$scope.metaModel.model.fact_table},function(table){ + if(table && table.source_type == 1){ + cube.streaming = true; + } + + // for streaming cube build tip + if(cube.streaming){ + $modal.open({ + templateUrl: 'streamingBuild.html', + controller: streamingBuildCtrl, + resolve: { + cube: function () { + return cube; + }, + metaModel:function(){ + return $scope.metaModel; + }, + buildType: function () { + return 'BUILD'; + }, + scope:function(){ + + return $scope; } + } }); + return; } - }) - return; - } - $scope.metaModel={ - model:modelsManager.getModelByCube(cube.name) - } - if ($scope.metaModel.model.name) { - if ($scope.metaModel.model.partition_desc.partition_date_column) { - - $modal.open({ - templateUrl: 'jobSubmit.html', - controller: jobSubmitCtrl, - resolve: { - cube: function () { - return cube; - }, - metaModel:function(){ - return $scope.metaModel; - }, - buildType: function () { - return 'BUILD'; - }, - scope:function(){ - - return $scope; - } + //for batch cube build tip + if ($scope.metaModel.model.name) { + + //for partition cube build tip + if ($scope.metaModel.model.partition_desc.partition_date_column) { + $modal.open({ + templateUrl: 'jobSubmit.html', + controller: jobSubmitCtrl, + resolve: { + cube: function () { + return cube; + }, + metaModel:function(){ + return $scope.metaModel; + }, + buildType: function () { + return 'BUILD'; + }, + scope:function(){ + return $scope; + } + } + }); } - }); - } - else { - SweetAlert.swal({ - title: '', - text: "Are you sure to start the build ?", - type: '', - showCancelButton: true, - confirmButtonColor: '#DD6B55', - confirmButtonText: "Yes", - closeOnConfirm: true - }, function(isConfirm) { - if(isConfirm){ + //for not partition cube build tip + else { + SweetAlert.swal({ + title: '', + text: "Are you sure to start the build ?", + type: '', + showCancelButton: true, + confirmButtonColor: '#DD6B55', + confirmButtonText: "Yes", + closeOnConfirm: true + }, function(isConfirm) { + if(isConfirm){ + + loadingRequest.show(); + CubeService.rebuildCube( + { + cubeId: cube.name + }, + { + buildType: 'BUILD', + startTime: 0, + endTime: 0 + }, function (job) { + + loadingRequest.hide(); + SweetAlert.swal('Success!', 'Rebuild job was submitted successfully', 'success'); + },function(e){ + + loadingRequest.hide(); + 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'); + } + }); + } - loadingRequest.show(); - CubeService.rebuildCube( - { - cubeId: cube.name - }, - { - buildType: 'BUILD', - startTime: 0, - endTime: 0 - }, function (job) { - - loadingRequest.hide(); - SweetAlert.swal('Success!', 'Rebuild job was submitted successfully', 'success'); - },function(e){ - - loadingRequest.hide(); - 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'); - } - }); + }); } + } + }) + }) - }); - } - } }; $scope.startRefresh = function (cube) { - $scope.metaModel={ - model:modelsManager.getModelByCube(cube.name) - }; - $modal.open({ - templateUrl: 'jobRefresh.html', - controller: jobSubmitCtrl, - resolve: { - cube: function () { - return cube; - }, - metaModel:function(){ - return $scope.metaModel; - }, - buildType: function () { - return 'REFRESH'; - }, - scope:function(){ - return $scope; + + $scope.loadDetail(cube).then(function () { + $scope.metaModel={ + model:cube.model + }; + $modal.open({ + templateUrl: 'jobRefresh.html', + controller: jobSubmitCtrl, + resolve: { + cube: function () { + return cube; + }, + metaModel:function(){ + return $scope.metaModel; + }, + buildType: function () { + return 'REFRESH'; + }, + scope:function(){ + return $scope; + } } + }); } - }); + ) }; @@ -493,27 +455,29 @@ KylinApp.controller('CubesCtrl', function ($scope, $q, $routeParams, $location, $location.path("cubes/edit/" + cube.name); } $scope.startMerge = function (cube) { - $scope.metaModel={ - model:modelsManager.getModelByCube(cube.name) - }; - $modal.open({ - templateUrl: 'jobMerge.html', - controller: jobSubmitCtrl, - resolve: { - cube: function () { - return cube; - }, - metaModel:function(){ - return $scope.metaModel; - }, - buildType: function () { - return 'MERGE'; - }, - scope:function(){ - return $scope; + $scope.loadDetail(cube).then(function () { + $scope.metaModel={ + model:cube.model + }; + $modal.open({ + templateUrl: 'jobMerge.html', + controller: jobSubmitCtrl, + resolve: { + cube: function () { + return cube; + }, + metaModel:function(){ + return $scope.metaModel; + }, + buildType: function () { + return 'MERGE'; + }, + scope:function(){ + return $scope; + } } - } - }); + }); + }) } }); diff --git a/webapp/app/js/controllers/models.js b/webapp/app/js/controllers/models.js index fb2c6d1..e3ee038 100644 --- a/webapp/app/js/controllers/models.js +++ b/webapp/app/js/controllers/models.js @@ -18,7 +18,7 @@ '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, modelsManager, cubesManager, TableModel, $animate) { +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, TableModel, AccessService) { //tree data @@ -131,21 +131,28 @@ KylinApp.controller('ModelsCtrl', function ($scope, $q, $routeParams, $location, var cubename = []; var modelstate=false; var i=0; - if (model.cubes.length != 0) { - angular.forEach(model.cubes,function(cube){ - if (cube.status=="READY"){ - modelstate=true; - cubename[i] =cube.name; - i++; - } - }) - } - if(modelstate==false){ - $location.path("/models/edit/"+model.name); - } - else{ - SweetAlert.swal('Sorry','This model is still used by '+ cubename.join(',')); - } + + CubeService.list({modelName:model.name}, function (_cubes) { + model.cubes = _cubes; + + if (model.cubes.length != 0) { + angular.forEach(model.cubes,function(cube){ + if (cube.status=="READY"){ + modelstate=true; + cubename[i] =cube.name; + i++; + } + }) + } + + if(modelstate==false){ + $location.path("/models/edit/"+model.name); + } + else{ + SweetAlert.swal('Sorry','This model is still used by '+ cubename.join(',')); + } + }) + }; $scope.cloneModel = function(model){ @@ -176,6 +183,21 @@ KylinApp.controller('ModelsCtrl', function ($scope, $q, $routeParams, $location, }); }; + $scope.listModelAccess = function (model) { + if(model.uuid){ + AccessService.list({type: "DataModelDesc", uuid: model.uuid}, function (accessEntities) { + model.accessEntities = accessEntities; + try { + if (!model.owner) { + model.owner = accessEntities[0].sid.principal; + } + } catch (error) { + $log.error("No acl info."); + } + }) + } + }; + var ModelDetailModalCtrl = function ($scope, $location, $modalInstance, scope) { modelsManager.selectedModel.visiblePage='metadata'; $scope.cancel = function () { diff --git a/webapp/app/js/model/cubeListModel.js b/webapp/app/js/model/cubeListModel.js index 13c924c..39853c0 100755 --- a/webapp/app/js/model/cubeListModel.js +++ b/webapp/app/js/model/cubeListModel.js @@ -25,10 +25,6 @@ KylinApp.service('CubeList',function(CubeService,$q,AccessService){ var defer = $q.defer(); CubeService.list(queryParam, function (_cubes) { angular.forEach(_cubes, function (cube, index) { - AccessService.list({type: "CubeInstance", uuid: cube.uuid}, function (accessEntities) { - cube.accessEntities = accessEntities; - }); - if(cube.name){ if (cube.segments && cube.segments.length > 0) { for(var i= cube.segments.length-1;i>=0;i--){ diff --git a/webapp/app/js/model/modelsManager.js b/webapp/app/js/model/modelsManager.js index c104405..faa8d39 100644 --- a/webapp/app/js/model/modelsManager.js +++ b/webapp/app/js/model/modelsManager.js @@ -25,56 +25,22 @@ KylinApp.service('modelsManager',function(ModelService,CubeService,$q,AccessServ this.loading = false; this.selectedModel={}; - this.cubeModel={}; - this.cubeSelected = false; - - //list models and complemete cube,access info + //list models this.list = function(queryParam){ _this.loading = true; var defer = $q.defer(); - var cubeDetail = []; - var modelPermission = []; ModelService.list(queryParam, function (_models) { - //_this.removeAll(); angular.forEach(_models, function (model, index) { - $log.info("Add model permission info"); - if(model.uuid){ - modelPermission.push( - AccessService.list({type: "DataModelDesc", uuid: model.uuid}, function (accessEntities) { - model.accessEntities = accessEntities; - try{ - if(!model.owner){ - model.owner = accessEntities[0].sid.principal; - } - } catch(error){ - $log.error("No acl info."); - } - - }).$promise - ) - } - - $log.info("Add cube info to model ,not detail info"); - cubeDetail.push( - CubeService.list({modelName:model.name}, function (_cubes) { - model.cubes = _cubes; - }).$promise - ); - _this.modelNameList.push(model.name); - - model.project = ProjectModel.getProjectByCubeModel(model.name); + model.project = ProjectModel.getProjectByCubeModel(model.name); }); - $q.all(cubeDetail,modelPermission).then( - function(result){ - _models = _.filter(_models,function(models){return models.name!=undefined}); - _this.models = _models; - _this.loading = false; - defer.resolve(_this.models); - } - ); + + _models = _.filter(_models,function(models){return models.name!=undefined}); + _this.models = _models; + _this.loading = false; + },function(){ defer.reject("Failed to load models"); }); @@ -127,5 +93,4 @@ KylinApp.service('modelsManager',function(ModelService,CubeService,$q,AccessServ return defer.promise; }; - }); diff --git a/webapp/app/partials/cubes/cubes.html b/webapp/app/partials/cubes/cubes.html index 0187523..4be7ecd 100644 --- a/webapp/app/partials/cubes/cubes.html +++ b/webapp/app/partials/cubes/cubes.html @@ -54,7 +54,6 @@ Actions Admins - Streaming @@ -83,12 +82,12 @@ {{ cube.owner}} {{ cube.create_time_utc | utcToConfigTimeZone}} -
+
-