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())