blob: 958c65a4853aeda56a0b39d3c8631f83b5c00b53 [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('CubeAdvanceSettingCtrl', function ($scope, $modal,cubeConfig,MetaModel,cubesManager,CubeDescModel,SweetAlert,VdmUtil,modelsManager) {
$scope.cubesManager = cubesManager;
var needLengthKeyList=cubeConfig.needSetLengthEncodingList;
$scope.convertedRowkeys = [];
$scope.dim_cap = $scope.cubeMetaFrame.aggregation_groups.length > 0 && $scope.cubeMetaFrame.aggregation_groups[0].select_rule.dim_cap ? $scope.cubeMetaFrame.aggregation_groups[0].select_rule.dim_cap : 0;
angular.forEach($scope.cubeMetaFrame.rowkey.rowkey_columns,function(item){
item.encoding=$scope.removeVersion(item.encoding);
var _valueLength;
var tableName=VdmUtil.getNameSpaceTopName(item.column);
var databaseName=modelsManager.getDatabaseByColumnName(item.column);
var baseKey=item.encoding.replace(/:\d+/,'');
if(needLengthKeyList.indexOf(baseKey)>-1){
var result=/:(\d+)/.exec(item.encoding);
_valueLength=result?result[1]:0;
}
var _encoding=baseKey;
var rowkeyObj = {
column:item.column,
encoding:_encoding+(item.encoding_version?"[v"+item.encoding_version+"]":"[v1]"),
encodingName:_encoding,
valueLength:_valueLength,
isShardBy:item.isShardBy,
encoding_version:item.encoding_version||1,
table:tableName,
database:databaseName
}
if(item.index){
rowkeyObj.index=item.index;
}
$scope.convertedRowkeys.push(rowkeyObj);
})
$scope.rule={
shardColumnAvailable:true
}
var checkedlen=$scope.cubeMetaFrame.rowkey.rowkey_columns&&$scope.cubeMetaFrame.rowkey.rowkey_columns.length||0;
for(var i=0;i<checkedlen;i++){
$scope.cubeMetaFrame.rowkey.rowkey_columns[i].encoding_version=$scope.cubeMetaFrame.rowkey.rowkey_columns[i].encoding_version||1;
}
$scope.refreshRowKey = function(list,index,item,checkShard){
var encoding;
var column = item.column;
var isShardBy = item.isShardBy;
var version=$scope.getTypeVersion(item.encoding);
var encodingType=$scope.removeVersion(item.encoding);
if(needLengthKeyList.indexOf(encodingType)!=-1){
encoding = encodingType+":"+item.valueLength;
}else{
encoding = encodingType;
item.valueLength=0;
}
$scope.cubeMetaFrame.rowkey.rowkey_columns[index].column = column;
$scope.cubeMetaFrame.rowkey.rowkey_columns[index].encoding = encoding;
$scope.cubeMetaFrame.rowkey.rowkey_columns[index].encoding_version =version;
$scope.cubeMetaFrame.rowkey.rowkey_columns[index].isShardBy = isShardBy;
if(checkShard == true){
$scope.checkShardByColumn();
}
}
$scope.checkShardByColumn = function(){
var shardRowkeyList = [];
angular.forEach($scope.cubeMetaFrame.rowkey.rowkey_columns,function(rowkey){
if(rowkey.isShardBy == true){
shardRowkeyList.push(rowkey.column);
}
})
if(shardRowkeyList.length >1){
$scope.rule.shardColumnAvailable = false;
}else{
$scope.rule.shardColumnAvailable = true;
}
}
$scope.resortRowkey = function(){
for(var i=0;i<$scope.convertedRowkeys.length;i++){
$scope.refreshRowKey($scope.convertedRowkeys,i,$scope.convertedRowkeys[i]);
}
}
$scope.sortableOptions = {
stop:$scope.resortRowkey
};
$scope.changeDimCap = function (dim_cap) {
angular.forEach($scope.cubeMetaFrame.aggregation_groups, function (agg) {
agg.select_rule.dim_cap = dim_cap
})
}
$scope.addNewHierarchy = function(grp){
grp.select_rule.hierarchy_dims.push([]);
}
$scope.addNewJoint = function(grp){
grp.select_rule.joint_dims.push([]);
}
//to do, agg update
$scope.addNewAggregationGroup = function () {
$scope.cubeMetaFrame.aggregation_groups.push(CubeDescModel.createAggGroup());
};
$scope.refreshAggregationGroup = function (list, index, aggregation_groups) {
if (aggregation_groups) {
list[index] = aggregation_groups;
}
};
$scope.refreshAggregationHierarchy = function (list, index, aggregation_group,hieIndex,hierarchy) {
if(hierarchy){
aggregation_group.select_rule.hierarchy_dims[hieIndex] = hierarchy;
}
if (aggregation_group) {
list[index] = aggregation_group;
}
};
$scope.refreshAggregationJoint = function (list, index, aggregation_group,joinIndex,jointDim){
if(jointDim){
aggregation_group.select_rule.joint_dims[joinIndex] = jointDim;
}
if (aggregation_group) {
list[index] = aggregation_group;
}
};
$scope.refreshIncludes = function (list, index, aggregation_groups) {
if (aggregation_groups) {
list[index] = aggregation_groups;
}
};
$scope.removeElement = function (arr, element) {
var index = arr.indexOf(element);
if (index > -1) {
arr.splice(index, 1);
}
};
$scope.removeHierarchy = function(arr,element){
var index = arr.select_rule.hierarchy_dims.indexOf(element);
if(index>-1){
arr.select_rule.hierarchy_dims.splice(index,1);
}
}
$scope.removeJointDims = function(arr,element){
var index = arr.select_rule.joint_dims.indexOf(element);
if(index>-1){
arr.select_rule.joint_dims.splice(index,1);
}
}
$scope.isReuse=false;
$scope.addNew=false;
$scope.newDictionaries = {
"column":null,
"builder": null,
"reuse": null
}
$scope.initUpdateDictionariesStatus = function(){
$scope.updateDictionariesStatus = {
isEdit:false,
editIndex:-1
}
};
$scope.initUpdateDictionariesStatus();
$scope.addNewDictionaries = function (dictionaries, index) {
if(dictionaries&&index>=0){
$scope.updateDictionariesStatus.isEdit = true;
$scope.addNew=true;
$scope.updateDictionariesStatus.editIndex = index;
if(dictionaries.builder==null){
$scope.isReuse=true;
}
else{
$scope.isReuse=false;
}
}
else{
$scope.addNew=!$scope.addNew;
}
$scope.newDictionaries = (!!dictionaries)? jQuery.extend(true, {},dictionaries):CubeDescModel.createDictionaries();
};
$scope.saveNewDictionaries = function (){
if($scope.updateDictionariesStatus.isEdit == true) {
if ($scope.cubeMetaFrame.dictionaries[$scope.updateDictionariesStatus.editIndex].column != $scope.newDictionaries.column) {
if(!$scope.checkColumn()){
return false;
}
}
$scope.cubeMetaFrame.dictionaries[$scope.updateDictionariesStatus.editIndex] = $scope.newDictionaries;
}
else
{
if(!$scope.checkColumn()){
return false;
}
$scope.cubeMetaFrame.dictionaries.push($scope.newDictionaries);
}
$scope.newDictionaries = null;
$scope.initUpdateDictionariesStatus();
$scope.nextDictionariesInit();
$scope.addNew = !$scope.addNew;
$scope.isReuse = false;
return true;
};
$scope.nextDictionariesInit = function(){
$scope.nextDic = {
"coiumn":null,
"builder":null,
"reuse":null
}
}
$scope.checkColumn = function (){
var isColumnExit=false;
angular.forEach($scope.cubeMetaFrame.dictionaries,function(dictionaries){
if(!isColumnExit){
if(dictionaries.column==$scope.newDictionaries.column)
isColumnExit=true;
}
})
if(isColumnExit){
SweetAlert.swal('Oops...', "The column named [" + $scope.newDictionaries.column + "] already exists", 'warning');
return false;
}
return true;
}
$scope.clearNewDictionaries = function (){
$scope.newDictionaries = null;
$scope.isReuse=false;
$scope.initUpdateDictionariesStatus();
$scope.nextDictionariesInit();
$scope.addNew=!$scope.addNew;
}
$scope.change = function (){
$scope.newDictionaries.builder=null;
$scope.newDictionaries.reuse=null;
$scope.isReuse=!$scope.isReuse;
}
$scope.removeElement = function(arr,element){
var index = arr.indexOf(element);
if (index > -1) {
arr.splice(index, 1);
}
};
$scope.newColFamily = function (index) {
return {
"name": "F" + index,
"columns": [
{
"qualifier": "M",
"measure_refs": []
}
]
};
};
$scope.initColumnFamily = function () {
$scope.cubeMetaFrame.hbase_mapping.column_family = [];
var normalMeasures = [], distinctCountMeasures = [];
angular.forEach($scope.cubeMetaFrame.measures, function (measure, index) {
if (measure.function.expression === 'COUNT_DISTINCT') {
distinctCountMeasures.push(measure);
} else {
normalMeasures.push(measure);
}
});
if (normalMeasures.length > 0) {
var nmcf = $scope.newColFamily(1);
angular.forEach(normalMeasures, function (normalM, index) {
nmcf.columns[0].measure_refs.push(normalM.name);
});
$scope.cubeMetaFrame.hbase_mapping.column_family.push(nmcf);
}
if (distinctCountMeasures.length > 0) {
var dccf = $scope.newColFamily(2);
angular.forEach(distinctCountMeasures, function (dcm, index) {
dccf.columns[0].measure_refs.push(dcm.name);
});
$scope.cubeMetaFrame.hbase_mapping.column_family.push(dccf);
}
};
$scope.getAllMeasureNames = function () {
var measures = [];
angular.forEach($scope.cubeMetaFrame.measures, function (measure, index) {
measures.push(measure.name);
});
return measures;
};
$scope.getAssignedMeasureNames = function () {
var assignedMeasures = [];
angular.forEach($scope.cubeMetaFrame.hbase_mapping.column_family, function (colFamily, index) {
angular.forEach(colFamily.columns, function (column, index) {
angular.forEach(column.measure_refs, function (measure, index) {
assignedMeasures.push(measure);
});
})
});
return assignedMeasures;
};
$scope.rmDeprecatedMeasureNames = function () {
var allMeasureNames = $scope.getAllMeasureNames();
var tmpColumnFamily = $scope.cubeMetaFrame.hbase_mapping.column_family;
for(var j=0;j<$scope.cubeMetaFrame.hbase_mapping.column_family.length; j++) {
for (var k=0; k < $scope.cubeMetaFrame.hbase_mapping.column_family[j].columns.length; k++) {
for (var i=0;i<$scope.cubeMetaFrame.hbase_mapping.column_family[j].columns[k].measure_refs.length; i++){
var allIndex = allMeasureNames.indexOf($scope.cubeMetaFrame.hbase_mapping.column_family[j].columns[0].measure_refs[i]);
if (allIndex == -1) {
tmpColumnFamily[j].columns[0].measure_refs.splice(i, 1);
i--
}
}
if (tmpColumnFamily[j].columns[k].measure_refs.length == 0) {
tmpColumnFamily[j].columns.splice(k, 1);
k--
}
}
if (tmpColumnFamily[j].columns.length == 0) {
tmpColumnFamily.splice(j, 1);
j--
}
}
$scope.cubeMetaFrame.hbase_mapping.column_family = tmpColumnFamily;
};
if ($scope.getAssignedMeasureNames().length == 0) {
$scope.initColumnFamily();
} else {
$scope.rmDeprecatedMeasureNames();
if ($scope.getAllMeasureNames().length > $scope.getAssignedMeasureNames().length) {
$scope.initColumnFamily();
}
}
$scope.addColumnFamily = function () {
var isCFEmpty = _.some($scope.cubeMetaFrame.hbase_mapping.column_family, function(colFamily) {
return colFamily.columns[0].measure_refs.length == 0;
});
if (isCFEmpty === true) {
return;
}
var colFamily = $scope.newColFamily($scope.cubeMetaFrame.hbase_mapping.column_family.length + 1);
$scope.cubeMetaFrame.hbase_mapping.column_family.push(colFamily);
};
$scope.refreshColumnFamily = function (column_familys, index, colFamily) {
if (column_familys) {
column_familys[index] = colFamily;
}
};
$scope.mandatoryDimensionSet = {
select: []
};
$scope.uploadMandatoryDimensionSetList = function() {
var file = document.getElementById('cuboids').files[0];
if (file) {
var reader = new FileReader();
reader.onload = function(event) {
var dimensionSetList = JSON.parse(event.target.result);
$scope.cubeMetaFrame.mandatory_dimension_set_list = dimensionSetList;
$scope.$apply();
// TODO add verify dimension set
};
reader.readAsText(file);
} else {
swal('Oops...', 'Please choose your file first.', 'warning');
}
};
$scope.removeDimensionSet = function(index) {
$scope.cubeMetaFrame.mandatory_dimension_set_list.splice(index, 1);
};
$scope.addDimensionSet = function() {
if ($scope.mandatoryDimensionSet.select.length) {
// validate the dimension set existed
var existed = false;
var selectedDimension = _.clone($scope.mandatoryDimensionSet.select).sort(function (dimensionA, dimensionB) {
if (dimensionA < dimensionB) return 1;
if (dimensionB < dimensionA) return -1;
return 0;
});
angular.forEach($scope.cubeMetaFrame.mandatory_dimension_set_list, function(dimensionSet, index) {
var dimensionSetSorted = _.clone(dimensionSet).sort(function (dimensionA, dimensionB) {
if (dimensionA < dimensionB) return 1;
if (dimensionB < dimensionA) return -1;
return 0;
});
if (angular.equals(dimensionSet, selectedDimension)) {
existed = true;
};
});
if (!existed) {
$scope.cubeMetaFrame.mandatory_dimension_set_list.push($scope.mandatoryDimensionSet.select);
$scope.mandatoryDimensionSet.select = [];
} else {
swal('Oops...', 'Dimension set already existed', 'warning');
}
} else {
swal('Oops...', 'Dimension set should not be empty', 'warning');
}
};
if ($scope.state.mode == 'edit') {
$scope.$on('$destroy', function () {
$scope.$emit('AdvancedSettingEdited');
});
}
$scope.newSnapshot = {
select: {}
};
$scope.removeSnapshotTable = function(index) {
$scope.cubeMetaFrame.snapshot_table_desc_list.splice(index, 1);
};
$scope.addSnapshot = function(newSnapshot) {
if (!$scope.cubeMetaFrame.snapshot_table_desc_list) {
$scope.cubeMetaFrame.snapshot_table_desc_list = [];
}
if (!newSnapshot.table_name || !newSnapshot.storage_type) {
swal('Oops...', 'Snapshot table name or storage should not be empty', 'warning');
return;
} else if ($scope.cubeMetaFrame.snapshot_table_desc_list.length && newSnapshot.editIndex == null){
var existSnapshot = _.find($scope.cubeMetaFrame.snapshot_table_desc_list, function(snapshot){ return snapshot.table_name === newSnapshot.table_name;});
if (!!existSnapshot) {
swal('Oops...', 'Snapshot table already existed', 'warning');
return;
}
}
if (newSnapshot.editIndex != null) {
$scope.cubeMetaFrame.snapshot_table_desc_list[newSnapshot.editIndex] = angular.copy(newSnapshot);
} else {
$scope.cubeMetaFrame.snapshot_table_desc_list.push(angular.copy(newSnapshot));
}
$scope.newSnapshot.select = {};
$scope.addNewSanpshot = !$scope.addNewSanpshot;
};
$scope.changeSnapshotStorage = function(snapshot) {
if (snapshot.storage_type == 'hbase') {
snapshot.global = true;
}
};
$scope.changeSnapshotTable = function(changeSnapshot, beforeTableName, snapshotTableDescList) {
var existSnapshot = _.find(snapshotTableDescList, function(snapshot) {
return snapshot.table_name === changeSnapshot.table_name;
});
if (!!existSnapshot) {
changeSnapshot.table_name = beforeTableName;
swal('Oops...', 'Snapshot table already existed', 'warning');
}
};
$scope.addNewSnapshot = function(sanpshot, index) {
if (sanpshot && index >=0) {
$scope.newSnapshot.select = sanpshot;
$scope.addNewSanpshot = true;
$scope.newSnapshot.select.editIndex = index;
} else {
$scope.addNewSanpshot = !$scope.addNewSanpshot;
}
};
$scope.cancelEditSnapshot = function() {
$scope.newSnapshot.select = {};
$scope.addNewSanpshot = !$scope.addNewSanpshot;
};
$scope.getCubeLookups = function() {
var modelDesc = modelsManager.getModel($scope.cubeMetaFrame.model_name);
var modelLookups = modelDesc ? modelDesc.lookups : [];
var cubeLookups = [];
angular.forEach(modelLookups, function(modelLookup, index) {
var dimensionLookup = _.find($scope.cubeMetaFrame.dimensions, function(dimension){ return dimension.table === modelLookup.alias;});
if (!!dimensionLookup) {
if (cubeLookups.indexOf(modelLookup.table) === -1) {
cubeLookups.push(modelLookup.table);
}
}
});
return cubeLookups;
};
$scope.cubeLookups = $scope.getCubeLookups();
$scope.getCFDisplayString = function (columnFamily) {
var columnArr = new Array();
for (i = 0; i < columnFamily.columns.length; i++) {
columnArr[i] = columnFamily.columns[i].qualifier + ":[" + columnFamily.columns[i].measure_refs + "]"
}
return columnArr.join(", ");
};
});