blob: 33514d59d6a71fa72fda2d81032822882b902ae8 [file] [log] [blame]
/*
* 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 org.apache.drill.common.types.TypeProtos.DataMode;
import org.apache.drill.common.types.TypeProtos.MajorType;
import org.apache.drill.common.types.TypeProtos.MinorType;
import org.apache.drill.exec.record.MaterializedField;
/**
* Internal tuple builder shared by the schema and map builders.
* Those two classes can't inherit from this class because their
* versions of the "add" methods return themselves to allow fluent
* construction.
*/
public class TupleBuilder implements SchemaContainer {
private final TupleSchema schema = new TupleSchema();
@Override
public void addColumn(ColumnMetadata column) {
schema.add(column);
}
public void add(String name, MajorType type) {
add(MaterializedField.create(name, type));
}
public void add(MaterializedField col) {
schema.add(col);
}
public void add(String name, MinorType type, DataMode mode) {
add(SchemaBuilder.columnSchema(name, type, mode));
}
public void add(String name, MinorType type) {
add(name, type, DataMode.REQUIRED);
}
public void add(String name, MinorType type, int width) {
MaterializedField field = new ColumnBuilder(name, type)
.setMode(DataMode.REQUIRED)
.setWidth(width)
.build();
add(field);
}
public void addNullable(String name, MinorType type) {
add(name, type, DataMode.OPTIONAL);
}
public void addNullable(String name, MinorType type, int width) {
MaterializedField field = new ColumnBuilder(name, type)
.setMode(DataMode.OPTIONAL)
.setWidth(width)
.build();
add(field);
}
public void addArray(String name, MinorType type) {
add(name, type, DataMode.REPEATED);
}
public void addDecimal(String name, MinorType type, DataMode mode, int precision, int scale) {
MaterializedField field = new ColumnBuilder(name, type)
.setMode(mode)
.setPrecisionAndScale(precision, scale)
.build();
add(field);
}
/**
* Add a multi-dimensional array, implemented as a repeated vector
* along with 0 or more repeated list vectors.
*
* @param name column name
* @param type base data type
* @param dims number of dimensions, 1 or more
*/
public void addArray(String name, MinorType type, int dims) {
assert dims >= 1;
if (dims == 1) {
addArray(name, type);
return;
}
RepeatedListBuilder listBuilder = addRepeatedList(this, name);
buildMultiDimArray(listBuilder, type, dims - 1);
listBuilder.build();
}
private void buildMultiDimArray(RepeatedListBuilder listBuilder,
MinorType type, int dims) {
if (dims == 1) {
listBuilder.addArray(type);
} else {
RepeatedListBuilder childBuilder = listBuilder.addDimension();
buildMultiDimArray(childBuilder, type, dims - 1);
childBuilder.build();
}
}
/**
* Add a map column. The returned schema builder is for the nested
* map. Building that map, using {@link MapBuilder#resumeSchema()},
* will return the original schema builder.
*
* @param parent schema container
* @param name the name of the map column
* @return a builder for the map
*/
public MapBuilder addMap(SchemaContainer parent, String name) {
return new MapBuilder(parent, name, DataMode.REQUIRED);
}
public MapBuilder addMapArray(SchemaContainer parent, String name) {
return new MapBuilder(parent, name, DataMode.REPEATED);
}
public DictBuilder addDict(SchemaContainer parent, String name) {
return new DictBuilder(parent, name, DataMode.REQUIRED);
}
public DictBuilder addDictArray(SchemaContainer parent, String name) {
return new DictBuilder(parent, name, DataMode.REPEATED);
}
public UnionBuilder addUnion(SchemaContainer parent, String name) {
return new UnionBuilder(parent, name, MinorType.UNION);
}
public UnionBuilder addList(SchemaContainer parent, String name) {
return new UnionBuilder(parent, name, MinorType.LIST);
}
public RepeatedListBuilder addRepeatedList(SchemaContainer parent, String name) {
return new RepeatedListBuilder(parent, name);
}
public TupleSchema schema() {
return schema;
}
}