[ 
https://issues.apache.org/jira/browse/DRILL-8272?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17571150#comment-17571150
 ] 

ASF GitHub Bot commented on DRILL-8272:
---------------------------------------

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.





> Skip MAP column without children when creating parquet tables
> -------------------------------------------------------------
>
>                 Key: DRILL-8272
>                 URL: https://issues.apache.org/jira/browse/DRILL-8272
>             Project: Apache Drill
>          Issue Type: Bug
>    Affects Versions: 1.20.1
>            Reporter: Vova Vysotskyi
>            Assignee: Vova Vysotskyi
>            Priority: Major
>             Fix For: 1.20.2
>
>




--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to