[
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)