You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by xx...@apache.org on 2023/02/27 08:01:03 UTC
[kylin] 23/34: KYLIN-5447 wrap logical view response
This is an automated email from the ASF dual-hosted git repository.
xxyu pushed a commit to branch kylin5
in repository https://gitbox.apache.org/repos/asf/kylin.git
commit 3aff4aa461340b709694a8ac610c24188b954ac9
Author: ChenLiang.Lu <31...@users.noreply.github.com>
AuthorDate: Fri Dec 30 16:58:26 2022 +0800
KYLIN-5447 wrap logical view response
KYLIN-5447 Wrap Logical View list
---
.../kylin/rest/controller/NAdminController.java | 2 +-
.../kylin/rest/response/LogicalViewResponse.java | 54 ++++++++++++++++++++++
.../apache/kylin/rest/service/SparkDDLService.java | 9 ++--
.../apache/kylin/rest/service/TableExtService.java | 4 +-
.../org/apache/kylin/rest/ddl/ViewCheck.scala | 2 +-
.../apache/kylin/rest/service/SparkDDLTest.java | 21 +++++----
.../org/apache/kylin/newten/LogicalViewTest.java | 4 ++
.../kylin/rest/controller/SparkDDLController.java | 6 +--
.../kylin/rest/service/MetaStoreService.java | 13 +++++-
9 files changed, 95 insertions(+), 20 deletions(-)
diff --git a/src/common-server/src/main/java/org/apache/kylin/rest/controller/NAdminController.java b/src/common-server/src/main/java/org/apache/kylin/rest/controller/NAdminController.java
index 2d0440f52f..c2f26bd8aa 100644
--- a/src/common-server/src/main/java/org/apache/kylin/rest/controller/NAdminController.java
+++ b/src/common-server/src/main/java/org/apache/kylin/rest/controller/NAdminController.java
@@ -76,7 +76,7 @@ public class NAdminController extends NBasicController {
propertyKeys.add("kylin.security.remove-ldap-custom-security-limit-enabled");
propertyKeys.add("kylin.source.ddl.logical-view.enabled");
propertyKeys.add("kylin.source.ddl.hive.enabled");
- propertyKeys.add("kylin.source.ddl.logical-view-database");
+ propertyKeys.add("kylin.source.ddl.logical-view.database");
propertyKeys.add("kylin.storage.check-quota-enabled");
// add second storage
diff --git a/src/datasource-service/src/main/java/org/apache/kylin/rest/response/LogicalViewResponse.java b/src/datasource-service/src/main/java/org/apache/kylin/rest/response/LogicalViewResponse.java
new file mode 100644
index 0000000000..2343207aa3
--- /dev/null
+++ b/src/datasource-service/src/main/java/org/apache/kylin/rest/response/LogicalViewResponse.java
@@ -0,0 +1,54 @@
+/*
+ * 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.
+ */
+
+package org.apache.kylin.rest.response;
+
+import org.apache.kylin.metadata.view.LogicalView;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE,
+ isGetterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE)
+public class LogicalViewResponse {
+ @JsonProperty("table_name")
+ private String tableName;
+
+ @JsonProperty("created_sql")
+ private String createdSql;
+
+ @JsonProperty("modified_user")
+ private String modifiedUser;
+
+ @JsonProperty("created_project")
+ private String createdProject;
+
+ public LogicalViewResponse(LogicalView view) {
+ this.tableName = view.getTableName();
+ this.createdSql = view.getCreatedSql();
+ this.modifiedUser = view.getModifiedUser();
+ this.createdProject = view.getCreatedProject();
+ }
+}
diff --git a/src/datasource-service/src/main/java/org/apache/kylin/rest/service/SparkDDLService.java b/src/datasource-service/src/main/java/org/apache/kylin/rest/service/SparkDDLService.java
index a1c00fdcc9..ef76e21e55 100644
--- a/src/datasource-service/src/main/java/org/apache/kylin/rest/service/SparkDDLService.java
+++ b/src/datasource-service/src/main/java/org/apache/kylin/rest/service/SparkDDLService.java
@@ -41,6 +41,7 @@ import org.apache.kylin.metadata.view.LogicalViewManager;
import org.apache.kylin.rest.ddl.SourceTableCheck;
import org.apache.kylin.rest.ddl.ViewCheck;
import org.apache.kylin.rest.request.ViewRequest;
+import org.apache.kylin.rest.response.LogicalViewResponse;
import org.apache.kylin.rest.util.AclPermissionUtil;
import org.apache.spark.ddl.DDLCheck;
@@ -135,18 +136,20 @@ public class SparkDDLService extends BasicService {
LogicalViewLoader.unloadView(context.getLogicalViewName(), SparderEnv.getSparkSession());
}
- public List<LogicalView> listAll(String project, String tableName) {
+ public List<LogicalViewResponse> listAll(String project, String tableName) {
List<LogicalView> logicalViews = LogicalViewManager.getInstance(KylinConfig.getInstanceFromEnv()).list();
if (StringUtils.isNotBlank(tableName)) {
logicalViews = logicalViews.stream()
.filter(table -> table.getTableName().toLowerCase().contains(tableName.toLowerCase()))
.collect(Collectors.toList());
}
- logicalViews.forEach(table -> {
+ List<LogicalViewResponse> viewResponses =
+ logicalViews.stream().map(LogicalViewResponse::new).collect(Collectors.toList());
+ viewResponses.forEach(table -> {
if (!table.getCreatedProject().equalsIgnoreCase(project)) {
table.setCreatedSql("***");
}
});
- return logicalViews;
+ return viewResponses;
}
}
\ No newline at end of file
diff --git a/src/datasource-service/src/main/java/org/apache/kylin/rest/service/TableExtService.java b/src/datasource-service/src/main/java/org/apache/kylin/rest/service/TableExtService.java
index 595f5c0b6f..aabb60b613 100644
--- a/src/datasource-service/src/main/java/org/apache/kylin/rest/service/TableExtService.java
+++ b/src/datasource-service/src/main/java/org/apache/kylin/rest/service/TableExtService.java
@@ -18,7 +18,6 @@
package org.apache.kylin.rest.service;
-import static org.apache.kylin.common.exception.ServerErrorCode.INVALID_LOGICAL_VIEW;
import static org.apache.kylin.common.exception.ServerErrorCode.INVALID_TABLE_NAME;
import static org.apache.kylin.common.exception.code.ErrorCodeServer.EXCLUDED_TABLE_REQUEST_NOT_ALLOWED;
@@ -152,8 +151,7 @@ public class TableExtService extends BasicService {
if (logicalTable != null && viewProject.equalsIgnoreCase(project)) {
canLoadTables.add(table);
} else {
- throw new KylinException(INVALID_LOGICAL_VIEW, MsgPicker.getMsg()
- .getLoadLogicalViewError(tableName, viewProject));
+ tableResponse.getFailed().add(tableName);
}
});
}
diff --git a/src/datasource-service/src/main/scala/org/apache/kylin/rest/ddl/ViewCheck.scala b/src/datasource-service/src/main/scala/org/apache/kylin/rest/ddl/ViewCheck.scala
index 82935a66e5..879283b427 100644
--- a/src/datasource-service/src/main/scala/org/apache/kylin/rest/ddl/ViewCheck.scala
+++ b/src/datasource-service/src/main/scala/org/apache/kylin/rest/ddl/ViewCheck.scala
@@ -65,7 +65,7 @@ class ViewCheck extends DDLCheck {
cnDescription.append(s"创建不要加 database 名称,系统自动创建到 ${config.getDDLLogicalViewDB} 库中,"
+ s"删除要加 ${config.getDDLLogicalViewDB} 库名称 \n")
enDescription.append(s"Creating does not require adding database, it is automatically created in"
- + s" ${config.getDDLLogicalViewDB} ,\n deleting should add ${config.getDDLLogicalViewDB} database")
+ + s" ${config.getDDLLogicalViewDB} , deleting should add ${config.getDDLLogicalViewDB} database\n")
syntaxSupport.append(" `create logical view`, `drop logical view` ")
cnDescription
.append(s"仅支持 ${syntaxSupport} 语法\n")
diff --git a/src/datasource-service/src/test/java/org/apache/kylin/rest/service/SparkDDLTest.java b/src/datasource-service/src/test/java/org/apache/kylin/rest/service/SparkDDLTest.java
index 8e00df161f..80e9a5f114 100644
--- a/src/datasource-service/src/test/java/org/apache/kylin/rest/service/SparkDDLTest.java
+++ b/src/datasource-service/src/test/java/org/apache/kylin/rest/service/SparkDDLTest.java
@@ -40,6 +40,7 @@ import org.apache.kylin.metadata.view.LogicalViewManager;
import org.apache.kylin.rest.constant.Constant;
import org.apache.kylin.rest.request.ViewRequest;
import org.apache.kylin.rest.response.LoadTableResponse;
+import org.apache.kylin.rest.response.LogicalViewResponse;
import org.apache.spark.sql.LogicalViewLoader;
import org.apache.spark.sql.SparderEnv;
@@ -283,18 +284,23 @@ public class SparkDDLTest extends NLocalFileMetadataTestCase {
Assert.assertEquals(3, description.get(0).size());
// view list in project
- List<LogicalView> logicalViewsInProject = ddlService.listAll("ssb", "");
- List<LogicalView> logicalViewsInProject2 = ddlService.listAll("ssb", "table2");
+ List<LogicalViewResponse> logicalViewsInProject = ddlService.listAll("ssb", "");
+ List<LogicalViewResponse> logicalViewsInProject2 = ddlService.listAll("ssb", "table2");
+ List<LogicalViewResponse> logicalViewsInProject3 = ddlService.listAll("demo", "");
Assert.assertEquals(3, logicalViewsInProject.size());
Assert.assertEquals(1, logicalViewsInProject2.size());
- LogicalView confidentialTable =
+ LogicalViewResponse confidentialTable =
logicalViewsInProject.stream().filter(table -> table.getCreatedProject().equals("demo")).collect(
Collectors.toList()).get(0);
- LogicalView noConfidentialTable =
+ LogicalViewResponse noConfidentialTable =
logicalViewsInProject.stream().filter(table -> table.getCreatedProject().equals("ssb")).collect(
Collectors.toList()).get(0);
+ LogicalViewResponse noConfidentialTable2 =
+ logicalViewsInProject3.stream().filter(table -> table.getCreatedProject().equals("demo")).collect(
+ Collectors.toList()).get(0);
Assert.assertEquals("***", confidentialTable.getCreatedSql());
Assert.assertNotEquals("***", noConfidentialTable.getCreatedSql());
+ Assert.assertNotEquals("***", noConfidentialTable2.getCreatedSql());
// load table list
String[] failedLoadTables = {"KYLIN_LOGICAL_VIEW.logical_view_table2",
@@ -306,9 +312,8 @@ public class SparkDDLTest extends NLocalFileMetadataTestCase {
LoadTableResponse tableResponse = new LoadTableResponse();
tableExtService.filterAccessTables(successLoadTables, canLoadTables, tableResponse, "ssb");
Assert.assertEquals(2, canLoadTables.size());
- assertKylinExeption(
- () ->
- tableExtService.filterAccessTables(failedLoadTables, canLoadTables, tableResponse, "ssb"),
- "Can't load table");
+ canLoadTables.clear();
+ tableExtService.filterAccessTables(failedLoadTables, canLoadTables, tableResponse, "ssb");
+ Assert.assertEquals(2, canLoadTables.size());
}
}
diff --git a/src/kylin-it/src/test/java/org/apache/kylin/newten/LogicalViewTest.java b/src/kylin-it/src/test/java/org/apache/kylin/newten/LogicalViewTest.java
index df98c689ab..58d1109a55 100644
--- a/src/kylin-it/src/test/java/org/apache/kylin/newten/LogicalViewTest.java
+++ b/src/kylin-it/src/test/java/org/apache/kylin/newten/LogicalViewTest.java
@@ -26,6 +26,7 @@ import org.apache.kylin.common.util.Pair;
import org.apache.kylin.engine.spark.NLocalWithSparkSessionTest;
import org.apache.kylin.job.engine.JobEngineConfig;
import org.apache.kylin.job.impl.threadpool.NDefaultScheduler;
+import org.apache.kylin.metadata.cube.model.LayoutEntity;
import org.apache.kylin.metadata.cube.model.NDataflow;
import org.apache.kylin.metadata.cube.model.NDataflowManager;
import org.apache.kylin.metadata.model.SegmentRange;
@@ -34,6 +35,7 @@ import org.apache.kylin.util.ExecAndComp;
import org.apache.spark.sql.SparderEnv;
import org.junit.After;
+import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@@ -71,6 +73,8 @@ public class LogicalViewTest extends NLocalWithSparkSessionTest {
public void testLogicalView() throws Exception {
String dfID = "451e127a-b684-1474-744b-c9afc14378af";
NDataflow dataflow = dfMgr.getDataflow(dfID);
+ LayoutEntity layout = dataflow.getIndexPlan().getLayoutEntity(20000000001L);
+ Assert.assertNotNull(layout);
populateSSWithCSVData(getTestConfig(), getProject(), SparderEnv.getSparkSession());
indexDataConstructor.buildIndex(dfID, SegmentRange.TimePartitionedSegmentRange.createInfinite(),
Sets.newHashSet(
diff --git a/src/metadata-server/src/main/java/org/apache/kylin/rest/controller/SparkDDLController.java b/src/metadata-server/src/main/java/org/apache/kylin/rest/controller/SparkDDLController.java
index aa4ebbd9a6..4395f8c4c2 100644
--- a/src/metadata-server/src/main/java/org/apache/kylin/rest/controller/SparkDDLController.java
+++ b/src/metadata-server/src/main/java/org/apache/kylin/rest/controller/SparkDDLController.java
@@ -23,9 +23,9 @@ import static org.apache.kylin.common.constant.HttpConstant.HTTP_VND_APACHE_KYLI
import java.util.List;
import org.apache.kylin.common.exception.KylinException;
-import org.apache.kylin.metadata.view.LogicalView;
import org.apache.kylin.rest.request.ViewRequest;
import org.apache.kylin.rest.response.EnvelopeResponse;
+import org.apache.kylin.rest.response.LogicalViewResponse;
import org.apache.kylin.rest.service.SparkDDLService;
import org.apache.spark.sql.LogicalViewLoader;
@@ -83,11 +83,11 @@ public class SparkDDLController extends NBasicController {
@ApiOperation(value = "ddl_desc")
@GetMapping(value = "/ddl/view_list")
@ResponseBody
- public EnvelopeResponse<List<LogicalView>> list(
+ public EnvelopeResponse<List<LogicalViewResponse>> list(
@RequestParam("project") String project,
@RequestParam(value = "table", required = false, defaultValue = "") String tableName) {
project = checkProjectName(project);
- List<LogicalView> logicalViews = sparkDDLService.listAll(project, tableName);
+ List<LogicalViewResponse> logicalViews = sparkDDLService.listAll(project, tableName);
return new EnvelopeResponse<>(KylinException.CODE_SUCCESS, logicalViews, "");
}
}
diff --git a/src/modeling-service/src/main/java/org/apache/kylin/rest/service/MetaStoreService.java b/src/modeling-service/src/main/java/org/apache/kylin/rest/service/MetaStoreService.java
index 3680b15cc4..7d6599b389 100644
--- a/src/modeling-service/src/main/java/org/apache/kylin/rest/service/MetaStoreService.java
+++ b/src/modeling-service/src/main/java/org/apache/kylin/rest/service/MetaStoreService.java
@@ -19,6 +19,7 @@
package org.apache.kylin.rest.service;
import static org.apache.kylin.common.constant.Constants.KE_VERSION;
+import static org.apache.kylin.common.exception.ServerErrorCode.FAILED_CREATE_MODEL;
import static org.apache.kylin.common.exception.ServerErrorCode.MODEL_EXPORT_ERROR;
import static org.apache.kylin.common.exception.ServerErrorCode.MODEL_IMPORT_ERROR;
import static org.apache.kylin.common.exception.ServerErrorCode.MODEL_METADATA_FILE_ERROR;
@@ -97,6 +98,8 @@ import org.apache.kylin.metadata.project.NProjectManager;
import org.apache.kylin.metadata.project.ProjectInstance;
import org.apache.kylin.metadata.query.util.QueryHisStoreUtil;
import org.apache.kylin.metadata.realization.RealizationStatusEnum;
+import org.apache.kylin.metadata.view.LogicalView;
+import org.apache.kylin.metadata.view.LogicalViewManager;
import org.apache.kylin.rest.aspect.Transaction;
import org.apache.kylin.rest.constant.ModelStatusToDisplayEnum;
import org.apache.kylin.rest.request.ModelImportRequest;
@@ -440,7 +443,7 @@ public class MetaStoreService extends BasicService {
ProjectInstance projectInstance = NProjectManager.getInstance(KylinConfig.getInstanceFromEnv())
.getProject(targetProject);
ISourceMetadataExplorer explorer = SourceFactory.getSource(projectInstance).getSourceMetadataExplorer();
-
+ KylinConfig config = KylinConfig.getInstanceFromEnv();
List<TableDesc> existTableSet = Lists.newArrayList();
for (TableDesc missTableDesc : missTableList) {
try {
@@ -454,6 +457,14 @@ public class MetaStoreService extends BasicService {
} catch (Exception e) {
logger.warn("try load table: {} failed.", missTableDesc.getIdentity(), e);
}
+ if (config.isDDLLogicalViewEnabled() && missTableDesc.isLogicalView()) {
+ LogicalView logicalView = LogicalViewManager.getInstance(config).get(missTableDesc.getName());
+ if (logicalView != null && !targetProject.equalsIgnoreCase(logicalView.getCreatedProject())) {
+ throw new KylinException(FAILED_CREATE_MODEL, String.format(Locale.ROOT,
+ " Logical View %s can only add in project %s",
+ missTableDesc.getName(), logicalView.getCreatedProject()));
+ }
+ }
}
return existTableSet;
}