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;