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>