blob: f8eee6b3bd3e73e525eef9853f281c2e93bf42d9 [file] [log] [blame]
/*
* 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.
*/
'use strict';
KylinApp.controller('CubesCtrl', function ($scope, $q, $routeParams, $location, $modal, MessageService, CubeDescService, CubeService, JobService, UserService, ProjectService, SweetAlert, loadingRequest, $log, cubeConfig, ProjectModel, ModelService, MetaModel, CubeList,modelsManager,TableService, kylinConfig, MessageBox, AdminStreamingService, tableConfig) {
$scope.cubeConfig = cubeConfig;
$scope.cubeList = CubeList;
$scope.modelsManager = modelsManager;
$scope.listParams = {
cubeName: $routeParams.cubeName,
projectName: $routeParams.projectName
};
if ($routeParams.projectName) {
$scope.projectModel.setSelectedProject($routeParams.projectName);
}
CubeList.removeAll();
$scope.loading = false;
$scope.action = {};
$scope.state = {
filterAttr: 'create_time_utc', filterReverse: true, reverseColumn: 'create_time_utc',
dimensionFilter: '', measureFilter: ''
};
$scope.refreshCube = function(cube){
var queryParam = {
cubeName: cube.name,
projectName: $scope.projectModel.selectedProject
};
var defer = $q.defer();
CubeService.list(queryParam, function(cubes){
for(var index in cubes){
if(cube.name === cubes[index].name){
defer.resolve(cubes[index]);
break;
}
}
defer.resolve([]);
},function(e){
defer.resolve([]);
})
return defer.promise;
}
$scope.list = function (offset, limit) {
var defer = $q.defer();
if (!$scope.projectModel.projects.length) {
defer.resolve([]);
return defer.promise;
}
offset = (!!offset) ? offset : 0;
limit = (!!limit) ? limit : 20;
var queryParam = {offset: offset, limit: limit};
if ($scope.listParams.cubeName) {
queryParam.cubeName = $scope.listParams.cubeName;
}
queryParam.projectName = $scope.projectModel.selectedProject;
$scope.loading = true;
return CubeList.list(queryParam).then(function (resp) {
angular.forEach($scope.cubeList.cubes,function(cube,index){
})
$scope.loading = false;
defer.resolve(resp);
return defer.promise;
},function(resp){
$scope.loading = false;
defer.resolve([]);
SweetAlert.swal('Oops...', resp, 'error');
return defer.promise;
});
};
$scope.$watch('projectModel.selectedProject', function (newValue, oldValue) {
if (newValue != oldValue || newValue == null) {
CubeList.removeAll();
$scope.reload();
}
});
$scope.reload = function () {
// trigger reload action in pagination directive
$scope.action.reload = !$scope.action.reload;
};
$scope.loadDetail = function (cube) {
var defer = $q.defer();
if (cube.detail) {
defer.resolve(cube);
} else {
CubeDescService.query({cube_name: cube.name}, {}, function (detail) {
if (detail.length > 0 && detail[0].hasOwnProperty("name")) {
cube.detail = detail[0];
cube.model = modelsManager.getModel(cube.detail.model_name);
defer.resolve(cube);
} 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');
}
});
}
return defer.promise;
};
$scope.getStreamingInfo = function(cube) {
var defer = $q.defer();
if (cube.streamingV2) {
defer.resolve(cube);
} else {
var cubeModel = modelsManager.getModel(cube.model.name);
var cubeTable = cubeModel.fact_table;
var cubeProject = $scope.projectModel.selectedProject || cubeModel.project;
TableService.get({tableName: cubeTable, pro: cubeProject},function(table){
if (table && table.source_type == 1) {
cube.streaming = true;
} else if (table && _.values(tableConfig.streamingSourceType).indexOf(table.source_type) > -1){
cube.streamingV2 = true;
if (table.source_type == tableConfig.streamingSourceType.kafka_hive) {
cube.lambda = true;
}
}
defer.resolve(cube);
});
}
return defer.promise;
};
$scope.loadDetailWithStreamingV2Info = function(cube){
$scope.loadDetail(cube).then(function(cube) {
return $scope.getStreamingInfo(cube);
});
};
$scope.getTotalSize = function (cubes) {
var size = 0;
if (!cubes) {
return 0;
}
else {
for (var i = 0; i < cubes.length; i++) {
size += cubes[i].size_kb;
}
return $scope.dataSize(size * 1024);
}
};
$scope.getStreamingV2State = function(cube) {
var defer = $q.defer();
if (cube.consumeState) {
defer.resolve(cube);
} else {
if (cube.streamingV2) {
AdminStreamingService.getConsumeState({cubeName:cube.name}, function(state) {
cube.consumeState = state;
});
}
defer.resolve(cube);
}
return defer.promise;
};
// List Cube Action
$scope.listCubeAction = function(cube) {
$scope.actionLoaded = false;
$scope.loadDetail(cube).then(function(cube) {
return $scope.getStreamingInfo(cube);
}, function(reason) {
console.error(reason);
$scope.actionLoaded = true;
}).then(function(cube) {
return $scope.getStreamingV2State(cube);
}, function(reason) {
console.error(reason);
$scope.actionLoaded = true;
}).then(function(cube) {
$scope.actionLoaded = true;
});
};
// Cube Action
$scope.enable = function (cube) {
SweetAlert.swal({
title: '',
text: 'Are you sure to enable the cube? Please note: if cube schema is changed in the disabled period, all segments of the cube will be discarded due to data and schema mismatch.',
type: '',
showCancelButton: true,
confirmButtonColor: '#DD6B55',
closeOnConfirm: true
}, function(isConfirm) {
if(isConfirm){
loadingRequest.show();
CubeService.enable({cubeId: cube.name}, {}, function (result) {
loadingRequest.hide();
$scope.refreshCube(cube).then(function(_cube){
if(_cube && _cube.name){
$scope.cubeList.cubes[$scope.cubeList.cubes.indexOf(cube)] = _cube;
}
});
MessageBox.successNotify('Enable job was submitted successfully');
},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.purge = function (cube) {
SweetAlert.swal({
title: '',
text: 'Are you sure to purge the cube? ',
type: '',
showCancelButton: true,
confirmButtonColor: '#DD6B55',
confirmButtonText: "Yes",
closeOnConfirm: true
}, function(isConfirm) {
if(isConfirm){
loadingRequest.show();
CubeService.purge({cubeId: cube.name}, {}, function (result) {
loadingRequest.hide();
$scope.refreshCube(cube).then(function(_cube){
if(_cube && _cube.name){
$scope.cubeList.cubes[$scope.cubeList.cubes.indexOf(cube)] = _cube;
}
});
MessageBox.successNotify('Purge job was submitted successfully');
},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.disable = function (cube) {
SweetAlert.swal({
title: '',
text: 'Are you sure to disable the cube? ',
type: '',
showCancelButton: true,
confirmButtonColor: '#DD6B55',
confirmButtonText: "Yes",
closeOnConfirm: true
}, function(isConfirm) {
if(isConfirm){
loadingRequest.show();
CubeService.disable({cubeId: cube.name}, {}, function (result) {
loadingRequest.hide();
$scope.refreshCube(cube).then(function(_cube){
if(_cube && _cube.name){
$scope.cubeList.cubes[$scope.cubeList.cubes.indexOf(cube)] = _cube;
}
});
MessageBox.successNotify('Disable job was submitted successfully');
},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.dropCube = function (cube) {
SweetAlert.swal({
title: '',
text: " Once it's dropped, your cube’s metadata and data will be cleaned up and can’t be restored back. ",
type: '',
showCancelButton: true,
confirmButtonColor: '#DD6B55',
confirmButtonText: "Yes",
closeOnConfirm: true
}, function(isConfirm) {
if(isConfirm){
loadingRequest.show();
CubeService.drop({cubeId: cube.name}, {}, function (result) {
loadingRequest.hide();
MessageBox.successNotify('Cube drop is done successfully');
$scope.cubeList.cubes.splice($scope.cubeList.cubes.indexOf(cube),1);
},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.isAutoMigrateCubeEnabled = function(){
return kylinConfig.isAutoMigrateCubeEnabled();
};
$scope.migrateCube = function (cube) {
SweetAlert.swal({
title: '',
text: "The cube will overwrite the same cube in prod env" +
"\nMigrating cube will elapse a couple of minutes." +
"\nPlease wait.",
type: '',
showCancelButton: true,
confirmButtonColor: '#DD6B55',
confirmButtonText: "Yes",
closeOnConfirm: true
}, function(isConfirm) {
if(isConfirm){
loadingRequest.show();
CubeService.autoMigrate({cubeId: cube.name, propName: $scope.projectModel.selectedProject}, {}, function (result) {
loadingRequest.hide();
MessageBox.successNotify(cube.name + ' migrate successfully!');
},function(e){
loadingRequest.hide();
SweetAlert.swal('Migrate failed!', "Please contact your ADMIN.", 'error');
});
}
});
};
$scope.startJobSubmit = function (cube) {
$scope.metaModel={
model:cube.model
};
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();
MessageBox.successNotify('Rebuild job was submitted successfully');
},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');
}
});
}
})
return;
}
//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;
}
}
});
}
//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();
MessageBox.successNotify('Rebuild job was submitted successfully');
},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: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;
}
}
});
};
$scope.cloneCube = function(cube){
if(!$scope.projectModel.selectedProject){
SweetAlert.swal('Oops...', "Please choose project before clone.", 'info');
return;
}
$modal.open({
templateUrl: 'cubeClone.html',
controller: cubeCloneCtrl,
windowClass:"clone-cube-window",
resolve: {
cube: function () {
return cube;
}
}
});
}
$scope.cubeEdit = function (cube) {
$location.path("cubes/edit/" + cube.name);
}
$scope.startMerge = function (cube) {
$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;
}
}
});
};
$scope.startDeleteSegment = function (cube) {
$scope.metaModel={
model:modelsManager.getModelByCube(cube.name)
};
$modal.open({
templateUrl: 'deleteSegment.html',
controller: deleteSegmentCtrl,
resolve: {
cube: function () {
return cube;
},
scope: function() {
return $scope;
}
}
});
};
$scope.startLookupRefresh = function(cube) {
$scope.metaModel={
model:cube.model
};
$modal.open({
templateUrl: 'lookupRefresh.html',
controller: lookupRefreshCtrl,
resolve: {
cube: function () {
return cube;
},
scope:function(){
return $scope;
}
}
});
};
$scope.addMeasure = function (cube) {
$location.path("cubes/measure/" + cube.name);
};
$scope.listCubeAccess = function (cube) {
//check project auth for user
$scope.cubeProjectEntity = _.find($scope.projectModel.projects, function(project) {return project.name == $scope.projectModel.selectedProject;});
if (!!cube.uuid) {
$scope.listAccess(cube, 'CubeInstance');
}
};
// streaming cube action
$scope.startCube = function(cube) {
AdminStreamingService.assignCube({cubeName:cube.name}, {}, function(data){
SweetAlert.swal({
title: 'Success!',
text: 'Cube start successful',
type: 'success',
confirmButtonText: 'OK',
confirmButtonClass: 'btn-primary',
closeOnConfirm: true
}, function () {
location.reload();
});
}, function(e){
if(e.data&& e.data.exception){
var message =e.data.exception;
var msg = !!(message) ? message : 'Failed to start cube';
SweetAlert.swal('Oops...', msg, 'error');
} else{
SweetAlert.swal('Oops...', 'Failed to start cube', 'error');
}
});
};
$scope.pauseCube = function(cube) {
AdminStreamingService.suspendCubeConsume({cubeName:cube.name}, {}, function(data){
SweetAlert.swal({
title: 'Success!',
text: 'Cube pause successful',
type: 'success',
confirmButtonText: 'OK',
confirmButtonClass: 'btn-primary',
closeOnConfirm: true
}, function () {
location.reload();
});
}, function(e){
if(e.data&& e.data.exception){
var message =e.data.exception;
var msg = !!(message) ? message : 'Failed to pause cube';
SweetAlert.swal('Oops...', msg, 'error');
} else{
SweetAlert.swal('Oops...', 'Failed to pause cube', 'error');
}
});
};
$scope.resumeCube = function(cube) {
AdminStreamingService.resumeCubeConsume({cubeName:cube.name}, {}, function(data){
SweetAlert.swal({
title: 'Success!',
text: 'Cube resume successful',
type: 'success',
confirmButtonText: 'OK',
confirmButtonClass: 'btn-primary',
closeOnConfirm: true
}, function () {
location.reload();
});
}, function(e){
if(e.data&& e.data.exception){
var message =e.data.exception;
var msg = !!(message) ? message : 'Failed to resume cube';
SweetAlert.swal('Oops...', msg, 'error');
} else{
SweetAlert.swal('Oops...', 'Failed to resume cube', 'error');
}
});
};
$scope.viewAssignment = function(cube) {
AdminStreamingService.getCubeAssignment({cube: cube.name}, function(data) {
$modal.open({
templateUrl: 'cubeAssignment.html',
controller: function($scope, assignment, cube, $modalInstance) {
$scope.status = 'view';
$scope.assignmentGridOptions = {
paginationPageSize: 20,
columnDefs: [
{ name: 'Replica Set ID', field: 'rs_id', width:'20%'},
{ name: 'Partition', field: 'partitions', width:'*', cellTemplate: '<div class="ui-grid-cell-contents"><span class="label label-primary" style="margin-right:5px;" ng-repeat="partition in row.entity.partitions">{{partition.partition_id}}</span></div>' }
]
};
$scope.assignmentGridOptions.data = assignment[cube];
$scope.cancel = function() {
$modalInstance.dismiss('cancel');
};
$scope.editAssignment = function() {
$scope.cubePartitions = [];
angular.forEach(assignment[cube], function(replicaSet, index) {
$scope.cubePartitions = $scope.cubePartitions.concat(replicaSet.partitions);
});
$scope.replicaSetIds = [];
AdminStreamingService.getReplicaSets({}, function (data) {
angular.forEach(data, function(rs, index) {
$scope.replicaSetIds.push(rs.rs_id);
});
$scope.status = 'edit';
$scope.currentAssignment = assignment[cube];
},function(e){
if (e.data && e.data.exception) {
var message = e.data.exception;
var msg = !!(message) ? message : 'Failed to get replica set info';
SweetAlert.swal('Oops...', msg, 'error');
} else {
SweetAlert.swal('Oops...', 'Failed to get replica set info', 'error');
}
});
};
$scope.removeReplicaSet = function(index) {
console.log('remove element:', $scope.currentAssignment[index]);
$scope.currentAssignment.splice(index, 1);
};
$scope.addReplicaSet = function() {
$scope.currentAssignment.push({rs_id:"", partitions:[]});
};
$scope.reAssignCube = function() {
AdminStreamingService.reAssignCube({cubeName: cube}, {cube_name: cube, assignments: $scope.currentAssignment}, function(data){
$scope.cancel();
}, function(e){
if(e.data&& e.data.exception){
var message =e.data.exception;
var msg = !!(message) ? message : 'Failed to reAssign cube';
SweetAlert.swal('Oops...', msg, 'error');
} else{
SweetAlert.swal('Oops...', 'Failed to reAssign cube', 'error');
}
});
};
},
resolve: {
assignment: function() {
return data;
},
cube: function() {
return cube.name;
}
}
});
}, function(e) {
if(e.data&& e.data.exception){
var message =e.data.exception;
var msg = !!(message) ? message : 'Failed to get cube assignment info';
SweetAlert.swal('Oops...', msg, 'error');
} else{
SweetAlert.swal('Oops...', 'Failed to get cube assignment info', 'error');
}
});
};
});
var cubeCloneCtrl = function ($scope, $modalInstance, CubeService, MessageService, $location, cube, MetaModel, SweetAlert,ProjectModel, loadingRequest, MessageBox) {
$scope.projectModel = ProjectModel;
$scope.targetObj={
cubeName:cube.descriptor+"_clone",
targetProject:$scope.projectModel.selectedProject
}
$scope.cancel = function () {
$modalInstance.dismiss('cancel');
};
$scope.cloneCube = function(){
if(!$scope.targetObj.targetProject){
SweetAlert.swal('Oops...', "Please select target project.", 'info');
return;
}
$scope.cubeRequest = {
cubeName:$scope.targetObj.cubeName,
project:$scope.targetObj.targetProject
}
SweetAlert.swal({
title: '',
text: 'Are you sure to clone the cube? ',
type: '',
showCancelButton: true,
confirmButtonColor: '#DD6B55',
confirmButtonText: "Yes",
closeOnConfirm: true
}, function (isConfirm) {
if (isConfirm) {
loadingRequest.show();
CubeService.clone({cubeId: cube.name}, $scope.cubeRequest, function (result) {
loadingRequest.hide();
MessageBox.successNotify('Clone cube successfull');
location.reload();
}, 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');
}
});
}
});
}
}
var jobSubmitCtrl = function ($scope, $modalInstance, CubeService, MessageService, $location, cube, metaModel, buildType, SweetAlert, loadingRequest, scope, CubeList,$filter, MessageBox) {
$scope.cubeList = CubeList;
$scope.cube = cube;
$scope.metaModel = metaModel;
$scope.jobBuildRequest = {
buildType: buildType,
startTime: 0,
endTime: 0
};
$scope.message = "";
var startTime;
if(cube.segments.length == 0){
startTime = (!!cube.detail.partition_date_start)?cube.detail.partition_date_start:0;
}else{
startTime = cube.segments[cube.segments.length-1].date_range_end;
}
$scope.jobBuildRequest.startTime=startTime;
$scope.rebuild = function (isForce) {
$scope.message = null;
if ($scope.jobBuildRequest.startTime >= $scope.jobBuildRequest.endTime) {
$scope.message = "WARNING: End time should be later than the start time.";
return;
}
$scope.jobBuildRequest.forceMergeEmptySegment = !!isForce;
loadingRequest.show();
CubeService.rebuildCube({cubeId: cube.name}, $scope.jobBuildRequest, function (job) {
loadingRequest.hide();
$modalInstance.dismiss('cancel');
MessageBox.successNotify('Rebuild job was submitted successfully');
scope.refreshCube(cube).then(function(_cube){
$scope.cubeList.cubes[$scope.cubeList.cubes.indexOf(cube)] = _cube;
});
}, function (e) {
loadingRequest.hide();
if (e.data && e.data.exception) {
var message = e.data.exception;
if(message.indexOf("Empty cube segment found")!=-1){
var _segment = message.substring(message.indexOf(":")+1,message.length-1);
SweetAlert.swal({
title:'',
type:'info',
text: 'Empty cube segment found'+':'+_segment+', do you want to merge segments forcely ?',
showCancelButton: true,
confirmButtonColor: '#DD6B55',
closeOnConfirm: true
}, function (isConfirm) {
if (isConfirm) {
$scope.rebuild(true);
}
});
return;
}
if(message.indexOf("Merging segments must not have gaps between")!=-1){
SweetAlert.swal({
title:'',
type:'info',
text: 'There ares gaps between segments, do you want to merge segments forcely ?',
showCancelButton: true,
confirmButtonColor: '#DD6B55',
closeOnConfirm: true
}, function (isConfirm) {
if (isConfirm) {
$scope.rebuild(true);
}
});
return;
}
var msg = !!(message) ? message : 'Failed to take action.';
SweetAlert.swal('Oops...', msg, 'error');
} else {
SweetAlert.swal('Oops...', "Failed to take action.", 'error');
}
});
};
// used by cube segment refresh
$scope.segmentSelected = function (selectedSegment) {
$scope.jobBuildRequest.startTime = 0;
$scope.jobBuildRequest.endTime = 0;
if (selectedSegment.date_range_start) {
$scope.jobBuildRequest.startTime = selectedSegment.date_range_start;
}
if (selectedSegment.date_range_end) {
$scope.jobBuildRequest.endTime = selectedSegment.date_range_end;
}
};
// used by cube segments merge
$scope.mergeStartSelected = function (mergeStartSeg) {
$scope.jobBuildRequest.startTime = 0;
if (mergeStartSeg.date_range_start) {
$scope.jobBuildRequest.startTime = mergeStartSeg.date_range_start;
}
};
$scope.mergeEndSelected = function (mergeEndSeg) {
$scope.jobBuildRequest.endTime = 0;
if (mergeEndSeg.date_range_end) {
$scope.jobBuildRequest.endTime = mergeEndSeg.date_range_end;
}
};
$scope.cancel = function () {
$modalInstance.dismiss('cancel');
};
};
var streamingBuildCtrl = function ($scope, $modalInstance,kylinConfig) {
$scope.kylinConfig = kylinConfig;
var streamingGuildeUrl = kylinConfig.getProperty("kylin.web.link-streaming-guide");
$scope.streamingBuildUrl = streamingGuildeUrl?streamingGuildeUrl:"http://kylin.apache.org/";
$scope.cancel = function () {
$modalInstance.dismiss('cancel');
};
};
var deleteSegmentCtrl = function($scope, $modalInstance, CubeService, SweetAlert, loadingRequest, cube, scope, MessageBox) {
$scope.cube = cube;
$scope.deleteSegments = [];
$scope.segment = {};
$scope.cancel = function () {
$modalInstance.dismiss('cancel');
};
$scope.deleteSegment = function() {
SweetAlert.swal({
title: '',
text: 'Are you sure to delete segment ['+$scope.segment.selected.name+']? ',
type: '',
showCancelButton: true,
confirmButtonColor: '#DD6B55',
confirmButtonText: "Yes",
closeOnConfirm: true
}, function(isConfirm) {
if(isConfirm){
loadingRequest.show();
CubeService.deleteSegment({cubeId: cube.name, propValue: $scope.segment.selected.name}, {}, function (result) {
loadingRequest.hide();
$modalInstance.dismiss('cancel');
scope.refreshCube(cube).then(function(_cube){
if(_cube && _cube.name){
scope.cubeList.cubes[scope.cubeList.cubes.indexOf(cube)] = _cube;
}
});
MessageBox.successNotify('Delete segment successfully');
},function(e){
loadingRequest.hide();
if(e.data&& e.data.exception){
var message =e.data.exception;
var msg = !!(message) ? message : 'Failed to delete segment.';
SweetAlert.swal('Oops...', msg, 'error');
}else{
SweetAlert.swal('Oops...', 'Failed to delete segment.', 'error');
}
});
}
});
};
};
var lookupRefreshCtrl = function($scope, scope, CubeList, $modalInstance, CubeService, cube, SweetAlert, loadingRequest, MessageBox) {
$scope.cubeList = CubeList;
$scope.cube = cube;
$scope.dispalySegment = false;
$scope.getLookups = function() {
var modelLookups = cube.model ? cube.model.lookups : [];
var cubeLookups = [];
angular.forEach(modelLookups, function(modelLookup, index) {
var dimensionTables = _.find(cube.detail.dimensions, function(dimension){ return dimension.table === modelLookup.alias;});
if (!!dimensionTables) {
if (cubeLookups.indexOf(modelLookup.table) === -1) {
cubeLookups.push(modelLookup.table);
}
}
});
return cubeLookups;
};
$scope.cubeLookups = $scope.getLookups();
$scope.lookup = {
select: {}
};
$scope.getReadySegment = function(segment) {
return segment.status === 'READY';
};
$scope.cancel = function () {
$modalInstance.dismiss('cancel');
};
$scope.updateLookupTable = function(tableName) {
var lookupTable = _.find(cube.detail.snapshot_table_desc_list, function(table){ return table.table_name == tableName});
if (!!lookupTable && lookupTable.global) {
$scope.dispalySegment = false;
$scope.lookup.select.segments = [];
} else {
$scope.dispalySegment = true;
}
};
$scope.selectAllSegments = function(allSegments) {
if (allSegments) {
$scope.lookup.select.segments = $scope.cube.segments;
} else {
$scope.lookup.select.segments = [];
}
};
$scope.refresh = function() {
if (!$scope.lookup.select.table_name) {
SweetAlert.swal('Warning', 'Lookup table should not be empty', 'warning');
return;
}
// cube advance lookup table
var lookupTable = _.find(cube.detail.snapshot_table_desc_list, function(table){ return table.table_name == $scope.lookup.select.table_name});
if (!!lookupTable) {
if (!lookupTable.global && $scope.lookup.select.segments.length == 0) {
SweetAlert.swal('Warning', 'Segment should not be empty', 'warning');
return;
}
} else {
// cube lookup table
lookupTable = _.find($scope.cubeLookups, function(table){ return table == $scope.lookup.select.table_name});
if (!lookupTable) {
SweetAlert.swal('Warning', 'Lookup table not existed in cube', 'warning');
return;
} else {
if ($scope.lookup.select.segments.length == 0) {
SweetAlert.swal('Warning', 'Segment should not be empty', 'warning');
return;
}
}
}
var lookupSnapshotBuildRequest = {
lookupTableName: $scope.lookup.select.table_name,
segmentIDs: _.map($scope.lookup.select.segments, function(segment){ return segment.uuid})
};
loadingRequest.show();
CubeService.lookupRefresh({cubeId: cube.name}, lookupSnapshotBuildRequest, function (job) {
loadingRequest.hide();
$modalInstance.dismiss('cancel');
MessageBox.successNotify('Lookup refresh job was submitted successfully');
scope.refreshCube(cube).then(function(_cube){
$scope.cubeList.cubes[$scope.cubeList.cubes.indexOf(cube)] = _cube;
});
}, 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');
}
});
};
};