Skip to content

Commit c9230b0

Browse files
authored
Fix nested array conversion (#156)
* Fix nested array conversion * remove default in sanitize
1 parent 9141cce commit c9230b0

File tree

3 files changed

+37
-2
lines changed

3 files changed

+37
-2
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/build/
55
*/*.iml
66
./models/external/
7+
.DS_Store
78

89
# Compiled class file
910
*.class

hoptimator-avro/src/main/java/com/linkedin/hoptimator/avro/AvroConverter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,10 @@ public static Schema avro(String namespace, String name, RelDataType dataType) {
6262
case BOOLEAN:
6363
return createAvroTypeWithNullability(Schema.Type.BOOLEAN, dataType.isNullable());
6464
case ARRAY:
65-
return createAvroSchemaWithNullability(Schema.createArray(avro(null, null, Objects.requireNonNull(dataType.getComponentType()))),
65+
return createAvroSchemaWithNullability(Schema.createArray(avro(null, "arrayElement", Objects.requireNonNull(dataType.getComponentType()))),
6666
dataType.isNullable());
6767
case MAP:
68-
return createAvroSchemaWithNullability(Schema.createMap(avro(null, null, Objects.requireNonNull(dataType.getValueType()))),
68+
return createAvroSchemaWithNullability(Schema.createMap(avro(null, "mapElement", Objects.requireNonNull(dataType.getValueType()))),
6969
dataType.isNullable());
7070
case UNKNOWN:
7171
case NULL:

hoptimator-avro/src/test/java/com/linkedin/hoptimator/avro/AvroConverterTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,4 +174,38 @@ public void testAvroKeyPayloadSchemaPrimitiveKey() {
174174
assertEquals("field1", result.getValue().getFields().get(0).name());
175175
assertEquals("string", result.getValue().getFields().get(0).schema().getType().getName());
176176
}
177+
178+
@Test
179+
public void convertsNestedArray() {
180+
// Create a RelDataType with an array of structs
181+
RelDataTypeFactory typeFactory = new SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
182+
183+
// Create a struct type for array elements
184+
RelDataTypeFactory.Builder elementBuilder = new RelDataTypeFactory.Builder(typeFactory);
185+
elementBuilder.add("field1", typeFactory.createSqlType(SqlTypeName.VARCHAR));
186+
elementBuilder.add("field2", typeFactory.createSqlType(SqlTypeName.INTEGER));
187+
RelDataType structType = elementBuilder.build();
188+
189+
// Create array of structs type
190+
RelDataType arrayOfStructsType = typeFactory.createArrayType(structType, -1);
191+
192+
// Test with a struct containing an array of structs field
193+
RelDataTypeFactory.Builder containerBuilder = new RelDataTypeFactory.Builder(typeFactory);
194+
containerBuilder.add("arrayOfStructsField", arrayOfStructsType);
195+
RelDataType containerType = containerBuilder.build();
196+
197+
Schema containerSchema = AvroConverter.avro("test", "Record", containerType);
198+
assertNotNull(containerSchema);
199+
assertEquals(1, containerSchema.getFields().size());
200+
assertEquals("arrayOfStructsField", containerSchema.getFields().get(0).name());
201+
202+
Schema arrayFieldSchema = containerSchema.getFields().get(0).schema();
203+
assertEquals(Schema.Type.ARRAY, arrayFieldSchema.getType());
204+
205+
Schema structElementSchema = arrayFieldSchema.getElementType();
206+
assertEquals(Schema.Type.RECORD, structElementSchema.getType());
207+
assertEquals(2, structElementSchema.getFields().size());
208+
assertEquals("field1", structElementSchema.getFields().get(0).name());
209+
assertEquals("field2", structElementSchema.getFields().get(1).name());
210+
}
177211
}

0 commit comments

Comments
 (0)