voonhous commented on code in PR #17751:
URL: https://github.com/apache/hudi/pull/17751#discussion_r2723615210
##########
hudi-common/src/test/java/org/apache/hudi/common/schema/TestHoodieSchema.java:
##########
@@ -1042,4 +1044,526 @@ public void
testParseLogicalTypesCreatesCorrectSubclasses() {
HoodieSchema.Time tmMicros = (HoodieSchema.Time) parsedTimeMicros;
assertEquals(HoodieSchema.TimePrecision.MICROS, tmMicros.getPrecision());
}
+
+ // ==================== Variant Type Tests ====================
+
+ @Test
+ public void testCreateUnshreddedVariant() {
+ HoodieSchema.Variant variantSchema = HoodieSchema.createVariant();
+
+ assertNotNull(variantSchema);
+ assertInstanceOf(HoodieSchema.Variant.class, variantSchema);
+ assertEquals(HoodieSchemaType.VARIANT, variantSchema.getType());
+ assertEquals("variant", variantSchema.getName());
+ assertFalse(variantSchema.isShredded());
+ assertFalse(variantSchema.getTypedValueField().isPresent());
+
+ // Verify fields
+ List<HoodieSchemaField> fields = variantSchema.getFields();
+ assertEquals(2, fields.size());
+ assertEquals("metadata", fields.get(0).name());
+ assertEquals("value", fields.get(1).name());
+
+ // Verify field types
+ assertEquals(HoodieSchemaType.BYTES, fields.get(0).schema().getType());
+ assertEquals(HoodieSchemaType.BYTES, fields.get(1).schema().getType());
+
+ // Value field should be non-nullable for unshredded
+ assertFalse(fields.get(1).schema().isNullable());
+ }
+
+ @Test
+ public void testCreateUnshreddedVariantWithCustomName() {
+ final String name = "my_variant";
+ final String namespace = "org.apache.hoodie";
+ final String doc = "Custom variant schema";
+ HoodieSchema.Variant variantSchema = HoodieSchema.createVariant(name,
namespace, doc);
+
+ assertNotNull(variantSchema);
+ assertEquals(name, variantSchema.getAvroSchema().getName());
+ assertEquals(namespace, variantSchema.getAvroSchema().getNamespace());
+ assertEquals(doc, variantSchema.getAvroSchema().getDoc());
+ assertFalse(variantSchema.isShredded());
+ }
+
+ @Test
+ public void testCreateShreddedVariant() {
+ final String recordName = "TypedValue";
+ final String fieldName = "data";
+ HoodieSchema typedValueSchema = HoodieSchema.createRecord(recordName,
null, null,
+ Collections.singletonList(HoodieSchemaField.of(fieldName,
HoodieSchema.create(HoodieSchemaType.STRING))));
+
+ HoodieSchema.Variant variantSchema =
HoodieSchema.createVariantShredded(typedValueSchema);
+
+ assertNotNull(variantSchema);
+ assertInstanceOf(HoodieSchema.Variant.class, variantSchema);
+ assertEquals(HoodieSchemaType.VARIANT, variantSchema.getType());
+ assertTrue(variantSchema.isShredded());
+ assertTrue(variantSchema.getTypedValueField().isPresent());
+
+ // Verify fields
+ List<HoodieSchemaField> fields = variantSchema.getFields();
+ assertEquals(3, fields.size());
+ assertEquals("metadata", fields.get(0).name());
+ assertEquals("value", fields.get(1).name());
+ assertEquals("typed_value", fields.get(2).name());
+
+ // Value field should be nullable for shredded
+ assertTrue(fields.get(1).schema().isNullable());
+
+ // Verify typed_value schema
+ HoodieSchema retrievedTypedValueSchema =
variantSchema.getTypedValueField().get();
+ assertEquals(HoodieSchemaType.RECORD, retrievedTypedValueSchema.getType());
+ }
+
+ @Test
+ public void testCreateShreddedVariantWithoutTypedValue() {
+ HoodieSchema.Variant variantSchema =
HoodieSchema.createVariantShredded(null);
+
+ assertNotNull(variantSchema);
+ assertTrue(variantSchema.isShredded());
+ assertFalse(variantSchema.getTypedValueField().isPresent());
+
+ // Verify fields should have metadata and nullable value, but no
typed_value
+ List<HoodieSchemaField> fields = variantSchema.getFields();
+ assertEquals(2, fields.size());
+ assertEquals("metadata", fields.get(0).name());
+ assertEquals("value", fields.get(1).name());
+
+ // Value field should be nullable even without typed_value
+ assertTrue(fields.get(1).schema().isNullable());
+ }
+
+ @Test
+ public void testVariantLogicalTypeDetection() {
+ HoodieSchema.Variant variantSchema = HoodieSchema.createVariant();
+ Schema avroSchema = variantSchema.getAvroSchema();
+
+ // Verify logical type is set
+ assertNotNull(avroSchema.getLogicalType());
+ assertInstanceOf(HoodieSchema.VariantLogicalType.class,
avroSchema.getLogicalType());
+ assertEquals("variant", avroSchema.getLogicalType().getName());
+
+ // Verify isVariantSchema detection
+ assertTrue(HoodieSchema.Variant.isVariantSchema(avroSchema));
+ }
+
+ @Test
+ public void testVariantRoundTripSerializationToJson() {
+ // Create unshredded variant
+ HoodieSchema.Variant originalVariant = HoodieSchema.createVariant();
+ String jsonSchema = originalVariant.toString();
+
+ // Parse back from JSON
+ HoodieSchema parsedSchema = HoodieSchema.parse(jsonSchema);
+
+ // Verify it's still detected as Variant
+ assertInstanceOf(HoodieSchema.Variant.class, parsedSchema);
+ HoodieSchema.Variant parsedVariant = (HoodieSchema.Variant) parsedSchema;
+ assertFalse(parsedVariant.isShredded());
+ assertEquals(HoodieSchemaType.VARIANT, parsedVariant.getType());
+
+ // Verify logical type is preserved
+
assertTrue(HoodieSchema.Variant.isVariantSchema(parsedVariant.getAvroSchema()));
+ }
+
+ @Test
+ public void testVariantShreddedRoundTripSerializationToJson() {
+ // Create shredded variant with typed_value
+ HoodieSchema typedValueSchema =
HoodieSchema.create(HoodieSchemaType.STRING);
+ HoodieSchema.Variant originalVariant =
HoodieSchema.createVariantShredded(typedValueSchema);
+ String jsonSchema = originalVariant.toString();
Review Comment:
Done
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]