emkornfield commented on code in PR #15283:
URL: https://github.com/apache/iceberg/pull/15283#discussion_r2990959210


##########
kafka-connect/kafka-connect/src/test/java/org/apache/iceberg/connect/data/TestRecordConverter.java:
##########
@@ -881,6 +888,203 @@ public void testEvolveTypeDetectionStructNested() {
     assertThat(updateMap.get("st.ff").type()).isInstanceOf(DoubleType.class);
   }
 
+  private RecordConverter variantConverter() {
+    Table table = mock(Table.class);
+    when(table.schema()).thenReturn(VARIANT_SCHEMA);
+    return new RecordConverter(table, config);
+  }
+
+  @Test
+  public void testConvertVariantValueFromNull() {
+    Variant variant = variantConverter().convertVariantValue(null);
+    assertThat(variant).isNotNull();
+    assertThat(variant.value().type()).isEqualTo(PhysicalType.NULL);
+  }
+
+  @Test
+  public void testConvertVariantValueFromPrimitiveString() {
+    Variant variant = variantConverter().convertVariantValue("hello");
+    assertThat(variant).isNotNull();
+    assertThat(variant.metadata()).isNotNull();
+    assertThat(variant.metadata().dictionarySize()).isEqualTo(0);
+    assertThat(variant.value().type()).isEqualTo(PhysicalType.STRING);
+    assertThat(variant.value().asPrimitive().get()).isEqualTo("hello");
+  }
+
+  @Test
+  public void testConvertVariantValueFromPrimitiveNumber() {
+    Variant variant = variantConverter().convertVariantValue(123);
+    assertThat(variant).isNotNull();
+    assertThat(variant.metadata().dictionarySize()).isEqualTo(0);
+    assertThat(variant.value().type()).isEqualTo(PhysicalType.INT32);
+    assertThat(variant.value().asPrimitive().get()).isEqualTo(123);
+  }
+
+  @Test
+  public void testConvertVariantValueFromBoolean() {
+    Variant variant = variantConverter().convertVariantValue(true);
+    assertThat(variant).isNotNull();
+    assertThat(variant.value().type()).isEqualTo(PhysicalType.BOOLEAN_TRUE);
+    assertThat(variant.value().asPrimitive().get()).isEqualTo(true);
+  }
+
+  @Test
+  public void testConvertVariantValueFromList() {
+    Variant variant = 
variantConverter().convertVariantValue(ImmutableList.of("hello", 1));
+    assertThat(variant).isNotNull();
+    assertThat(variant.metadata().dictionarySize()).isEqualTo(0);
+    assertThat(variant.value().type()).isEqualTo(PhysicalType.ARRAY);
+    assertThat(variant.value().asArray().numElements()).isEqualTo(2);
+    
assertThat(variant.value().asArray().get(0).asPrimitive().get()).isEqualTo("hello");
+    
assertThat(variant.value().asArray().get(1).asPrimitive().get()).isEqualTo(1);
+  }
+
+  @Test
+  public void testConvertVariantValueFromListWithMixedTypes() {
+    // array with heterogeneous element types (string, int, boolean, double, 
null)
+    // Note: java.util.Date is not supported in variant conversion; use 
supported types only.
+    List<Object> input = Lists.newArrayList("a", 1, true, 2.5, null);
+    Variant variant = variantConverter().convertVariantValue(input);
+
+    assertThat(variant).isNotNull();
+    assertThat(variant.value().type()).isEqualTo(PhysicalType.ARRAY);
+    assertThat(variant.value().asArray().numElements()).isEqualTo(5);
+
+    
assertThat(variant.value().asArray().get(0).type()).isEqualTo(PhysicalType.STRING);
+    
assertThat(variant.value().asArray().get(0).asPrimitive().get()).isEqualTo("a");
+
+    
assertThat(variant.value().asArray().get(1).type()).isEqualTo(PhysicalType.INT32);
+    
assertThat(variant.value().asArray().get(1).asPrimitive().get()).isEqualTo(1);
+
+    
assertThat(variant.value().asArray().get(2).type()).isEqualTo(PhysicalType.BOOLEAN_TRUE);
+    
assertThat(variant.value().asArray().get(2).asPrimitive().get()).isEqualTo(true);
+
+    
assertThat(variant.value().asArray().get(3).type()).isEqualTo(PhysicalType.DOUBLE);
+    
assertThat(variant.value().asArray().get(3).asPrimitive().get()).isEqualTo(2.5);
+
+    
assertThat(variant.value().asArray().get(4).type()).isEqualTo(PhysicalType.NULL);
+  }
+
+  @Test
+  public void testConvertVariantValueFromMap() {
+    Variant variant = 
variantConverter().convertVariantValue(ImmutableMap.of("hello", 1));
+    assertThat(variant).isNotNull();
+    assertThat(variant.metadata().dictionarySize()).isEqualTo(1);
+    assertThat(variant.metadata().get(0)).isEqualTo("hello");
+    assertThat(variant.value().type()).isEqualTo(PhysicalType.OBJECT);
+    assertThat(variant.value().asObject().numFields()).isEqualTo(1);
+    
assertThat(variant.value().asObject().get("hello").asPrimitive().get()).isEqualTo(1);
+  }
+
+  @Test
+  public void testConvertVariantValueFromStructNested() {
+    Schema innerSchema =
+        SchemaBuilder.struct().field("x", Schema.INT32_SCHEMA).field("y", 
Schema.STRING_SCHEMA);
+    Schema outerSchema =
+        SchemaBuilder.struct().field("inner", innerSchema).field("id", 
Schema.INT64_SCHEMA);
+    Struct inner = new Struct(innerSchema).put("x", 1).put("y", "world");
+    Struct outer = new Struct(outerSchema).put("inner", inner).put("id", 100L);
+
+    Variant variant = variantConverter().convertVariantValue(outer);
+
+    assertThat(variant).isNotNull();
+    assertThat(variant.metadata().dictionarySize()).isEqualTo(4);
+    assertThat(variant.value().type()).isEqualTo(PhysicalType.OBJECT);
+    
assertThat(variant.value().asObject().get("id").asPrimitive().get()).isEqualTo(100L);
+    VariantValue innerVal = variant.value().asObject().get("inner");
+    assertThat(innerVal.type()).isEqualTo(PhysicalType.OBJECT);
+    assertThat(innerVal.asObject().get("x").asPrimitive().get()).isEqualTo(1);
+    
assertThat(innerVal.asObject().get("y").asPrimitive().get()).isEqualTo("world");
+  }
+
+  @Test
+  public void testConvertVariantValueFromMapNested() {
+    Variant variant =
+        variantConverter()
+            .convertVariantValue(ImmutableMap.of("hello", 
ImmutableMap.of("world", 1)));
+    assertThat(variant).isNotNull();
+    assertThat(variant.metadata().dictionarySize()).isEqualTo(2);
+    assertThat(variant.value().type()).isEqualTo(PhysicalType.OBJECT);
+    
assertThat(variant.value().asObject().get("hello").type()).isEqualTo(PhysicalType.OBJECT);
+    
assertThat(variant.value().asObject().get("hello").asObject().get("world").asPrimitive().get())
+        .isEqualTo(1);
+  }
+
+  @Test
+  public void testConvertVariantValueFromMapWithList() {
+    // map with list values: { "tags": ["a", "b"], "counts": [1, 2] }
+    Map<String, Object> input =
+        ImmutableMap.<String, Object>builder()
+            .put("tags", ImmutableList.of("a", "b"))
+            .put("counts", ImmutableList.of(1, 2))
+            .build();
+    Variant variant = variantConverter().convertVariantValue(input);
+
+    assertThat(variant).isNotNull();
+    assertThat(variant.value().type()).isEqualTo(PhysicalType.OBJECT);
+    assertThat(variant.value().asObject().numFields()).isEqualTo(2);
+
+    VariantValue tags = variant.value().asObject().get("tags");
+    assertThat(tags.type()).isEqualTo(PhysicalType.ARRAY);
+    assertThat(tags.asArray().numElements()).isEqualTo(2);
+    assertThat(tags.asArray().get(0).asPrimitive().get()).isEqualTo("a");
+    assertThat(tags.asArray().get(1).asPrimitive().get()).isEqualTo("b");
+
+    VariantValue counts = variant.value().asObject().get("counts");
+    assertThat(counts.type()).isEqualTo(PhysicalType.ARRAY);
+    assertThat(counts.asArray().get(0).asPrimitive().get()).isEqualTo(1);
+    assertThat(counts.asArray().get(1).asPrimitive().get()).isEqualTo(2);
+  }
+
+  @Test
+  public void testConvertVariantValueFromListOfMaps() {
+    // list of maps: [ {"id": 1, "name": "x"}, {"id": 2} ]
+    List<Map<String, Object>> input =
+        ImmutableList.of(
+            ImmutableMap.<String, Object>builder().put("id", 1).put("name", 
"x").build(),
+            ImmutableMap.of("id", 2));
+    Variant variant = variantConverter().convertVariantValue(input);
+
+    assertThat(variant).isNotNull();
+    assertThat(variant.value().type()).isEqualTo(PhysicalType.ARRAY);
+    assertThat(variant.value().asArray().numElements()).isEqualTo(2);
+
+    VariantValue first = variant.value().asArray().get(0);
+    assertThat(first.type()).isEqualTo(PhysicalType.OBJECT);
+    assertThat(first.asObject().get("id").asPrimitive().get()).isEqualTo(1);
+    
assertThat(first.asObject().get("name").asPrimitive().get()).isEqualTo("x");
+
+    VariantValue second = variant.value().asArray().get(1);
+    assertThat(second.type()).isEqualTo(PhysicalType.OBJECT);
+    assertThat(second.asObject().get("id").asPrimitive().get()).isEqualTo(2);
+  }
+
+  @Test
+  public void testConvertVariantValueFromMixedNested() {

Review Comment:
   should we tested nested values within a struct?



-- 
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]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to