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 ad294fde01a6e512ad4d3e2943fff21ec85a118c
Author: Zhiting Guo <zhiting....@kyligence.io>
AuthorDate: Wed Nov 22 17:58:24 2023 +0800

    KYLIN-5877 Upgrade table schema of recommendation
---
 .../src/main/resources/metadata-jdbc-mysql.properties        |  3 ++-
 .../src/main/resources/metadata-jdbc-postgresql.properties   |  3 ++-
 .../metadata/recommendation/candidate/JdbcRawRecStore.java   | 12 ++++++++++--
 .../java/org/apache/kylin/tool/RecCandidateToolTest.java     |  4 ++--
 4 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/src/core-common/src/main/resources/metadata-jdbc-mysql.properties 
b/src/core-common/src/main/resources/metadata-jdbc-mysql.properties
index 6bff22a85e..ab37221216 100644
--- a/src/core-common/src/main/resources/metadata-jdbc-mysql.properties
+++ b/src/core-common/src/main/resources/metadata-jdbc-mysql.properties
@@ -216,7 +216,8 @@ create.rawrecommendation.store.table=CREATE TABLE IF NOT 
EXISTS `%s` ( \
   `reserved_field_1` VARCHAR(50), \
   `reserved_field_2` longblob, \
   `reserved_field_3` longblob, \
-   primary key(id) \
+   primary key(id), \
+   UNIQUE KEY (`unique_flag`) \
 ) ENGINE=INNODB DEFAULT CHARSET=utf8;
 
 create.rawrecommendation.store.index=ALTER TABLE %s ADD UNIQUE %s_idx 
(project, model_id, unique_flag, semantic_version);
diff --git 
a/src/core-common/src/main/resources/metadata-jdbc-postgresql.properties 
b/src/core-common/src/main/resources/metadata-jdbc-postgresql.properties
index f5577a3e12..d58b644af8 100644
--- a/src/core-common/src/main/resources/metadata-jdbc-postgresql.properties
+++ b/src/core-common/src/main/resources/metadata-jdbc-postgresql.properties
@@ -209,7 +209,8 @@ create.rawrecommendation.store.table=CREATE TABLE IF NOT 
EXISTS %s ( \
   reserved_field_1 VARCHAR(50), \
   reserved_field_2 bytea, \
   reserved_field_3 bytea, \
-  primary key(id) \
+  primary key(id), \
+  unique (unique_flag) \
 );
 
 create.rawrecommendation.store.index=CREATE UNIQUE INDEX %s_idx ON %s using 
btree (project, model_id, unique_flag, semantic_version);
diff --git 
a/src/core-metadata/src/main/java/org/apache/kylin/metadata/recommendation/candidate/JdbcRawRecStore.java
 
b/src/core-metadata/src/main/java/org/apache/kylin/metadata/recommendation/candidate/JdbcRawRecStore.java
index 294d8eb6f3..5ea76322c0 100644
--- 
a/src/core-metadata/src/main/java/org/apache/kylin/metadata/recommendation/candidate/JdbcRawRecStore.java
+++ 
b/src/core-metadata/src/main/java/org/apache/kylin/metadata/recommendation/candidate/JdbcRawRecStore.java
@@ -84,7 +84,7 @@ import lombok.extern.slf4j.Slf4j;
 @Slf4j
 public class JdbcRawRecStore {
 
-    public static final String RECOMMENDATION_CANDIDATE = "_rec_candidate";
+    public static final String RECOMMENDATION_CANDIDATE = "_rec_candidate_v2";
     private static final int NON_EXIST_MODEL_SEMANTIC_VERSION = 
Integer.MIN_VALUE;
     private static final int LAG_SEMANTIC_VERSION = 1;
     private static final List<RawRecItem.RawRecState> FINAL_STATE = 
Arrays.asList(RawRecItem.RawRecState.APPLIED,
@@ -447,12 +447,20 @@ public class JdbcRawRecStore {
             val baseId = manager.getMaxId() + 100;
 
             Map<Integer, Integer> idChangedMap = new HashMap<>();
+            Map<String, RawRecItem> layoutRecommendations = new HashMap<>();
+            Map<String, List<String>> md5ToUuid = new HashMap<>();
 
             val index = new AtomicInteger(0);
 
             List<RawRecItem> tmpRawRecItems = 
rawRecItems.stream().map(rawRecItem -> {
                 rawRecItem.setProject(project);
-                rawRecItem.setModelID(modelId);
+                if (!modelId.equals(rawRecItem.getModelID())) {
+                    rawRecItem.setModelID(modelId);
+                    String content = RawRecUtil.getContent(rawRecItem);
+                    String md5 = RawRecUtil.computeMD5(content);
+                    Pair<String, RawRecItem> recItemPair = 
RawRecUtil.getRawRecItemFromMap(md5, content, md5ToUuid, layoutRecommendations);
+                    rawRecItem.setUniqueFlag(recItemPair.getFirst());
+                }
 
                 String uniqueFlag = rawRecItem.getUniqueFlag();
                 RawRecItem originalRawRecItem = 
manager.getRawRecItemByUniqueFlag(rawRecItem.getProject(),
diff --git 
a/src/tool/src/test/java/org/apache/kylin/tool/RecCandidateToolTest.java 
b/src/tool/src/test/java/org/apache/kylin/tool/RecCandidateToolTest.java
index 830332920a..ba0fc75935 100644
--- a/src/tool/src/test/java/org/apache/kylin/tool/RecCandidateToolTest.java
+++ b/src/tool/src/test/java/org/apache/kylin/tool/RecCandidateToolTest.java
@@ -175,7 +175,7 @@ public class RecCandidateToolTest extends 
NLocalFileMetadataTestCase {
         jdbcRawRecStore.deleteAll();
         assertEquals(0, jdbcRawRecStore.queryAll().size());
         tool = new RecCandidateTool();
-        tool.execute(new String[] { "-restore", "-dir", 
file.getAbsolutePath(), "-table", "test_opt_rec_candidate" });
+        tool.execute(new String[] { "-restore", "-dir", 
file.getAbsolutePath(), "-table", "test_opt_rec_candidate_v2" });
         assertEquals(3, jdbcRawRecStore.queryAll().size());
     }
 
@@ -197,7 +197,7 @@ public class RecCandidateToolTest extends 
NLocalFileMetadataTestCase {
         jdbcRawRecStore.deleteAll();
         assertEquals(0, jdbcRawRecStore.queryAll().size());
         tool = new RecCandidateTool();
-        tool.execute(new String[] { "-restore", "-dir", 
file.getAbsolutePath(), "-table", "test_opt_rec_candidate" });
+        tool.execute(new String[] { "-restore", "-dir", 
file.getAbsolutePath(), "-table", "test_opt_rec_candidate_v2" });
         assertEquals(3, jdbcRawRecStore.queryAll().size());
     }
 

Reply via email to