This is an automated email from the ASF dual-hosted git repository. progers pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/drill.git
commit e394499eb8b114cb3cbb21239c4383fe6f77e1e6 Author: Paul Rogers <par0...@gmail.com> AuthorDate: Sat Dec 24 17:48:46 2022 -0800 Add unprojected vector support to more column writers Includes all but the DICT writers. --- .../physical/resultSet/impl/ColumnBuilder.java | 49 ++++++--- .../physical/resultSet/impl/NullVectorState.java | 2 - .../physical/resultSet/impl/RepeatedListState.java | 29 +++-- .../resultSet/impl/ResultSetLoaderImpl.java | 5 +- .../impl/TestResultSetLoaderUnprojected.java | 119 +++++++++++++++++++-- .../accessor/writer/AbstractArrayWriter.java | 6 +- .../accessor/writer/ColumnWriterFactory.java | 3 +- .../vector/accessor/writer/ListWriterImpl.java | 14 ++- .../vector/accessor/writer/ObjectDictWriter.java | 22 ++-- .../vector/accessor/writer/RepeatedListWriter.java | 3 +- .../vector/accessor/writer/ScalarArrayWriter.java | 2 + .../vector/accessor/writer/SimpleListShim.java | 5 + .../exec/vector/accessor/writer/UnionShim.java | 1 + .../vector/accessor/writer/UnionVectorShim.java | 1 - .../vector/accessor/writer/UnionWriterImpl.java | 25 ----- 15 files changed, 200 insertions(+), 86 deletions(-) diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/resultSet/impl/ColumnBuilder.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/resultSet/impl/ColumnBuilder.java index af32d15e3e..bb02d56b54 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/resultSet/impl/ColumnBuilder.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/resultSet/impl/ColumnBuilder.java @@ -156,8 +156,7 @@ public class ColumnBuilder { } else if (columnSchema.isArray()) { vectorState = new RepeatedVectorState(colWriter.array(), (RepeatedValueVector) vector); } else if (columnSchema.isNullable()) { - vectorState = new NullableVectorState( - colWriter, (NullableVector) vector); + vectorState = new NullableVectorState(colWriter, (NullableVector) vector); } else { vectorState = SimpleVectorState.vectorState(columnSchema, colWriter.events(), vector); @@ -323,6 +322,8 @@ public class ColumnBuilder { if (parent.projection().projection(columnSchema).isProjected || allowCreation(parent)) { vector = new UnionVector(columnSchema.schema(), parent.loader().allocator(), null); } else { + + // Column is not projected. No materialized backing for the column. vector = null; } @@ -378,7 +379,10 @@ public class ColumnBuilder { */ private ColumnState buildSimpleList(ContainerState parent, ColumnMetadata columnSchema) { - // The variant must have the one and only type. + final ProjectionFilter projFilter = parent.projection(); + final ProjResult projResult = projFilter.projection(columnSchema); + + // The variant must have the one and only type. assert columnSchema.variantSchema().size() == 1; assert columnSchema.variantSchema().isSimple(); @@ -392,9 +396,16 @@ public class ColumnBuilder { listState.setSubColumn(memberState); // Create the list vector. Contains a single type. - final ListVector listVector = new ListVector(columnSchema.schema().cloneEmpty(), - parent.loader().allocator(), null); - listVector.setChildVector(memberState.vector()); + final ListVector listVector; + if (projResult.isProjected) { + listVector= new ListVector(columnSchema.schema().cloneEmpty(), + parent.loader().allocator(), null); + listVector.setChildVector(memberState.vector()); + } else { + + // Column is not projected. No materialized backing for the column. + listVector = null; + } // Create the list writer: an array of the one type. final ListWriterImpl listWriter = new ListWriterImpl(columnSchema, @@ -402,8 +413,13 @@ public class ColumnBuilder { final AbstractObjectWriter listObjWriter = new ArrayObjectWriter(listWriter); // Create the list vector state that tracks the list vector lifecycle. - final ListVectorState vectorState = new ListVectorState(listWriter, - memberState.writer().events(), listVector); + final VectorState vectorState; + if (listVector == null) { + vectorState = new NullVectorState(); + } else { + vectorState= new ListVectorState(listWriter, + memberState.writer().events(), listVector); + } // Assemble it all into a union column state. return new UnionColumnState(parent.loader(), @@ -474,17 +490,24 @@ public class ColumnBuilder { // the element type after creating the repeated writer itself. assert columnSchema.childSchema() == null; + final ProjectionFilter projFilter = parent.projection(); + final ProjResult projResult = projFilter.projection(columnSchema); + // Build the repeated vector. - final RepeatedListVector vector = new RepeatedListVector( + final RepeatedListVector vector; + if (projResult.isProjected) { + vector = new RepeatedListVector( columnSchema.emptySchema(), parent.loader().allocator(), null); + } else { + vector = null; + } // No inner type yet. The result set loader builds the subtype // incrementally because it might be complex (a map or another // repeated list.) To start, use a dummy to avoid need for if-statements // everywhere. final ColumnMetadata dummyElementSchema = new PrimitiveColumnMetadata( - MaterializedField.create(columnSchema.name(), - Types.repeated(MinorType.NULL))); + MaterializedField.create(columnSchema.name(), Types.repeated(MinorType.NULL))); final AbstractObjectWriter dummyElement = ColumnWriterFactory.buildDummyColumnWriter(dummyElementSchema); // Create the list writer: an array of arrays. @@ -492,9 +515,7 @@ public class ColumnBuilder { columnSchema, vector, dummyElement); // Create the list vector state that tracks the list vector lifecycle. - - final RepeatedListVectorState vectorState = new RepeatedListVectorState( - arrayWriter, vector); + final VectorState vectorState = new RepeatedListVectorState(arrayWriter, vector); // Build the container that tracks the array contents final RepeatedListState listState = new RepeatedListState( diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/resultSet/impl/NullVectorState.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/resultSet/impl/NullVectorState.java index 041679c0fb..9f2b7f99bc 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/resultSet/impl/NullVectorState.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/resultSet/impl/NullVectorState.java @@ -24,7 +24,6 @@ import org.apache.drill.exec.vector.accessor.impl.HierarchicalFormatter; * Do-nothing vector state for a map column which has no actual vector * associated with it. */ - public class NullVectorState implements VectorState { /** @@ -32,7 +31,6 @@ public class NullVectorState implements VectorState { * allocate or roll-over, but where we do want to at least track * the vector itself. (Used for map and union pseudo-vectors.) */ - public static class UnmanagedVectorState extends NullVectorState { ValueVector vector; diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/resultSet/impl/RepeatedListState.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/resultSet/impl/RepeatedListState.java index f12cbfe3bc..6bf3d85bde 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/resultSet/impl/RepeatedListState.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/resultSet/impl/RepeatedListState.java @@ -37,7 +37,7 @@ import com.google.common.collect.Lists; /** * Represents the internal state of a RepeatedList vector. The repeated list * is wrapped in a repeated list "column state" that manages the column as a - * whole. The repeated list acts as a container which the <tt>RepeatedListState<tt> + * whole. The repeated list acts as a container which the {@code RepeatedListState} * implements. At the vector level, we track the repeated list vector, but * only perform operations on its associated offset vector. */ @@ -48,12 +48,12 @@ public class RepeatedListState extends ContainerState implements RepeatedListWri */ public static class RepeatedListColumnState extends BaseContainerColumnState { - private final RepeatedListState listState; + private final ContainerState listState; public RepeatedListColumnState(LoaderInternals loader, AbstractObjectWriter writer, - RepeatedListVectorState vectorState, - RepeatedListState listState) { + VectorState vectorState, + ContainerState listState) { super(loader, writer, vectorState); this.listState = listState; listState.bindColumnState(this); @@ -80,14 +80,19 @@ public class RepeatedListState extends ContainerState implements RepeatedListWri private final ArrayWriter arrayWriter; private final RepeatedListVector vector; - private final OffsetVectorState offsetsState; + private final VectorState offsetsState; public RepeatedListVectorState(AbstractObjectWriter arrayWriter, RepeatedListVector vector) { this.vector = vector; this.arrayWriter = arrayWriter.array(); - offsetsState = new OffsetVectorState( - arrayWriter.events(), vector.getOffsetVector(), - this.arrayWriter.entryType() == null ? null : arrayWriter.events()); + if (vector == null) { + offsetsState = new NullVectorState(); + } else { + offsetsState = new OffsetVectorState( + arrayWriter.events(), + vector.getOffsetVector(), + this.arrayWriter.entryType() == null ? null : arrayWriter.events()); + } } /** @@ -99,7 +104,9 @@ public class RepeatedListState extends ContainerState implements RepeatedListWri * of the repeated list */ public void updateChildWriter(AbstractObjectWriter childWriter) { - offsetsState.setChildWriter(childWriter.events()); + if (offsetsState instanceof OffsetVectorState) { + ((OffsetVectorState) offsetsState).setChildWriter(childWriter.events()); + } } @SuppressWarnings("unchecked") @@ -175,7 +182,9 @@ public class RepeatedListState extends ContainerState implements RepeatedListWri // vector. final RepeatedListVectorState vectorState = (RepeatedListVectorState) parentColumn.vectorState(); final RepeatedListVector listVector = vectorState.vector; - listVector.setChildVector(childState.vector()); + if (listVector != null) { + listVector.setChildVector(childState.vector()); + } // The repeated list's offset vector state needs to know the offset // of the inner vector. Bind that information now that we have diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/resultSet/impl/ResultSetLoaderImpl.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/resultSet/impl/ResultSetLoaderImpl.java index dd5973c482..571c4d43d1 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/resultSet/impl/ResultSetLoaderImpl.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/resultSet/impl/ResultSetLoaderImpl.java @@ -284,7 +284,6 @@ public class ResultSetLoaderImpl implements ResultSetLoader, LoaderInternals { columnBuilder = new ColumnBuilder(); // Determine the root vector cache - ResultVectorCache vectorCache; if (options.vectorCache == null) { vectorCache = new NullResultVectorCacheImpl(allocator); @@ -293,20 +292,18 @@ public class ResultSetLoaderImpl implements ResultSetLoader, LoaderInternals { } // Build the row set model depending on whether a schema is provided. - rootState = new RowState(this, vectorCache); rootWriter = rootState.rootWriter(); // If no schema, columns will be added incrementally as they // are discovered. Start with an empty model. - if (options.schema != null) { // Schema provided. Populate a model (and create vectors) for the // provided schema. The schema can be extended later, but normally // won't be if known up front. - logger.debug("Schema: " + options.schema); + logger.debug("Schema: " + options.schema.toString()); BuildFromSchema.instance().buildTuple(rootWriter, options.schema); } diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/resultSet/impl/TestResultSetLoaderUnprojected.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/resultSet/impl/TestResultSetLoaderUnprojected.java index 50271cab8b..538a952695 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/resultSet/impl/TestResultSetLoaderUnprojected.java +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/resultSet/impl/TestResultSetLoaderUnprojected.java @@ -13,9 +13,9 @@ import org.apache.drill.exec.physical.resultSet.RowSetLoader; import org.apache.drill.exec.physical.resultSet.impl.ResultSetLoaderImpl.ResultSetOptions; import org.apache.drill.exec.physical.resultSet.project.Projections; import org.apache.drill.exec.physical.rowSet.RowSet; -import org.apache.drill.exec.physical.rowSet.RowSetTestUtils; import org.apache.drill.exec.physical.rowSet.RowSet.SingleRowSet; import org.apache.drill.exec.physical.rowSet.RowSetFormatter; +import org.apache.drill.exec.physical.rowSet.RowSetTestUtils; import org.apache.drill.exec.record.metadata.SchemaBuilder; import org.apache.drill.exec.record.metadata.TupleMetadata; import org.apache.drill.exec.vector.accessor.ArrayWriter; @@ -312,25 +312,128 @@ public class TestResultSetLoaderUnprojected extends SubOperatorTest { .addRow("2") .build(); RowSet actual = fixture.wrap(rsLoader.harvest()); - RowSetFormatter.print(actual); - RowSetFormatter.print(expected); RowSetUtilities.verify(expected, actual); rsLoader.close(); } + @Test public void testList() { + List<SchemaPath> selection = RowSetTestUtils.projectList("a"); + TupleMetadata schema = new SchemaBuilder() + .addList("a") + .addType(MinorType.INT) + .resumeSchema() + .addList("b") + .addType(MinorType.INT) + .resumeSchema() + .buildSchema(); + ResultSetOptions options = new ResultSetOptionBuilder() + .projection(Projections.parse(selection)) + .readerSchema(schema) + .build(); + ResultSetLoader rsLoader = new ResultSetLoaderImpl(fixture.allocator(), options); + RowSetLoader rootWriter = rsLoader.writer(); + TupleMetadata actualSchema = rootWriter.tupleSchema(); + assertEquals(2, actualSchema.size()); + assertEquals("a", actualSchema.column(0).getName()); + assertEquals("b", actualSchema.column(1).getName()); + assertTrue(rootWriter.column("a").isProjected()); + assertFalse(rootWriter.column("b").isProjected()); + rsLoader.startBatch(); + ArrayWriter aw = rootWriter.array(0); + ScalarWriter swa = aw.scalar(); + ArrayWriter bw = rootWriter.array(1); + ScalarWriter swb = bw.scalar(); + for (int i = 1; i < 3; i++) { + rootWriter.start(); + for (int j = 0; j < 3; j++) { + swa.setInt(i * 10 + j); + swb.setInt(i * 100 + j); + aw.save(); + bw.save(); + } + rootWriter.save(); + } + TupleMetadata expectedSchema = new SchemaBuilder() + .addList("a") + .addType(MinorType.INT) + .resumeSchema() + .buildSchema(); + SingleRowSet expected = fixture.rowSetBuilder(expectedSchema) + .addSingleCol(RowSetUtilities.listValue(10, 11, 12)) + .addSingleCol(RowSetUtilities.listValue(20, 21, 22)) + .build(); + RowSet actual = fixture.wrap(rsLoader.harvest()); + RowSetUtilities.verify(expected, actual); + rsLoader.close(); } + @Test public void test2DList() { + List<SchemaPath> selection = RowSetTestUtils.projectList("a"); + TupleMetadata schema = new SchemaBuilder() + .addRepeatedList("a") + .addArray(MinorType.INT) + .resumeSchema() + .addRepeatedList("b") + .addArray(MinorType.INT) + .resumeSchema() + .buildSchema(); + ResultSetOptions options = new ResultSetOptionBuilder() + .projection(Projections.parse(selection)) + .readerSchema(schema) + .build(); + ResultSetLoader rsLoader = new ResultSetLoaderImpl(fixture.allocator(), options); - } - - public void testDict() - { + RowSetLoader rootWriter = rsLoader.writer(); + TupleMetadata actualSchema = rootWriter.tupleSchema(); + assertEquals(2, actualSchema.size()); + assertEquals("a", actualSchema.column(0).getName()); + assertEquals("b", actualSchema.column(1).getName()); + assertTrue(rootWriter.column("a").isProjected()); + assertFalse(rootWriter.column("b").isProjected()); + rsLoader.startBatch(); + ArrayWriter aw = rootWriter.array(0); + ArrayWriter aw2 = aw.array(); + ScalarWriter swa = aw2.scalar(); + ArrayWriter bw = rootWriter.array(1); + ArrayWriter bw2 = bw.array(); + ScalarWriter swb = bw2.scalar(); + for (int i = 1; i < 3; i++) { + rootWriter.start(); + for (int j = 0; j < 3; j++) { + for (int k = 0; k < 3; k++) { + swa.setInt(i * 10 + j * 3 + k); + swb.setInt(i * 100 + j * 30 + k); + aw2.save(); + bw2.save(); + } + aw.save(); + bw.save(); + } + rootWriter.save(); + } + TupleMetadata expectedSchema = new SchemaBuilder() + .addRepeatedList("a") + .addArray(MinorType.INT) + .resumeSchema() + .buildSchema(); + SingleRowSet expected = fixture.rowSetBuilder(expectedSchema) + .addSingleCol(RowSetUtilities.listValue( + RowSetUtilities.listValue(10, 11, 12), + RowSetUtilities.listValue(13, 14, 15), + RowSetUtilities.listValue(16, 17, 18))) + .addSingleCol(RowSetUtilities.listValue( + RowSetUtilities.listValue(20, 21, 22), + RowSetUtilities.listValue(23, 24, 25), + RowSetUtilities.listValue(26, 27, 28))) + .build(); + RowSet actual = fixture.wrap(rsLoader.harvest()); + RowSetUtilities.verify(expected, actual); + rsLoader.close(); } - } diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/AbstractArrayWriter.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/AbstractArrayWriter.java index 994b6dbbf5..76541cc5a0 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/AbstractArrayWriter.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/AbstractArrayWriter.java @@ -32,6 +32,7 @@ import org.apache.drill.exec.vector.accessor.ScalarWriter; import org.apache.drill.exec.vector.accessor.TupleWriter; import org.apache.drill.exec.vector.accessor.VariantWriter; import org.apache.drill.exec.vector.accessor.impl.HierarchicalFormatter; +import org.apache.drill.exec.vector.accessor.writer.dummy.DummyArrayWriter.DummyOffsetVectorWriter; /** * Writer for an array-valued column. This writer appends values: once a value @@ -177,7 +178,8 @@ public abstract class AbstractArrayWriter implements ArrayWriter, WriterEvents { public static abstract class BaseArrayWriter extends AbstractArrayWriter { public BaseArrayWriter(ColumnMetadata schema, UInt4Vector offsetVector, AbstractObjectWriter elementObjWriter) { - super(schema, elementObjWriter, new OffsetVectorWriterImpl(offsetVector)); + super(schema, elementObjWriter, + offsetVector == null ? new DummyOffsetVectorWriter() : new OffsetVectorWriterImpl(offsetVector)); } @Override @@ -328,7 +330,7 @@ public abstract class AbstractArrayWriter implements ArrayWriter, WriterEvents { public boolean nullable() { return false; } @Override - public boolean isProjected() { return true; } + public boolean isProjected() { return offsetsWriter.isProjected(); } @Override public void setNull() { diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/ColumnWriterFactory.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/ColumnWriterFactory.java index f610473685..2124ca42ca 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/ColumnWriterFactory.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/ColumnWriterFactory.java @@ -130,8 +130,7 @@ public class ColumnWriterFactory { return scalarWriter; case REPEATED: return new ArrayObjectWriter( - new DummyArrayWriter(schema, - scalarWriter)); + new DummyArrayWriter(schema, scalarWriter)); default: throw new UnsupportedOperationException(schema.mode().toString()); } diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/ListWriterImpl.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/ListWriterImpl.java index cb26daa251..34aa551cf1 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/ListWriterImpl.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/ListWriterImpl.java @@ -20,8 +20,9 @@ package org.apache.drill.exec.vector.accessor.writer; import java.lang.reflect.Array; import org.apache.drill.exec.record.metadata.ColumnMetadata; -import org.apache.drill.exec.vector.accessor.ColumnWriterIndex; import org.apache.drill.exec.vector.accessor.ColumnAccessors.UInt1ColumnWriter; +import org.apache.drill.exec.vector.accessor.ColumnWriterIndex; +import org.apache.drill.exec.vector.accessor.writer.dummy.DummyScalarWriter; import org.apache.drill.exec.vector.complex.ListVector; import com.google.common.annotations.VisibleForTesting; @@ -32,16 +33,19 @@ import com.google.common.annotations.VisibleForTesting; * their indexes since the contents of lists can change dynamically, * and auto-increment is meaningful only for scalar arrays. */ - public class ListWriterImpl extends ObjectArrayWriter { private final ListVector vector; - private final UInt1ColumnWriter isSetWriter; + private final AbstractScalarWriterImpl isSetWriter; public ListWriterImpl(ColumnMetadata schema, ListVector vector, AbstractObjectWriter memberWriter) { - super(schema, vector.getOffsetVector(), memberWriter); + super(schema, vector == null ? null : vector.getOffsetVector(), memberWriter); this.vector = vector; - isSetWriter = new UInt1ColumnWriter(vector.getBitsVector()); + if (vector == null) { + isSetWriter = new DummyScalarWriter(null); + } else { + isSetWriter = new UInt1ColumnWriter(vector.getBitsVector()); + } elementIndex = new ArrayElementWriterIndex(); } diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/ObjectDictWriter.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/ObjectDictWriter.java index a845828f6e..6a58f12807 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/ObjectDictWriter.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/ObjectDictWriter.java @@ -60,33 +60,33 @@ public class ObjectDictWriter extends ObjectArrayWriter implements DictWriter { } } - public static ObjectDictWriter.DictObjectWriter buildDict(ColumnMetadata metadata, DictVector vector, + public static DictObjectWriter buildDict(ColumnMetadata metadata, DictVector vector, List<AbstractObjectWriter> keyValueWriters) { DictEntryWriter.DictEntryObjectWriter entryObjectWriter = DictEntryWriter.buildDictEntryWriter(metadata, keyValueWriters, vector); DictWriter objectDictWriter; - if (vector != null) { - objectDictWriter = new ObjectDictWriter(metadata, vector.getOffsetVector(), entryObjectWriter); - } else { + if (vector == null) { objectDictWriter = new DummyDictWriter(metadata, entryObjectWriter); + } else { + objectDictWriter = new ObjectDictWriter(metadata, vector.getOffsetVector(), entryObjectWriter); } - return new ObjectDictWriter.DictObjectWriter(objectDictWriter); + return new DictObjectWriter(objectDictWriter); } public static ArrayObjectWriter buildDictArray(ColumnMetadata metadata, RepeatedDictVector vector, List<AbstractObjectWriter> keyValueWriters) { final DictVector dataVector; - if (vector != null) { - dataVector = (DictVector) vector.getDataVector(); - } else { + if (vector == null) { dataVector = null; + } else { + dataVector = (DictVector) vector.getDataVector(); } ObjectDictWriter.DictObjectWriter dictWriter = buildDict(metadata, dataVector, keyValueWriters); AbstractArrayWriter arrayWriter; - if (vector != null) { - arrayWriter = new ObjectArrayWriter(metadata, vector.getOffsetVector(), dictWriter); - } else { + if (vector == null) { arrayWriter = new DummyArrayWriter(metadata, dictWriter); + } else { + arrayWriter = new ObjectArrayWriter(metadata, vector.getOffsetVector(), dictWriter); } return new ArrayObjectWriter(arrayWriter); } diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/RepeatedListWriter.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/RepeatedListWriter.java index 36d25fb4d4..728785d2ad 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/RepeatedListWriter.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/RepeatedListWriter.java @@ -42,7 +42,6 @@ import org.apache.drill.exec.vector.complex.RepeatedListVector; * list is a dummy, to be replaced by the real one once it is discovered * by reading data (or by parsing a schema.) */ - public class RepeatedListWriter extends ObjectArrayWriter { public interface ArrayListener { @@ -63,7 +62,7 @@ public class RepeatedListWriter extends ObjectArrayWriter { public static AbstractObjectWriter buildRepeatedList(ColumnMetadata schema, RepeatedListVector vector, AbstractObjectWriter elementWriter) { AbstractArrayWriter arrayWriter = new RepeatedListWriter(schema, - vector.getOffsetVector(), + vector == null ? null : vector.getOffsetVector(), elementWriter); return new ArrayObjectWriter(arrayWriter); } diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/ScalarArrayWriter.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/ScalarArrayWriter.java index cf7ef282ec..c0f4afcd9d 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/ScalarArrayWriter.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/ScalarArrayWriter.java @@ -182,6 +182,8 @@ public class ScalarArrayWriter extends BaseArrayWriter { setByteObjectArray((Byte[]) array); } else if (memberClassName.equals(Boolean.class.getName())) { setBooleanObjectArray((Boolean[]) array); + } else if (memberClassName.equals(Object.class.getName())) { + setObjectArray((Object[]) array); } else { throw new IllegalArgumentException( "Unknown Java array type: " + memberClassName ); } diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/SimpleListShim.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/SimpleListShim.java index 4721947f12..ae6f23b73c 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/SimpleListShim.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/SimpleListShim.java @@ -208,4 +208,9 @@ public class SimpleListShim implements UnionShim { colWriter.dump(format); format.endObject(); } + + @Override + public boolean isProjected() { + return true; + } } diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/UnionShim.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/UnionShim.java index f21bf18e52..5bdcb93fba 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/UnionShim.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/UnionShim.java @@ -48,6 +48,7 @@ public interface UnionShim extends WriterEvents { AbstractObjectWriter addMember(ColumnMetadata colSchema); AbstractObjectWriter addMember(MinorType type); void addMember(AbstractObjectWriter colWriter); + boolean isProjected(); public abstract class AbstractUnionShim implements UnionShim { diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/UnionVectorShim.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/UnionVectorShim.java index 7c5b6271d1..4a867163e8 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/UnionVectorShim.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/UnionVectorShim.java @@ -29,7 +29,6 @@ import org.apache.drill.exec.vector.accessor.impl.HierarchicalFormatter; import org.apache.drill.exec.vector.accessor.writer.AbstractFixedWidthWriter.BaseFixedWidthWriter; import org.apache.drill.exec.vector.accessor.writer.UnionMemberShim.DummyUnionMemberShim; import org.apache.drill.exec.vector.accessor.writer.UnionMemberShim.UnionMemberShimImpl; -import org.apache.drill.exec.vector.accessor.writer.UnionWriterImpl.UnionShim; import org.apache.drill.exec.vector.accessor.writer.dummy.DummyScalarWriter; import org.apache.drill.exec.vector.complex.UnionVector; diff --git a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/UnionWriterImpl.java b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/UnionWriterImpl.java index 33642cc770..6ee47381ac 100644 --- a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/UnionWriterImpl.java +++ b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/UnionWriterImpl.java @@ -55,31 +55,6 @@ import org.joda.time.Period; */ public class UnionWriterImpl implements VariantWriter, WriterEvents { - public interface UnionShim extends WriterEvents { - void bindWriter(UnionWriterImpl writer); - void setNull(); - boolean hasType(MinorType type); - - /** - * Return an existing writer for the given type, or create a new one - * if needed. - * - * @param type desired variant type - * @return a writer for that type - */ - - ObjectWriter member(MinorType type); - void setType(MinorType type); - @Override - int lastWriteIndex(); - @Override - int rowStartIndex(); - AbstractObjectWriter addMember(ColumnMetadata colSchema); - AbstractObjectWriter addMember(MinorType type); - void addMember(AbstractObjectWriter colWriter); - boolean isProjected(); - } - public static class VariantObjectWriter extends AbstractObjectWriter { private final UnionWriterImpl writer;