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

jerryshao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/main by this push:
     new 48fc92ca59 [MINOR] refactor(semantic): Move Ossie document conversion 
to common (#14374)
48fc92ca59 is described below

commit 48fc92ca5952c51224627b979f81cccc5ae010ce
Author: mchades <[email protected]>
AuthorDate: Mon Nov 2 10:24:25 2026 +0800

    [MINOR] refactor(semantic): Move Ossie document conversion to common 
(#14374)
    
    ### What changes were proposed in this pull request?
    
    Move OssieDocumentConverter and its tests from core to common, add the
    YAML dependency, and adapt the implementation for Java 8 compatibility.
    
    ### Why are the changes needed?
    
    Allow standalone clients to import and export Ossie semantic models
    without depending on server-side core.
    
    ### Does this PR introduce _any_ user-facing change?
    
    The converter is now packaged in common. Its Java package, public method
    signatures, and document conversion behavior remain unchanged.
    
    ### How was this patch tested?
    
    89 converter and Semantic Model regression tests passed, along with Java
    8-compatible compilation, Spotless checks, and common Javadoc.
---
 common/build.gradle.kts                            |  2 +
 .../gravitino/semantic/OssieDocumentConverter.java | 77 ++++++++++++++--------
 .../semantic/TestOssieDocumentConverter.java       | 16 ++---
 3 files changed, 59 insertions(+), 36 deletions(-)

diff --git a/common/build.gradle.kts b/common/build.gradle.kts
index 09d549183b..b71694b4c4 100644
--- a/common/build.gradle.kts
+++ b/common/build.gradle.kts
@@ -43,10 +43,12 @@ dependencies {
 
   annotationProcessor(libs.lombok)
   compileOnly(libs.commons.dbcp2)
+  compileOnly(libs.jackson.dataformat.yaml)
   compileOnly(libs.lombok)
   testAnnotationProcessor(libs.lombok)
   testCompileOnly(libs.lombok)
 
+  testImplementation(libs.jackson.dataformat.yaml)
   testImplementation(libs.junit.jupiter.api)
   testImplementation(libs.junit.jupiter.params)
 
diff --git 
a/core/src/main/java/org/apache/gravitino/semantic/OssieDocumentConverter.java 
b/common/src/main/java/org/apache/gravitino/semantic/OssieDocumentConverter.java
similarity index 95%
rename from 
core/src/main/java/org/apache/gravitino/semantic/OssieDocumentConverter.java
rename to 
common/src/main/java/org/apache/gravitino/semantic/OssieDocumentConverter.java
index b855e545d5..32ee4f7874 100644
--- 
a/core/src/main/java/org/apache/gravitino/semantic/OssieDocumentConverter.java
+++ 
b/common/src/main/java/org/apache/gravitino/semantic/OssieDocumentConverter.java
@@ -33,6 +33,8 @@ import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
 import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -50,11 +52,16 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.gravitino.NameIdentifier;
 import org.apache.gravitino.exceptions.IllegalSemanticModelException;
 
-/** Converts between standalone Apache Ossie documents and Gravitino Semantic 
Models. */
+/**
+ * Converts between standalone Apache Ossie documents and Gravitino Semantic 
Models.
+ *
+ * <p>Consumers must explicitly provide {@code jackson-dataformat-yaml} and 
its runtime dependencies
+ * when using this converter, including for JSON documents.
+ */
 public final class OssieDocumentConverter {
 
   private static final Set<String> ROOT_PROPERTIES =
-      Set.of(
+      ImmutableSet.of(
           "version",
           "name",
           "description",
@@ -64,7 +71,7 @@ public final class OssieDocumentConverter {
           "metrics",
           "custom_extensions");
   private static final Set<String> DATASET_PROPERTIES =
-      Set.of(
+      ImmutableSet.of(
           "name",
           "source",
           "primary_key",
@@ -74,7 +81,7 @@ public final class OssieDocumentConverter {
           "fields",
           "custom_extensions");
   private static final Set<String> FIELD_PROPERTIES =
-      Set.of(
+      ImmutableSet.of(
           "name",
           "expression",
           "dimension",
@@ -84,16 +91,20 @@ public final class OssieDocumentConverter {
           "ai_context",
           "custom_extensions");
   private static final Set<String> RELATIONSHIP_PROPERTIES =
-      Set.of("name", "from", "to", "from_columns", "to_columns", "ai_context", 
"custom_extensions");
+      ImmutableSet.of(
+          "name", "from", "to", "from_columns", "to_columns", "ai_context", 
"custom_extensions");
   private static final Set<String> METRIC_PROPERTIES =
-      Set.of("name", "expression", "description", "datatype", "ai_context", 
"custom_extensions");
-  private static final Set<String> EXPRESSION_PROPERTIES = Set.of("dialects");
-  private static final Set<String> DIALECT_EXPRESSION_PROPERTIES = 
Set.of("dialect", "expression");
-  private static final Set<String> DIMENSION_PROPERTIES = Set.of("is_time");
-  private static final Set<String> CUSTOM_EXTENSION_PROPERTIES = 
Set.of("vendor_name", "data");
+      ImmutableSet.of(
+          "name", "expression", "description", "datatype", "ai_context", 
"custom_extensions");
+  private static final Set<String> EXPRESSION_PROPERTIES = 
ImmutableSet.of("dialects");
+  private static final Set<String> DIALECT_EXPRESSION_PROPERTIES =
+      ImmutableSet.of("dialect", "expression");
+  private static final Set<String> DIMENSION_PROPERTIES = 
ImmutableSet.of("is_time");
+  private static final Set<String> CUSTOM_EXTENSION_PROPERTIES =
+      ImmutableSet.of("vendor_name", "data");
 
   private static final Set<String> AI_CONTEXT_PROPERTIES =
-      Set.of("instructions", "synonyms", "examples");
+      ImmutableSet.of("instructions", "synonyms", "examples");
 
   private static final ObjectMapper JSON_MAPPER = createJsonMapper();
   private static final ObjectMapper YAML_MAPPER = createYamlMapper();
@@ -172,7 +183,7 @@ public final class OssieDocumentConverter {
       this.name = name;
       this.comment = comment;
       this.definition = definition;
-      this.properties = Map.copyOf(properties);
+      this.properties = ImmutableMap.copyOf(properties);
     }
 
     /**
@@ -507,18 +518,30 @@ public final class OssieDocumentConverter {
   }
 
   private static String dataTypeName(DataType dataType) {
-    return switch (dataType) {
-      case STRING -> "String";
-      case INTEGER -> "Integer";
-      case DECIMAL -> "Decimal";
-      case FLOAT -> "Float";
-      case BOOLEAN -> "Boolean";
-      case DATE -> "Date";
-      case TIME -> "Time";
-      case DATE_TIME -> "DateTime";
-      case DATE_TIME_TZ -> "DateTimeTz";
-      case OPAQUE -> "Opaque";
-    };
+    switch (dataType) {
+      case STRING:
+        return "String";
+      case INTEGER:
+        return "Integer";
+      case DECIMAL:
+        return "Decimal";
+      case FLOAT:
+        return "Float";
+      case BOOLEAN:
+        return "Boolean";
+      case DATE:
+        return "Date";
+      case TIME:
+        return "Time";
+      case DATE_TIME:
+        return "DateTime";
+      case DATE_TIME_TZ:
+        return "DateTimeTz";
+      case OPAQUE:
+        return "Opaque";
+      default:
+        throw new IllegalArgumentException("Unknown Semantic Model data type: 
" + dataType);
+    }
   }
 
   @Nullable
@@ -747,11 +770,11 @@ public final class OssieDocumentConverter {
   private static Map<String, String> extractProperties(ObjectNode root) {
     JsonNode extensionsNode = root.get("custom_extensions");
     if (!(extensionsNode instanceof ArrayNode)) {
-      return Map.of();
+      return ImmutableMap.of();
     }
 
     ArrayNode extensions = (ArrayNode) extensionsNode;
-    Map<String, String> properties = new LinkedHashMap<>();
+    ImmutableMap.Builder<String, String> properties = ImmutableMap.builder();
     boolean found = false;
     int index = 0;
     Iterator<JsonNode> iterator = extensions.iterator();
@@ -792,7 +815,7 @@ public final class OssieDocumentConverter {
     if (extensions.isEmpty()) {
       root.remove("custom_extensions");
     }
-    return properties;
+    return properties.build();
   }
 
   private static void ensureNoPropertiesExtension(ArrayNode extensions) {
diff --git 
a/core/src/test/java/org/apache/gravitino/semantic/TestOssieDocumentConverter.java
 
b/common/src/test/java/org/apache/gravitino/semantic/TestOssieDocumentConverter.java
similarity index 99%
rename from 
core/src/test/java/org/apache/gravitino/semantic/TestOssieDocumentConverter.java
rename to 
common/src/test/java/org/apache/gravitino/semantic/TestOssieDocumentConverter.java
index 37f83e8a85..5ffedad115 100644
--- 
a/core/src/test/java/org/apache/gravitino/semantic/TestOssieDocumentConverter.java
+++ 
b/common/src/test/java/org/apache/gravitino/semantic/TestOssieDocumentConverter.java
@@ -37,10 +37,10 @@ import java.math.BigInteger;
 import java.time.Instant;
 import java.util.Map;
 import org.apache.gravitino.NameIdentifier;
-import org.apache.gravitino.Namespace;
+import org.apache.gravitino.dto.AuditDTO;
+import org.apache.gravitino.dto.semantic.SemanticModelDTO;
+import org.apache.gravitino.dto.semantic.SemanticModelDefinitionDTO;
 import org.apache.gravitino.exceptions.IllegalSemanticModelException;
-import org.apache.gravitino.meta.AuditInfo;
-import org.apache.gravitino.meta.SemanticModelEntity;
 import 
org.apache.gravitino.semantic.OssieDocumentConverter.ParsedSemanticModel;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -769,15 +769,13 @@ public class TestOssieDocumentConverter {
 
   private static SemanticModel semanticModel(
       SemanticModelDefinition definition, Map<String, String> properties) {
-    return SemanticModelEntity.builder()
-        .withId(1L)
+    return SemanticModelDTO.builder()
         .withName("sales")
-        .withNamespace(Namespace.of("lake", "sales", "mart"))
         .withComment("Governed sales definitions")
-        .withDefinition(definition)
+        .withDefinition(SemanticModelDefinitionDTO.fromDefinition(definition))
         .withProperties(properties)
-        .withAuditInfo(
-            AuditInfo.builder()
+        .withAudit(
+            AuditDTO.builder()
                 .withCreator("tester")
                 .withCreateTime(Instant.parse("2026-09-28T00:00:00Z"))
                 .build())

Reply via email to