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