jnturton commented on code in PR #2613:
URL: https://github.com/apache/drill/pull/2613#discussion_r929453717


##########
exec/java-exec/src/main/codegen/templates/ParquetOutputRecordWriter.java:
##########
@@ -94,23 +94,165 @@ public void setUp(MessageType schema, RecordConsumer 
consumer) {
 
   protected abstract PrimitiveType getPrimitiveType(MaterializedField field);
 
+  public abstract class BaseFieldConverter extends FieldConverter {
+
+    public BaseFieldConverter(int fieldId, String fieldName, FieldReader 
reader) {
+      super(fieldId, fieldName, reader);
+    }
+
+    public abstract void read();
+
+    public abstract void read(int i);
+
+    public abstract void consume();
+
+    @Override
+    public void writeField() throws IOException {
+      read();
+      consume();
+    }
+  }
+
+  public class NullableFieldConverter extends FieldConverter {
+    private BaseFieldConverter delegate;
+
+    public NullableFieldConverter(int fieldId, String fieldName, FieldReader 
reader, BaseFieldConverter delegate) {
+      super(fieldId, fieldName, reader);
+      this.delegate = delegate;
+    }
+
+    @Override
+    public void writeField() throws IOException {
+      if (!reader.isSet()) {
+        return;
+      }
+      consumer.startField(fieldName, fieldId);
+      delegate.writeField();
+      consumer.endField(fieldName, fieldId);
+    }
+
+    public void setPosition(int index) {
+      delegate.setPosition(index);
+    }
+
+    public void startField() throws IOException {
+      delegate.startField();
+    }
+
+    public void endField() throws IOException {
+      delegate.endField();
+    }
+  }
+
+  public class RequiredFieldConverter extends FieldConverter {
+    private BaseFieldConverter delegate;
+
+    public RequiredFieldConverter(int fieldId, String fieldName, FieldReader 
reader, BaseFieldConverter delegate) {
+      super(fieldId, fieldName, reader);
+      this.delegate = delegate;
+    }
+
+    @Override
+    public void writeField() throws IOException {
+      consumer.startField(fieldName, fieldId);
+      delegate.writeField();
+      consumer.endField(fieldName, fieldId);
+    }
+
+    public void setPosition(int index) {
+      delegate.setPosition(index);
+    }
+
+    public void startField() throws IOException {
+      delegate.startField();
+    }
+
+    public void endField() throws IOException {
+      delegate.endField();
+    }
+  }
+
+  public class RepeatedFieldConverter extends FieldConverter {
+
+    private BaseFieldConverter delegate;
+
+    public RepeatedFieldConverter(int fieldId, String fieldName, FieldReader 
reader, BaseFieldConverter delegate) {
+      super(fieldId, fieldName, reader);
+      this.delegate = delegate;
+    }
+
+    @Override
+    public void writeField() throws IOException {
+      // empty lists are represented by simply not starting a field, rather 
than starting one and putting in 0 elements
+      if (reader.size() == 0) {
+        return;
+      }
+      consumer.startField(fieldName, fieldId);
+      for (int i = 0; i < reader.size(); i++) {
+        delegate.read(i);
+        delegate.consume();
+      }
+      consumer.endField(fieldName, fieldId);
+    }
+
+    @Override
+    public void writeListField() {
+      if (reader.size() == 0) {
+        return;
+      }
+      consumer.startField(LIST, ZERO_IDX);
+      for (int i = 0; i < reader.size(); i++) {
+        consumer.startGroup();
+        consumer.startField(ELEMENT, ZERO_IDX);
+
+        delegate.read(i);
+        delegate.consume();
+
+        consumer.endField(ELEMENT, ZERO_IDX);
+        consumer.endGroup();
+      }
+      consumer.endField(LIST, ZERO_IDX);
+    }
+
+    public void setPosition(int index) {
+      delegate.setPosition(index);
+    }
+
+    public void startField() throws IOException {
+      delegate.startField();
+    }
+
+    public void endField() throws IOException {
+      delegate.endField();
+    }
+  }
+
 <#list vv.types as type>
   <#list type.minor as minor>
     <#list vv.modes as mode>
   @Override
   public FieldConverter getNew${mode.prefix}${minor.class}Converter(int 
fieldId, String fieldName, FieldReader reader) {
-    return new ${mode.prefix}${minor.class}ParquetConverter(fieldId, 
fieldName, reader);
+    BaseFieldConverter converter = new ${minor.class}ParquetConverter(fieldId, 
fieldName, reader);
+  <#if mode.prefix == "Nullable">
+    return new NullableFieldConverter(fieldId, fieldName, reader, converter);
+  <#elseif mode.prefix == "Repeated">
+    return new RepeatedFieldConverter(fieldId, fieldName, reader, converter);
+  <#else>
+    return new RequiredFieldConverter(fieldId, fieldName, reader, converter);
+  </#if>
   }
 
-  public class ${mode.prefix}${minor.class}ParquetConverter extends 
FieldConverter {
+    </#list>
+
+  public class ${minor.class}ParquetConverter extends BaseFieldConverter {
     private Nullable${minor.class}Holder holder = new 
Nullable${minor.class}Holder();
     <#if minor.class?contains("Interval")>
     private final byte[] output = new byte[12];
     <#elseif minor.class == "VarDecimal">
     private final DecimalValueWriter decimalValueWriter;
     </#if>
 
-    public ${mode.prefix}${minor.class}ParquetConverter(int fieldId, String 
fieldName, FieldReader reader) {
+    public ${minor.class}ParquetConverter(int fieldId, String fieldName, 
FieldReader reader) {

Review Comment:
   It's nice to have the template logic that follows simplified, thanks.



-- 
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: dev-unsubscr...@drill.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to