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:09 UTC
[40/52] [abbrv] incubator-kylin git commit: add drop data model
feature
add drop data model feature
Project: http://git-wip-us.apache.org/repos/asf/incubator-kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-kylin/commit/97963b8f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-kylin/tree/97963b8f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-kylin/diff/97963b8f
Branch: refs/heads/0.8.0
Commit: 97963b8fe3903b856a5f119bf271f9737eac34f6
Parents: 9f9d49d
Author: jiazhong <ji...@ebay.com>
Authored: Tue Apr 7 17:10:09 2015 +0800
Committer: honma <ho...@ebay.com>
Committed: Fri May 15 11:38:32 2015 +0800
----------------------------------------------------------------------
.../org/apache/kylin/cube/CubeDescManager.java | 5 +++
.../kylin/invertedindex/IIDescManager.java | 5 +++
.../apache/kylin/metadata/MetadataManager.java | 24 +++++++++++-
.../kylin/metadata/project/ProjectManager.java | 1 -
.../kylin/rest/controller/ModelController.java | 4 +-
.../apache/kylin/rest/service/ModelService.java | 23 +++++++++--
webapp/app/js/controllers/cube.js | 4 +-
webapp/app/js/controllers/cubeModel.js | 40 +++++++++++++++++++-
webapp/app/js/controllers/cubes.js | 6 ++-
webapp/app/js/controllers/modelEdit.js | 4 +-
webapp/app/js/controllers/models.js | 4 +-
webapp/app/partials/models/model_detail.html | 6 ++-
12 files changed, 109 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/97963b8f/cube/src/main/java/org/apache/kylin/cube/CubeDescManager.java
----------------------------------------------------------------------
diff --git a/cube/src/main/java/org/apache/kylin/cube/CubeDescManager.java b/cube/src/main/java/org/apache/kylin/cube/CubeDescManager.java
index a809d86..ac5fc2b 100644
--- a/cube/src/main/java/org/apache/kylin/cube/CubeDescManager.java
+++ b/cube/src/main/java/org/apache/kylin/cube/CubeDescManager.java
@@ -19,6 +19,7 @@
package org.apache.kylin.cube;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
@@ -96,6 +97,10 @@ public class CubeDescManager {
return cubeDescMap.get(name);
}
+ public List<CubeDesc> listAllDesc(){
+ return new ArrayList<CubeDesc>(cubeDescMap.values());
+ }
+
/**
* Reload CubeDesc from resource store It will be triggered by an desc
* update event.
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/97963b8f/invertedindex/src/main/java/org/apache/kylin/invertedindex/IIDescManager.java
----------------------------------------------------------------------
diff --git a/invertedindex/src/main/java/org/apache/kylin/invertedindex/IIDescManager.java b/invertedindex/src/main/java/org/apache/kylin/invertedindex/IIDescManager.java
index e350764..ae38955 100644
--- a/invertedindex/src/main/java/org/apache/kylin/invertedindex/IIDescManager.java
+++ b/invertedindex/src/main/java/org/apache/kylin/invertedindex/IIDescManager.java
@@ -32,6 +32,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
@@ -89,6 +90,10 @@ public class IIDescManager {
reloadAllIIDesc();
}
+ public List<IIDesc> listAllDesc(){
+ return new ArrayList<IIDesc>(iiDescMap.values());
+ }
+
public IIDesc getIIDesc(String name) {
return iiDescMap.get(name);
}
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/97963b8f/metadata/src/main/java/org/apache/kylin/metadata/MetadataManager.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/MetadataManager.java b/metadata/src/main/java/org/apache/kylin/metadata/MetadataManager.java
index 933826b..331bd83 100644
--- a/metadata/src/main/java/org/apache/kylin/metadata/MetadataManager.java
+++ b/metadata/src/main/java/org/apache/kylin/metadata/MetadataManager.java
@@ -32,7 +32,6 @@ import org.apache.kylin.metadata.project.ProjectManager;
import org.apache.kylin.metadata.project.RealizationEntry;
import org.apache.kylin.metadata.realization.IRealization;
import org.apache.kylin.metadata.realization.RealizationRegistry;
-import org.apache.kylin.metadata.realization.RealizationType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -47,6 +46,8 @@ import org.apache.kylin.common.restclient.CaseInsensitiveStringCache;
import org.apache.kylin.common.util.JsonUtil;
import org.apache.kylin.metadata.model.DataModelDesc;
+import javax.xml.crypto.Data;
+
/**
* Serves (and caches) metadata for Kylin instance.
* <p/>
@@ -361,6 +362,27 @@ public class MetadataManager {
}
}
+ // sync on update
+ public DataModelDesc dropModel(DataModelDesc desc) throws IOException {
+ logger.info("Dropping model '" + desc.getName() + "'");
+ ResourceStore store = getStore();
+ if (desc != null)
+ store.deleteResource(desc.getResourcePath());
+ // delete model from project
+ ProjectManager.getInstance(config).removeModelFromProjects(desc.getName());
+ // clean model cache
+ this.afterModelDropped(desc);
+ return desc;
+ }
+
+ private void afterModelDropped(DataModelDesc desc) {
+ removeModelCache(desc);
+ }
+
+ private void removeModelCache(DataModelDesc desc){
+ dataModelDescMap.remove(desc.getName());
+ }
+
public DataModelDesc createDataModelDesc(DataModelDesc desc,String projectName,String owner) throws IOException {
String name = desc.getName();
if (dataModelDescMap.containsKey(name))
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/97963b8f/metadata/src/main/java/org/apache/kylin/metadata/project/ProjectManager.java
----------------------------------------------------------------------
diff --git a/metadata/src/main/java/org/apache/kylin/metadata/project/ProjectManager.java b/metadata/src/main/java/org/apache/kylin/metadata/project/ProjectManager.java
index 9538398..d6a383c 100644
--- a/metadata/src/main/java/org/apache/kylin/metadata/project/ProjectManager.java
+++ b/metadata/src/main/java/org/apache/kylin/metadata/project/ProjectManager.java
@@ -232,7 +232,6 @@ public class ProjectManager {
public void removeModelFromProjects(String modelName) throws IOException {
for (ProjectInstance projectInstance : findProjects(modelName)) {
projectInstance.removeModel(modelName);
-
saveResource(projectInstance);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/97963b8f/server/src/main/java/org/apache/kylin/rest/controller/ModelController.java
----------------------------------------------------------------------
diff --git a/server/src/main/java/org/apache/kylin/rest/controller/ModelController.java b/server/src/main/java/org/apache/kylin/rest/controller/ModelController.java
index 290904d..9eb5a41 100644
--- a/server/src/main/java/org/apache/kylin/rest/controller/ModelController.java
+++ b/server/src/main/java/org/apache/kylin/rest/controller/ModelController.java
@@ -24,7 +24,6 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import org.apache.commons.lang.StringUtils;
import org.apache.kylin.common.util.JsonUtil;
-import org.apache.kylin.cube.CubeInstance;
import org.apache.kylin.metadata.model.DataModelDesc;
import org.apache.kylin.metadata.project.ProjectInstance;
import org.apache.kylin.rest.exception.BadRequestException;
@@ -142,7 +141,7 @@ public class ModelController extends BasicController {
throw new NotFoundException("Data Model with name " + modelName + " not found..");
}
try {
- modelService.deleteModel(desc);
+ modelService.dropModel(desc);
} catch (Exception e) {
logger.error(e.getLocalizedMessage(), e);
throw new InternalErrorException("Failed to delete model. " + " Caused by: " + e.getMessage(), e);
@@ -172,6 +171,7 @@ public class ModelController extends BasicController {
request.setSuccessful(success);
request.setMessage(message);
}
+
public void setModelService(ModelService modelService) {
this.modelService = modelService;
}
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/97963b8f/server/src/main/java/org/apache/kylin/rest/service/ModelService.java
----------------------------------------------------------------------
diff --git a/server/src/main/java/org/apache/kylin/rest/service/ModelService.java b/server/src/main/java/org/apache/kylin/rest/service/ModelService.java
index 2780f40..11f2ca0 100644
--- a/server/src/main/java/org/apache/kylin/rest/service/ModelService.java
+++ b/server/src/main/java/org/apache/kylin/rest/service/ModelService.java
@@ -19,6 +19,8 @@
package org.apache.kylin.rest.service;
+import org.apache.kylin.cube.model.CubeDesc;
+import org.apache.kylin.invertedindex.model.IIDesc;
import org.apache.kylin.metadata.model.DataModelDesc;
import org.apache.kylin.metadata.project.ProjectInstance;
import org.apache.kylin.rest.constant.Constant;
@@ -113,13 +115,26 @@ public class ModelService extends BasicService {
@PreAuthorize(Constant.ACCESS_HAS_ROLE_ADMIN + " or hasPermission(#desc, 'ADMINISTRATION') or hasPermission(#desc, 'MANAGEMENT')")
- public void deleteModel(DataModelDesc desc) throws IOException {
-// final List<CubingJob> cubingJobs = listAllCubingJobs(cube.getName(), null, EnumSet.of(ExecutableState.READY, ExecutableState.RUNNING));
+ public void dropModel(DataModelDesc desc) throws IOException {
+ //check cube desc exist
+ List<CubeDesc> cubeDescs = getCubeDescManager().listAllDesc();
+ for(CubeDesc cubeDesc:cubeDescs){
+ if(cubeDesc.getModelName().equals(desc.getName())){
+ throw new InternalErrorException("Model referenced by cube,drop cubes under model and try again.");
+ }
+ }
+ //check II desc exist
+ List<IIDesc> iiDescs = getIIDescManager().listAllDesc();
+ for(IIDesc iidesc:iiDescs){
+ if(iidesc.getModelName().equals(desc.getName())){
+ throw new InternalErrorException("Model referenced by IIDesc.");
+ }
+ }
+ getMetadataManager().dropModel(desc);
-// getCubeManager().dropCube(cube.getName(), true);
-// accessService.clean(cube, true);
+ accessService.clean(desc, true);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/97963b8f/webapp/app/js/controllers/cube.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/controllers/cube.js b/webapp/app/js/controllers/cube.js
index d9e7764..f31742a 100755
--- a/webapp/app/js/controllers/cube.js
+++ b/webapp/app/js/controllers/cube.js
@@ -265,7 +265,7 @@ KylinApp.controller('CubeCtrl', function ($scope, AccessService, MessageService,
SweetAlert.swal({
title: '',
- text: "Are you sure to start the build? ",
+ text: "Are you sure to start the build ?",
type: '',
showCancelButton: true,
confirmButtonColor: '#DD6B55',
@@ -311,7 +311,7 @@ KylinApp.controller('CubeCtrl', function ($scope, AccessService, MessageService,
controller: jobSubmitCtrl,
resolve: {
cube: function () {
- return cube.detail;
+ return cube;
},
metaModel:function(){
return $scope.metaModel;
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/97963b8f/webapp/app/js/controllers/cubeModel.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/controllers/cubeModel.js b/webapp/app/js/controllers/cubeModel.js
index 1622370..cbd7978 100644
--- a/webapp/app/js/controllers/cubeModel.js
+++ b/webapp/app/js/controllers/cubeModel.js
@@ -18,7 +18,7 @@
'use strict';
-KylinApp.controller('CubeModelCtrl', function ($scope, $modal,cubeConfig,MetaModel,SweetAlert,GraphService,$log,TableModel) {
+KylinApp.controller('CubeModelCtrl', function ($scope, $modal,cubeConfig,MetaModel,SweetAlert,GraphService,$log,TableModel,ModelService,loadingRequest) {
$scope.buildGraph = function (model) {
@@ -223,4 +223,42 @@ KylinApp.controller('CubeModelCtrl', function ($scope, $modal,cubeConfig,MetaMod
}
};
+
+
+ $scope.dropModel = function (model) {
+
+ SweetAlert.swal({
+ title: '',
+ text: "Are you sure to drop this model?",
+ type: '',
+ showCancelButton: true,
+ confirmButtonColor: '#DD6B55',
+ confirmButtonText: "Yes",
+ closeOnConfirm: true
+ }, function(isConfirm) {
+ if(isConfirm){
+
+ loadingRequest.show();
+ ModelService.drop({modelId: model.name}, {}, function (result) {
+ loadingRequest.hide();
+// CubeList.removeCube(cube);
+ SweetAlert.swal('Success!', 'Model drop is done successfully', 'success');
+ 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');
+ }
+ });
+ }
+
+ });
+ };
+
+
+
});
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/97963b8f/webapp/app/js/controllers/cubes.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/controllers/cubes.js b/webapp/app/js/controllers/cubes.js
index fdea880..88dcd51 100755
--- a/webapp/app/js/controllers/cubes.js
+++ b/webapp/app/js/controllers/cubes.js
@@ -86,7 +86,9 @@ KylinApp
cube.detail = detail[0];
ModelDescService.get({model_name: cube.detail.model_name}, function (model) {
cube.model = model;
- $scope.metaModel.model= model;
+ $scope.metaModel ={
+ model: model
+ }
defer.resolve(cube.detail);
});
@@ -363,7 +365,7 @@ KylinApp
}
});
-var jobSubmitCtrl = function ($scope, $modalInstance, CubeService, MessageService, $location, cube,MetaModel, buildType,SweetAlert,loadingRequest) {
+var jobSubmitCtrl = function ($scope, $modalInstance, CubeService, MessageService, $location, cube, buildType,SweetAlert,loadingRequest) {
$scope.cube = cube;
$scope.metaModel={
model:cube.model
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/97963b8f/webapp/app/js/controllers/modelEdit.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/controllers/modelEdit.js b/webapp/app/js/controllers/modelEdit.js
index a571611..dc9b87a 100644
--- a/webapp/app/js/controllers/modelEdit.js
+++ b/webapp/app/js/controllers/modelEdit.js
@@ -139,8 +139,8 @@ KylinApp.controller('ModelEditCtrl', function ($scope, $q, $routeParams, $locati
}
SweetAlert.swal({
- title: 'Are you sure to update the model?',
- text: $scope.isEdit?' Please note: if model schema is changed, all cubes of the model will be affected.':'Are you sure to save the Model ?',
+ title: $scope.isEdit?'Are you sure to update the model?':"Are you sure to save the Model?",
+ text: $scope.isEdit?' Please note: if model schema is changed, all cubes of the model will be affected.':'',
type: 'warning',
showCancelButton: true,
confirmButtonColor: '#DD6B55',
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/97963b8f/webapp/app/js/controllers/models.js
----------------------------------------------------------------------
diff --git a/webapp/app/js/controllers/models.js b/webapp/app/js/controllers/models.js
index 20ccffb..557be9c 100644
--- a/webapp/app/js/controllers/models.js
+++ b/webapp/app/js/controllers/models.js
@@ -109,7 +109,7 @@ KylinApp.controller('ModelsCtrl', function ($scope, $q, $routeParams, $location,
$scope.cube.detail = detail[0];
//add model info
$scope.metaModel ={
- model : $scope.model
+ model : ModelList.getModelByCube(cube.name)
}
}else{
SweetAlert.swal('Oops...', "No cube detail info loaded.", 'error');
@@ -124,6 +124,8 @@ KylinApp.controller('ModelsCtrl', function ($scope, $q, $routeParams, $location,
}
});
+
+
// set selecte model
}
}
http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/97963b8f/webapp/app/partials/models/model_detail.html
----------------------------------------------------------------------
diff --git a/webapp/app/partials/models/model_detail.html b/webapp/app/partials/models/model_detail.html
index e26c29f..bda87c1 100644
--- a/webapp/app/partials/models/model_detail.html
+++ b/webapp/app/partials/models/model_detail.html
@@ -35,9 +35,13 @@
</a>
<ul class="dropdown-menu">
<li ng-if="userService.hasRole('ROLE_ADMIN') || hasPermission(model, permissions.ADMINISTRATION.mask, permissions.MANAGEMENT.mask, permissions.OPERATION.mask)">
- <a href="models/edit/{{model.name}}" data-widget="collapse">Edit Model</a>
+ <a href="models/edit/{{model.name}}" data-widget="collapse">Edit</a>
</li>
<li ng-if="userService.hasRole('ROLE_ADMIN') || hasPermission(model, permissions.ADMINISTRATION.mask, permissions.MANAGEMENT.mask, permissions.OPERATION.mask)">
+ <a ng-click="dropModel(model)">Drop</a>
+ </li>
+ <li role="presentation" class="divider"></li>
+ <li ng-if="userService.hasRole('ROLE_ADMIN') || hasPermission(model, permissions.ADMINISTRATION.mask, permissions.MANAGEMENT.mask, permissions.OPERATION.mask)">
<a href="cubes/add/{{model.name}}" data-widget="collapse">Create Cube</a>
</li>
</ul>