|
33 | 33 | import java.util.HashMap; |
34 | 34 | import java.util.List; |
35 | 35 | import java.util.Map; |
| 36 | +import java.util.Objects; |
36 | 37 | import java.util.Optional; |
37 | 38 | import java.util.Random; |
38 | 39 | import org.apache.avro.AvroRuntimeException; |
@@ -1416,4 +1417,61 @@ void avroDoc() { |
1416 | 1417 | + "{\"name\":\"foo\",\"type\":\"int\",\"doc\":\"Some Documentation\"}" + "]}"); |
1417 | 1418 | } |
1418 | 1419 |
|
| 1420 | + // test recursive record schema |
| 1421 | + public static class TreeNode { |
| 1422 | + public int value = 0; |
| 1423 | + @Nullable |
| 1424 | + public TreeNode left; |
| 1425 | + @Nullable |
| 1426 | + public TreeNode right; |
| 1427 | + |
| 1428 | + public TreeNode() { |
| 1429 | + } |
| 1430 | + |
| 1431 | + public TreeNode(int value) { |
| 1432 | + this.value = value; |
| 1433 | + } |
| 1434 | + |
| 1435 | + @Override |
| 1436 | + public boolean equals(Object o) { |
| 1437 | + if (!(o instanceof TreeNode)) |
| 1438 | + return false; |
| 1439 | + TreeNode that = (TreeNode) o; |
| 1440 | + if (value != that.value || !Objects.equals(left, that.left) || !Objects.equals(right, that.right)) |
| 1441 | + return false; |
| 1442 | + return true; |
| 1443 | + } |
| 1444 | + |
| 1445 | + @Override |
| 1446 | + public int hashCode() { |
| 1447 | + return Objects.hash(value, left, right); |
| 1448 | + } |
| 1449 | + |
| 1450 | + } |
| 1451 | + |
| 1452 | + @Test |
| 1453 | + void recursiveRecord() throws Exception { |
| 1454 | + Schema schema = ReflectData.get().getSchema(TreeNode.class); |
| 1455 | + assertEquals("TreeNode", schema.getName()); |
| 1456 | + assertEquals(3, schema.getFields().size()); |
| 1457 | + |
| 1458 | + // Verify that the left tree node contains the parent schema |
| 1459 | + Schema leftSchema = schema.getField("left").schema(); |
| 1460 | + assertEquals(Schema.Type.UNION, leftSchema.getType()); |
| 1461 | + assertEquals(2, leftSchema.getTypes().size()); |
| 1462 | + assertEquals(Schema.Type.NULL, leftSchema.getTypes().get(0).getType()); |
| 1463 | + assertEquals(schema, leftSchema.getTypes().get(1)); |
| 1464 | + |
| 1465 | + // Verify that the right tree node is the same union |
| 1466 | + Schema rightSchema = schema.getField("right").schema(); |
| 1467 | + assertEquals(leftSchema, rightSchema); |
| 1468 | + |
| 1469 | + // Test serialization with actual recursive data |
| 1470 | + TreeNode root = new TreeNode(100); |
| 1471 | + root.left = new TreeNode(90); |
| 1472 | + root.right = new TreeNode(101); |
| 1473 | + root.left.left = new TreeNode(-100); |
| 1474 | + |
| 1475 | + checkReadWrite(root); |
| 1476 | + } |
1419 | 1477 | } |
0 commit comments