Fokko commented on code in PR #296: URL: https://github.com/apache/iceberg-python/pull/296#discussion_r1467071050
########## tests/test_schema.py: ########## @@ -912,3 +914,668 @@ def test_promotion(file_type: IcebergType, read_type: IcebergType) -> None: else: with pytest.raises(ResolveError): promote(file_type, read_type) + + +@pytest.fixture() +def primitive_fields() -> List[NestedField]: + return [ + NestedField(field_id=1, name=str(primitive_type), field_type=primitive_type, required=False) + for primitive_type in TEST_PRIMITIVE_TYPES + ] + + +def test_add_top_level_primitives(primitive_fields: NestedField) -> None: + for primitive_field in primitive_fields: + new_schema = Schema(primitive_field) + applied = UpdateSchema(None, schema=Schema()).union_by_name(new_schema)._apply() + assert applied == new_schema + + +def test_add_top_level_list_of_primitives(primitive_fields: NestedField) -> None: + for primitive_type in TEST_PRIMITIVE_TYPES: + new_schema = Schema( + NestedField( + field_id=1, + name="aList", + field_type=ListType(element_id=2, element_type=primitive_type, element_required=False), + required=False, + ) + ) + applied = UpdateSchema(None, schema=Schema()).union_by_name(new_schema)._apply() + assert applied.as_struct() == new_schema.as_struct() + + +def test_add_top_level_map_of_primitives(primitive_fields: NestedField) -> None: + for primitive_type in TEST_PRIMITIVE_TYPES: + new_schema = Schema( + NestedField( + field_id=1, + name="aMap", + field_type=MapType( + key_id=2, key_type=primitive_type, value_id=3, value_type=primitive_type, value_required=False + ), + required=False, + ) + ) + applied = UpdateSchema(None, schema=Schema()).union_by_name(new_schema)._apply() + assert applied.as_struct() == new_schema.as_struct() + + +def test_add_top_struct_of_primitives(primitive_fields: NestedField) -> None: + for primitive_type in TEST_PRIMITIVE_TYPES: + new_schema = Schema( + NestedField( + field_id=1, + name="aStruct", + field_type=StructType(NestedField(field_id=2, name="primitive", field_type=primitive_type, required=False)), + required=False, + ) + ) + applied = UpdateSchema(None, schema=Schema()).union_by_name(new_schema)._apply() + assert applied.as_struct() == new_schema.as_struct() + + +def test_add_nested_primitive(primitive_fields: NestedField) -> None: + for primitive_type in TEST_PRIMITIVE_TYPES: + current_schema = Schema(NestedField(field_id=1, name="aStruct", field_type=StructType(), required=False)) + new_schema = Schema( + NestedField( + field_id=1, + name="aStruct", + field_type=StructType(NestedField(field_id=2, name="primitive", field_type=primitive_type, required=False)), + required=False, + ) + ) + applied = UpdateSchema(None, schema=current_schema).union_by_name(new_schema)._apply() + assert applied.as_struct() == new_schema.as_struct() + + +def _primitive_fields(types: List[PrimitiveType], start_id: int = 0) -> List[NestedField]: + fields = [] + for iceberg_type in types: + fields.append(NestedField(field_id=start_id, name=str(iceberg_type), field_type=iceberg_type, required=False)) + start_id = start_id + 1 + + return fields + + +def test_add_nested_primitives(primitive_fields: NestedField) -> None: + current_schema = Schema(NestedField(field_id=1, name="aStruct", field_type=StructType(), required=False)) + new_schema = Schema( + NestedField( + field_id=1, name="aStruct", field_type=StructType(*_primitive_fields(TEST_PRIMITIVE_TYPES, 2)), required=False + ) + ) + applied = UpdateSchema(None, schema=current_schema).union_by_name(new_schema)._apply() + assert applied.as_struct() == new_schema.as_struct() + + +def test_add_nested_lists(primitive_fields: NestedField) -> None: + new_schema = Schema( + NestedField( + field_id=1, + name="aList", + type=ListType( + element_id=2, + element_type=ListType( + element_id=3, Review Comment: It was the linter :D I guess it got the inspiration from Java: https://github.com/apache/iceberg/blob/17757276928e87e78314b6c19c8b3ebad9612619/core/src/test/java/org/apache/iceberg/TestSchemaUnionByFieldName.java#L429-L459 :D -- 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: issues-unsubscr...@iceberg.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: issues-unsubscr...@iceberg.apache.org For additional commands, e-mail: issues-h...@iceberg.apache.org