You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by GitBox <gi...@apache.org> on 2019/05/02 11:22:05 UTC
[GitHub] [pulsar] tuteng commented on a change in pull request #4177:
[pulsar-clients]Support nested struct for GenericRecord
tuteng commented on a change in pull request #4177: [pulsar-clients]Support nested struct for GenericRecord
URL: https://github.com/apache/pulsar/pull/4177#discussion_r280376590
##########
File path: pulsar-client/src/test/java/org/apache/pulsar/client/impl/schema/SchemaBuilderTest.java
##########
@@ -200,4 +201,134 @@ public void testGenericRecordBuilderByIndex() {
assertEquals(0.7f, fields.floatField);
assertEquals(1.34d, fields.doubleField);
}
+
+ @Test
+ public void testGenericRecordBuilderAvroByFilename() {
+ RecordSchemaBuilder people1SchemaBuilder = SchemaBuilder.record("People1");
+ people1SchemaBuilder.field("age").type(SchemaType.INT32);
+ people1SchemaBuilder.field("height").type(SchemaType.INT32);
+ people1SchemaBuilder.field("name").type(SchemaType.STRING);
+
+
+ SchemaInfo people1SchemaInfo = people1SchemaBuilder.build(SchemaType.AVRO);
+ GenericSchema people1Schema = Schema.generic(people1SchemaInfo);
+
+
+ GenericRecordBuilder people1RecordBuilder = people1Schema.newRecordBuilder();
+ people1RecordBuilder.set("age", 20);
+ people1RecordBuilder.set("height", 180);
+ people1RecordBuilder.set("name", "people1");
+ GenericRecord people1GenericRecord = people1RecordBuilder.build();
+
+ RecordSchemaBuilder people2SchemaBuilder = SchemaBuilder.record("People2");
+ people2SchemaBuilder.field("age").type(SchemaType.INT32);
+ people2SchemaBuilder.field("height").type(SchemaType.INT32);
+ people2SchemaBuilder.field("name").type(SchemaType.STRING);
+
+ SchemaInfo people2SchemaInfo = people2SchemaBuilder.build(SchemaType.AVRO);
+ GenericSchema people2Schema = Schema.generic(people2SchemaInfo);
+
+ GenericRecordBuilder people2RecordBuilder = people2Schema.newRecordBuilder();
+ people2RecordBuilder.set("age", 20);
+ people2RecordBuilder.set("height", 180);
+ people2RecordBuilder.set("name", "people2");
+ GenericRecord people2GenericRecord = people2RecordBuilder.build();
+
+ RecordSchemaBuilder peopleSchemaBuilder = SchemaBuilder.record("People");
+ peopleSchemaBuilder.field("people1", people1Schema).type(SchemaType.AVRO);
+ peopleSchemaBuilder.field("people2", people2Schema).type(SchemaType.AVRO);
+
+
+ SchemaInfo schemaInfo = peopleSchemaBuilder.build(SchemaType.AVRO);
+
+ GenericSchema peopleSchema = Schema.generic(schemaInfo);
+ GenericRecordBuilder peopleRecordBuilder = peopleSchema.newRecordBuilder();
+ peopleRecordBuilder.set("people1", people1GenericRecord);
+ peopleRecordBuilder.set("people2", people2GenericRecord);
+ GenericRecord peopleRecord = peopleRecordBuilder.build();
+
+ byte[] peopleEncode = peopleSchema.encode(peopleRecord);
+
+ GenericRecord people = (GenericRecord) peopleSchema.decode(peopleEncode);
+
+ assertEquals(people.getFields(), peopleRecord.getFields());
+ assertEquals(((GenericRecord)people.getField("people1")).getField("age"),
+ people1GenericRecord.getField("age"));
+ assertEquals(((GenericRecord)people.getField("people1")).getField("heigth"),
+ people1GenericRecord.getField("heigth"));
+ assertEquals(((GenericRecord)people.getField("people1")).getField("name"),
+ people1GenericRecord.getField("name"));
+ assertEquals(((GenericRecord)people.getField("people2")).getField("age"),
+ people2GenericRecord.getField("age"));
+ assertEquals(((GenericRecord)people.getField("people2")).getField("height"),
+ people2GenericRecord.getField("height"));
+ assertEquals(((GenericRecord)people.getField("people2")).getField("name"),
+ people2GenericRecord.getField("name"));
+
+ }
+
+ @Test
+ public void testGenericRecordBuilderAvroByFiled() {
Review comment:
I have defined the following classes:
```
@Data
@ToString
@EqualsAndHashCode
private static class People {
@Nullable
private static People1 people1;
@Nullable
private static People2 people2;
@Nullable
private String name;
}
@Data
private static class People1 {
private int age;
private int height;
private String name;
}
@Data
private static class People2 {
private int age;
private int height;
private String name;
}
```
I use the following code to build pojo
```
Schema<People> peopleDecodeSchema = Schema.AVRO(People.class);
People people = peopleDecodeSchema.decode(peopleEncode);
```
![image](https://user-images.githubusercontent.com/1907867/57072034-dd394b00-6d0e-11e9-8831-d012f406e8fc.png)
When I was debugging, I found that neither Class People1 nor Class People2 was initialized to Class People. Only the field name is correctly initialized.
I'm not sure if I'm using the right method now, but I've tried many times and haven't been able to correctly use pojo to build class People.
I want to get help and get the right method. Thank you.
----------------------------------------------------------------
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.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
With regards,
Apache Git Services