You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by ni...@apache.org on 2020/02/07 14:26:15 UTC

[kylin] 20/44: KYLIN-4080 Project schema update event casues error reload NEW DataModelDesc

This is an automated email from the ASF dual-hosted git repository.

nic pushed a commit to branch 3.0.x
in repository https://gitbox.apache.org/repos/asf/kylin.git

commit 466a7a3a8343e807177553d6b35acd6297635276
Author: yaqian.zhang <59...@qq.com>
AuthorDate: Wed Dec 4 19:50:38 2019 +0800

    KYLIN-4080 Project schema update event casues error reload NEW DataModelDesc
---
 .../apache/kylin/metadata/model/DataModelDesc.java | 12 +++++++++
 .../kylin/metadata/model/DataModelManager.java     | 29 ++++++++--------------
 .../kylin/rest/controller/ModelController.java     |  1 +
 3 files changed, 23 insertions(+), 19 deletions(-)

diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java b/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java
index 5795d78..818afdf 100644
--- a/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java
+++ b/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java
@@ -104,6 +104,9 @@ public class DataModelDesc extends RootPersistentEntity {
     @JsonProperty("capacity")
     private RealizationCapacity capacity = RealizationCapacity.MEDIUM;
 
+    @JsonProperty("projectName")
+    private String projectName; //for KYLIN-4080
+
     // computed attributes
     private TableRef rootFactTableRef;
     private Set<TableRef> factTableRefs = Sets.newLinkedHashSet();
@@ -765,6 +768,14 @@ public class DataModelDesc extends RootPersistentEntity {
         return ProjectManager.getInstance(getConfig()).getProjectOfModel(this.getName());
     }
 
+    public String getProjectName() {
+        return projectName;
+    }
+
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
+
     public static DataModelDesc getCopyOf(DataModelDesc orig) {
         return copy(orig, new DataModelDesc());
     }
@@ -781,6 +792,7 @@ public class DataModelDesc extends RootPersistentEntity {
         copy.metrics = orig.metrics;
         copy.filterCondition = orig.filterCondition;
         copy.capacity = orig.capacity;
+        copy.projectName = orig.projectName;
         if (orig.getPartitionDesc() != null) {
             copy.partitionDesc = PartitionDesc.getCopyOf(orig.getPartitionDesc());
         }
diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelManager.java b/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelManager.java
index 9d5bf6a..dcbdf60 100644
--- a/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelManager.java
+++ b/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelManager.java
@@ -86,7 +86,9 @@ public class DataModelManager {
                 getDataModelImplClass(), dataModelDescMap) {
             @Override
             protected DataModelDesc initEntityAfterReload(DataModelDesc model, String resourceName) {
-                String prj = ProjectManager.getInstance(config).getProjectOfModel(model.getName()).getName();
+                String prj = (null == model.getProjectName()
+                        ? ProjectManager.getInstance(config).getProjectOfModel(model.getName()).getName()
+                        : model.getProjectName());
                 if (!model.isDraft()) {
                     model.init(config, getAllTablesMap(prj));
                 }
@@ -240,21 +242,12 @@ public class DataModelManager {
 
             ProjectManager prjMgr = ProjectManager.getInstance(config);
             ProjectInstance prj = prjMgr.getProject(projectName);
-            if (prj.containsModel(name))
+            if (prj.containsModel(name)) {
                 throw new IllegalStateException("project " + projectName + " already contains model " + name);
-
-            try {
-                // Temporarily register model under project, because we want to 
-                // update project formally after model is saved.
-                prj.getModels().add(name);
-
-                desc.setOwner(owner);
-                logger.info("Saving Model {} to Project {} with {} as owner", desc.getName(), projectName, owner);
-                desc = saveDataModelDesc(desc);
-
-            } finally {
-                prj.getModels().remove(name);
             }
+            desc.setOwner(owner);
+            logger.info("Saving Model {} to Project {} with {} as owner", desc.getName(), projectName, owner);
+            desc = saveDataModelDesc(desc, projectName);
 
             // now that model is saved, update project formally
             prjMgr.addModelToProject(name, projectName);
@@ -270,16 +263,14 @@ public class DataModelManager {
                 throw new IllegalArgumentException("DataModelDesc '" + name + "' does not exist.");
             }
 
-            return saveDataModelDesc(desc);
+            return saveDataModelDesc(desc, ProjectManager.getInstance(config).getProjectOfModel(desc.getName()).getName());
         }
     }
 
-    private DataModelDesc saveDataModelDesc(DataModelDesc dataModelDesc) throws IOException {
-
-        String prj = ProjectManager.getInstance(config).getProjectOfModel(dataModelDesc.getName()).getName();
+    private DataModelDesc saveDataModelDesc(DataModelDesc dataModelDesc, String projectName) throws IOException {
 
         if (!dataModelDesc.isDraft())
-            dataModelDesc.init(config, this.getAllTablesMap(prj));
+            dataModelDesc.init(config, this.getAllTablesMap(projectName));
 
         crud.save(dataModelDesc);
 
diff --git a/server-base/src/main/java/org/apache/kylin/rest/controller/ModelController.java b/server-base/src/main/java/org/apache/kylin/rest/controller/ModelController.java
index 820d422..5ffb51c 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/controller/ModelController.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/controller/ModelController.java
@@ -228,6 +228,7 @@ public class ModelController extends BasicController {
         try {
             logger.debug("Saving MODEL " + modelRequest.getModelDescData());
             desc = JsonUtil.readValue(modelRequest.getModelDescData(), DataModelDesc.class);
+            desc.setProjectName(modelRequest.getProject());
         } catch (JsonParseException e) {
             logger.error("The data model definition is not valid.", e);
             updateRequest(modelRequest, false, e.getMessage());