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

liyang pushed a commit to branch kylin5
in repository https://gitbox.apache.org/repos/asf/kylin.git

commit f9255a515d38edafd099c81712c0b6ff8e7038d7
Author: Pengfei Zhan <dethr...@gmail.com>
AuthorDate: Mon Jun 19 11:41:51 2023 +0800

    KYLIN-5829 Add a tool for generating sql from dumped metadata
---
 build/bin/create-table.sh                          |  1 -
 build/conf/kylin-tools-diag-log4j.xml              |  6 ++
 .../kylin/tool}/util/CreateTableFromJson.java      | 31 +++++-----
 .../kylin/tool/util/CreateTableFromJsonTest.java   | 68 ++++++++++++++++++++++
 4 files changed, 89 insertions(+), 17 deletions(-)

diff --git a/build/bin/create-table.sh b/build/bin/create-table.sh
index 5fbc49541d..a21e39036e 100755
--- a/build/bin/create-table.sh
+++ b/build/bin/create-table.sh
@@ -16,7 +16,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-
 if [ -z $KYLIN_HOME ];then
     export KYLIN_HOME=$(cd -P -- "$(dirname -- "$0")"/../ && pwd -P)
 fi
diff --git a/build/conf/kylin-tools-diag-log4j.xml 
b/build/conf/kylin-tools-diag-log4j.xml
index 728e50d2ca..227e71cdd1 100644
--- a/build/conf/kylin-tools-diag-log4j.xml
+++ b/build/conf/kylin-tools-diag-log4j.xml
@@ -28,6 +28,9 @@
         <Console name="stdout" target="SYSTEM_OUT">
             <PatternLayout pattern="%X{traceId}%d{ISO8601} %-5p 
%X{request.project}[%t] %c{2} : %mask{%m}%n"/>
         </Console>
+        <File name="createTableSql" 
fileName="${env:KYLIN_HOME}/logs/create_table.sql">
+            <PatternLayout pattern="%msg%n"/>
+        </File>
     </Appenders>
     <Loggers>
         <Root level="DEBUG">
@@ -38,5 +41,8 @@
         <Logger name="org.springframework.security" level="INFO"/>
         <Logger name="io.kyligence" level="DEBUG"/>
         <Logger name="org.apache.kylin" level="DEBUG"/>
+        <Logger name="org.apache.kylin.tool.util.CreateTableFromJson" 
level="INFO">
+            <AppenderRef ref="createTableSql"/>
+        </Logger>
     </Loggers>
 </Configuration>
diff --git 
a/src/core-metadata/src/main/java/org/apache/kylin/rest/util/CreateTableFromJson.java
 b/src/tool/src/main/java/org/apache/kylin/tool/util/CreateTableFromJson.java
similarity index 81%
rename from 
src/core-metadata/src/main/java/org/apache/kylin/rest/util/CreateTableFromJson.java
rename to 
src/tool/src/main/java/org/apache/kylin/tool/util/CreateTableFromJson.java
index 2ee7efef22..67148ad608 100644
--- 
a/src/core-metadata/src/main/java/org/apache/kylin/rest/util/CreateTableFromJson.java
+++ b/src/tool/src/main/java/org/apache/kylin/tool/util/CreateTableFromJson.java
@@ -16,10 +16,13 @@
  * limitations under the License.
  */
 
-package org.apache.kylin.rest.util;
+package org.apache.kylin.tool.util;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -29,20 +32,16 @@ import org.apache.kylin.common.util.JsonUtil;
 import org.apache.kylin.metadata.model.ColumnDesc;
 import org.apache.kylin.metadata.model.TableDesc;
 
-import org.apache.kylin.guava30.shaded.common.collect.Lists;
-import org.apache.kylin.guava30.shaded.common.collect.Maps;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import lombok.extern.slf4j.Slf4j;
 
 /**
  * A tool to generate database and tables from metadata backups of customer
  */
+@Slf4j
 public class CreateTableFromJson {
 
     private static final String QUOTE = "`";
-    private static final Map<String, String> TYPE_MAP = Maps.newHashMap();
-
-    private static final Logger logger = 
LoggerFactory.getLogger(CreateTableFromJson.class);
+    private static final Map<String, String> TYPE_MAP = new HashMap<>();
 
     static {
         TYPE_MAP.put("integer", "int");
@@ -54,23 +53,23 @@ public class CreateTableFromJson {
         String pathDir = args[0];
         Map<String, List<String>> map = createDbAndTables(pathDir);
 
-        map.forEach((k, v) -> {
-            logger.info(k);
-            v.forEach(logger::info);
+        map.forEach((db, tables) -> {
+            for (String s : db.split("\n")) {
+                log.info(s);
+            }
+            tables.forEach(log::info);
         });
-
-        logger.info("\n\n\n\n\n");
     }
 
     // the path is /{metadata_backup_path}/{project_name}/table/
     private static Map<String, List<String>> createDbAndTables(String pathDir) 
throws IOException {
-        Map<String, List<String>> map = Maps.newHashMap();
+        Map<String, List<String>> map = new LinkedHashMap<>();
         File file = new File(pathDir).getAbsoluteFile();
         File[] files = file.listFiles();
 
         for (File f : Objects.requireNonNull(files)) {
             final TableDesc tableDesc = JsonUtil.readValue(f, TableDesc.class);
-            List<String> columnNameTypeList = Lists.newArrayList();
+            List<String> columnNameTypeList = new ArrayList<>();
             for (ColumnDesc column : tableDesc.getColumns()) {
                 String name = column.getName();
                 String type = convert(column.getDatatype());
@@ -79,7 +78,7 @@ public class CreateTableFromJson {
 
             String databaseSql = String.format(Locale.ROOT, "create database 
%s;%nuse %s;",
                     quote(tableDesc.getDatabase()), 
quote(tableDesc.getDatabase()));
-            map.putIfAbsent(databaseSql, Lists.newArrayList());
+            map.putIfAbsent(databaseSql, new ArrayList<>());
             String tableSql = createTableSql(tableDesc.getName(), 
columnNameTypeList);
             map.get(databaseSql).add(tableSql);
         }
diff --git 
a/src/tool/src/test/java/org/apache/kylin/tool/util/CreateTableFromJsonTest.java
 
b/src/tool/src/test/java/org/apache/kylin/tool/util/CreateTableFromJsonTest.java
new file mode 100644
index 0000000000..7d729aee9f
--- /dev/null
+++ 
b/src/tool/src/test/java/org/apache/kylin/tool/util/CreateTableFromJsonTest.java
@@ -0,0 +1,68 @@
+/*
+ * 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.tool.util;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+class CreateTableFromJsonTest {
+
+    String path = 
"src/test/resources/table_cc_cleanup/metadata/AL_4144/table/";
+    private final ByteArrayOutputStream outContent = new 
ByteArrayOutputStream();
+    private PrintStream originPrintStream;
+    private static final String REGEX = "util.CreateTableFromJson :";
+
+    @BeforeEach
+    void setUpStreams() {
+        originPrintStream = System.out;
+        System.setOut(new PrintStream(outContent));
+    }
+
+    @AfterEach
+    void cleanUpStreams() {
+        System.setOut(originPrintStream);
+    }
+
+    @Test
+    void test() throws IOException {
+        CreateTableFromJson.main(new String[] { path });
+        String result = outContent.toString();
+        if (StringUtils.isBlank(result)) {
+            Assertions.assertTrue(true);
+        } else if ("true".equals(System.getProperty("junit.run.local"))) {
+            // with -Djunit.run.local=true, this branch is more convenient for 
dev
+            String[] splits = result.split("\n");
+            for (String str : splits) {
+                String s = str.split(REGEX)[1];
+                originPrintStream.println(s);
+            }
+        } else {
+            String[] splits = result.split("\n");
+            Assertions.assertTrue(splits[0].contains("create database 
`CAP`;"));
+            Assertions.assertTrue(splits[1].contains("use `CAP`;"));
+        }
+    }
+}

Reply via email to