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;

Reply via email to