http://git-wip-us.apache.org/repos/asf/drill/blob/cf2478f7/exec/vector/src/main/java/org/apache/drill/exec/record/metadata/VariantMetadata.java
----------------------------------------------------------------------
diff --git 
a/exec/vector/src/main/java/org/apache/drill/exec/record/metadata/VariantMetadata.java
 
b/exec/vector/src/main/java/org/apache/drill/exec/record/metadata/VariantMetadata.java
new file mode 100644
index 0000000..d01f292
--- /dev/null
+++ 
b/exec/vector/src/main/java/org/apache/drill/exec/record/metadata/VariantMetadata.java
@@ -0,0 +1,177 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.drill.exec.record.metadata;
+
+import java.util.Collection;
+
+import org.apache.drill.common.types.TypeProtos.MinorType;
+
+/**
+ * Describes the contents of a list or union field. Such fields are,
+ * in effect, a map from minor type to vector, represented here as
+ * a map from minor type to column metadata. The child columns used here
+ * are a useful fiction. The column name is made up to be the same as
+ * the name of the type.
+ * <p>
+ * In Drill, a union and a list are related, but distinct. In metadata,
+ * a union is an optional variant while a list is a variant array.
+ * This makes the representation simpler
+ * and should be a good-enough approximation of reality.
+ * <p>
+ * Variants can contain three kinds of children:
+ * <ul>
+ * <li>Nullable (optional) scalar vectors.</li>
+ * <li>Non-nullable (required) map.</li>
+ * <li>Nullable (optional) list.</li>
+ * </ul>
+ * <p>
+ * A union cannot contain a repeated vector. Instead, the
+ * union can contain a list. Note also that maps can never be optional,
+ * so they are required in the union, even though the map is, in effect,
+ * optional (the map is effectively null if it is not used for a give
+ * row.) Yes, this is confusing, but it is how the vectors are
+ * implemented (for now.)
+ * <p>
+ * A list type is modeled here as a repeated union type. This is not
+ * entirely accurate, but it is another useful fiction. (In actual
+ * implementation, a list is either a single type, or a array of
+ * unions. This detail is abstracted away here.)
+ * <p>
+ * In vector implementation, unions declare their member types, but
+ * lists don't. Here, both types declare their member types. (Another
+ * useful fiction.)
+ * <p>
+ * A union or list can contain a map. Maps have structure. To support this,
+ * the metadata allows adding a map column that contains the map structure.
+ * Such metadata exist only in this system; it is not easily accessible in
+ * the vector implementation.
+ * <p>
+ * A union or list can contain a list (though not a union.) As described
+ * here, lists can have structure, and so, like maps, can be built using
+ * a column that provides that structure.
+ * <p>
+ * Note that the Drill {@link MinorType#UNION UNION} and
+ * {@link MinorType#LIST LIST} implementations are considered experimental
+ * and are not generally enabled. As a result, this metadata schema must
+ * also be considered experimental and subject to change.
+ */
+
+public interface VariantMetadata {
+
+  /**
+   * Add any supported type to the variant.
+   * <p>
+   * At present, the union
+   * vector does not support the decimal types. This class does not
+   * reject such types; but they will cause a runtime exception when
+   * code asks the union vector for these types.
+   *
+   * @param type type to add
+   * @return the "virtual" column for that type
+   * @throws IllegalArgumentException if the type has already been
+   * added
+   */
+
+  ColumnMetadata addType(MinorType type);
+
+  /**
+   * Add a column for any supported type to the variant.
+   * Use this to add structure to a list or map member.
+   *
+   * @param col column to add. The column must have the correct
+   * mode. The column's type is used as the type key
+   * @throws IllegalArgumentException if the type has already been
+   * added, or if the mode is wrong
+   */
+
+  void addType(ColumnMetadata col);
+
+  /**
+   * Returns the number of types in the variant.
+   *
+   * @return the number of types in the variant
+   */
+
+  int size();
+
+  /**
+   * Determine if the given type is a member of the variant.
+   *
+   * @param type type to check
+   * @return <tt>true</tt> if the type is a member,
+   * <tt>false</tt> if not
+   */
+
+  boolean hasType(MinorType type);
+
+  /**
+   * Returns the list of types which are members of this variant.
+   *
+   * @return the list of types
+   */
+
+  Collection<MinorType> types();
+
+  Collection<ColumnMetadata> members();
+
+  /**
+   * Retrieve the virtual column for a given type.
+   *
+   * @param type the type key
+   * @return the virtual column, or <tt>null</tt> if the type
+   * is not a member of the variant
+   */
+
+  ColumnMetadata member(MinorType type);
+
+  /**
+   * Return the column that defines this variant structure
+   *
+   * @return the column that returns this variant structure
+   * from its {@link ColumnMetadata#variantSchema() variantSchema()}
+   * method
+   */
+
+  ColumnMetadata parent();
+
+  /**
+   * A list is defined as a list of variants at the metadata layer.
+   * But, in implementation, a list will do special processing if the
+   * variant (union) contains only one type.
+   *
+   * @return <tt>true</tt> if this variant contains only one type,
+   * </tt>false</tt> if the variant contains 0, 2 or more types
+   */
+
+  boolean isSingleType();
+
+  /**
+   * Lists are odd creatures: they contain a union if they have more
+   * than one subtype, but are like a nullable repeated type if they
+   * contain only one type. This method returns the type of the array:
+   * either the single type (if {@link #isSingleType()} is <tt>true</tt>)
+   * or a reference to the synthetic union column nested inside the
+   * list.
+   * @return the metadata for the implicit column within the list
+   */
+
+  ColumnMetadata listSubtype();
+
+  void becomeSimple();
+  boolean isSimple();
+}

http://git-wip-us.apache.org/repos/asf/drill/blob/cf2478f7/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ObjectWriter.java
----------------------------------------------------------------------
diff --git 
a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ObjectWriter.java
 
b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ObjectWriter.java
index a49b0d8..113778f 100644
--- 
a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ObjectWriter.java
+++ 
b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/ObjectWriter.java
@@ -17,7 +17,7 @@
  */
 package org.apache.drill.exec.vector.accessor;
 
-import org.apache.drill.exec.record.ColumnMetadata;
+import org.apache.drill.exec.record.metadata.ColumnMetadata;
 import org.apache.drill.exec.vector.accessor.ScalarWriter.ColumnWriterListener;
 import org.apache.drill.exec.vector.accessor.TupleWriter.TupleWriterListener;
 

http://git-wip-us.apache.org/repos/asf/drill/blob/cf2478f7/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/TupleReader.java
----------------------------------------------------------------------
diff --git 
a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/TupleReader.java
 
b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/TupleReader.java
index 908d6a0..8d691c3 100644
--- 
a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/TupleReader.java
+++ 
b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/TupleReader.java
@@ -17,7 +17,7 @@
  */
 package org.apache.drill.exec.vector.accessor;
 
-import org.apache.drill.exec.record.TupleMetadata;
+import org.apache.drill.exec.record.metadata.TupleMetadata;
 
 /**
  * Interface for reading from tuples (rows or maps). Provides

http://git-wip-us.apache.org/repos/asf/drill/blob/cf2478f7/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/TupleWriter.java
----------------------------------------------------------------------
diff --git 
a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/TupleWriter.java
 
b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/TupleWriter.java
index 056c9b3..0a52283 100644
--- 
a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/TupleWriter.java
+++ 
b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/TupleWriter.java
@@ -17,9 +17,9 @@
  */
 package org.apache.drill.exec.vector.accessor;
 
-import org.apache.drill.exec.record.ColumnMetadata;
 import org.apache.drill.exec.record.MaterializedField;
-import org.apache.drill.exec.record.TupleMetadata;
+import org.apache.drill.exec.record.metadata.ColumnMetadata;
+import org.apache.drill.exec.record.metadata.TupleMetadata;
 
 /**
  * Writer for a tuple. A tuple is composed of columns with a fixed order and

http://git-wip-us.apache.org/repos/asf/drill/blob/cf2478f7/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/reader/AbstractTupleReader.java
----------------------------------------------------------------------
diff --git 
a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/reader/AbstractTupleReader.java
 
b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/reader/AbstractTupleReader.java
index afa0cb7..0429f3e 100644
--- 
a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/reader/AbstractTupleReader.java
+++ 
b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/reader/AbstractTupleReader.java
@@ -20,7 +20,7 @@ package org.apache.drill.exec.vector.accessor.reader;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.drill.exec.record.TupleMetadata;
+import org.apache.drill.exec.record.metadata.TupleMetadata;
 import org.apache.drill.exec.vector.accessor.ArrayReader;
 import org.apache.drill.exec.vector.accessor.ColumnReaderIndex;
 import org.apache.drill.exec.vector.accessor.ObjectReader;

http://git-wip-us.apache.org/repos/asf/drill/blob/cf2478f7/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/reader/MapReader.java
----------------------------------------------------------------------
diff --git 
a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/reader/MapReader.java
 
b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/reader/MapReader.java
index 66bc067..900e0a7 100644
--- 
a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/reader/MapReader.java
+++ 
b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/reader/MapReader.java
@@ -19,7 +19,7 @@ package org.apache.drill.exec.vector.accessor.reader;
 
 import java.util.List;
 
-import org.apache.drill.exec.record.ColumnMetadata;
+import org.apache.drill.exec.record.metadata.ColumnMetadata;
 
 /**
  * Reader for a Drill Map type. Maps are actually tuples, just like rows.

http://git-wip-us.apache.org/repos/asf/drill/blob/cf2478f7/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/AbstractArrayWriter.java
----------------------------------------------------------------------
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 e6e29b4..58cda57 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
@@ -17,7 +17,7 @@
  */
 package org.apache.drill.exec.vector.accessor.writer;
 
-import org.apache.drill.exec.record.ColumnMetadata;
+import org.apache.drill.exec.record.metadata.ColumnMetadata;
 import org.apache.drill.exec.vector.UInt4Vector;
 import org.apache.drill.exec.vector.accessor.ArrayWriter;
 import org.apache.drill.exec.vector.accessor.ColumnWriterIndex;

http://git-wip-us.apache.org/repos/asf/drill/blob/cf2478f7/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/AbstractObjectWriter.java
----------------------------------------------------------------------
diff --git 
a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/AbstractObjectWriter.java
 
b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/AbstractObjectWriter.java
index a8f1c64..15807cb 100644
--- 
a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/AbstractObjectWriter.java
+++ 
b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/AbstractObjectWriter.java
@@ -17,7 +17,7 @@
  */
 package org.apache.drill.exec.vector.accessor.writer;
 
-import org.apache.drill.exec.record.ColumnMetadata;
+import org.apache.drill.exec.record.metadata.ColumnMetadata;
 import org.apache.drill.exec.vector.accessor.ArrayWriter;
 import org.apache.drill.exec.vector.accessor.ObjectWriter;
 import org.apache.drill.exec.vector.accessor.ScalarWriter;

http://git-wip-us.apache.org/repos/asf/drill/blob/cf2478f7/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/AbstractScalarWriter.java
----------------------------------------------------------------------
diff --git 
a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/AbstractScalarWriter.java
 
b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/AbstractScalarWriter.java
index c02e2d9..b6a85d7 100644
--- 
a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/AbstractScalarWriter.java
+++ 
b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/AbstractScalarWriter.java
@@ -19,7 +19,7 @@ package org.apache.drill.exec.vector.accessor.writer;
 
 import java.math.BigDecimal;
 
-import org.apache.drill.exec.record.ColumnMetadata;
+import org.apache.drill.exec.record.metadata.ColumnMetadata;
 import org.apache.drill.exec.vector.BaseDataValueVector;
 import org.apache.drill.exec.vector.accessor.ObjectType;
 import org.apache.drill.exec.vector.accessor.ScalarWriter;

http://git-wip-us.apache.org/repos/asf/drill/blob/cf2478f7/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/AbstractTupleWriter.java
----------------------------------------------------------------------
diff --git 
a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/AbstractTupleWriter.java
 
b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/AbstractTupleWriter.java
index 1fd12f2..938f867 100644
--- 
a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/AbstractTupleWriter.java
+++ 
b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/AbstractTupleWriter.java
@@ -20,9 +20,9 @@ package org.apache.drill.exec.vector.accessor.writer;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.drill.exec.record.ColumnMetadata;
 import org.apache.drill.exec.record.MaterializedField;
-import org.apache.drill.exec.record.TupleMetadata;
+import org.apache.drill.exec.record.metadata.ColumnMetadata;
+import org.apache.drill.exec.record.metadata.TupleMetadata;
 import org.apache.drill.exec.vector.accessor.ArrayWriter;
 import org.apache.drill.exec.vector.accessor.ColumnWriterIndex;
 import org.apache.drill.exec.vector.accessor.ObjectType;

http://git-wip-us.apache.org/repos/asf/drill/blob/cf2478f7/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/ColumnWriterFactory.java
----------------------------------------------------------------------
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 5a1187a..30811bb 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
@@ -24,7 +24,7 @@ import java.util.List;
 
 import org.apache.drill.common.types.TypeProtos.MajorType;
 import org.apache.drill.common.types.TypeProtos.MinorType;
-import org.apache.drill.exec.record.ColumnMetadata;
+import org.apache.drill.exec.record.metadata.ColumnMetadata;
 import org.apache.drill.exec.vector.NullableVector;
 import org.apache.drill.exec.vector.UInt4Vector;
 import org.apache.drill.exec.vector.ValueVector;

http://git-wip-us.apache.org/repos/asf/drill/blob/cf2478f7/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/MapWriter.java
----------------------------------------------------------------------
diff --git 
a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/MapWriter.java
 
b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/MapWriter.java
index 8aec301..af8daba 100644
--- 
a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/MapWriter.java
+++ 
b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/MapWriter.java
@@ -19,7 +19,7 @@ package org.apache.drill.exec.vector.accessor.writer;
 
 import java.util.List;
 
-import org.apache.drill.exec.record.ColumnMetadata;
+import org.apache.drill.exec.record.metadata.ColumnMetadata;
 import org.apache.drill.exec.vector.accessor.ColumnWriterIndex;
 import org.apache.drill.exec.vector.complex.MapVector;
 

http://git-wip-us.apache.org/repos/asf/drill/blob/cf2478f7/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/NullableScalarWriter.java
----------------------------------------------------------------------
diff --git 
a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/NullableScalarWriter.java
 
b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/NullableScalarWriter.java
index 2068304..c5f7982 100644
--- 
a/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/NullableScalarWriter.java
+++ 
b/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/NullableScalarWriter.java
@@ -19,7 +19,7 @@ package org.apache.drill.exec.vector.accessor.writer;
 
 import java.math.BigDecimal;
 
-import org.apache.drill.exec.record.ColumnMetadata;
+import org.apache.drill.exec.record.metadata.ColumnMetadata;
 import org.apache.drill.exec.vector.BaseDataValueVector;
 import org.apache.drill.exec.vector.NullableVector;
 import org.apache.drill.exec.vector.accessor.ColumnAccessors.UInt1ColumnWriter;

http://git-wip-us.apache.org/repos/asf/drill/blob/cf2478f7/exec/vector/src/main/java/org/apache/drill/exec/vector/accessor/writer/ScalarArrayWriter.java
----------------------------------------------------------------------
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 95f8f29..8382ad1 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
@@ -19,7 +19,7 @@ package org.apache.drill.exec.vector.accessor.writer;
 
 import java.math.BigDecimal;
 
-import org.apache.drill.exec.record.ColumnMetadata;
+import org.apache.drill.exec.record.metadata.ColumnMetadata;
 import org.apache.drill.exec.vector.accessor.ColumnWriterIndex;
 import org.apache.drill.exec.vector.accessor.ScalarWriter.ColumnWriterListener;
 import 
org.apache.drill.exec.vector.accessor.writer.AbstractArrayWriter.BaseArrayWriter;

Reply via email to