/*
* Licensed 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 com.facebook.presto.raptor.metadata;
import com.facebook.presto.spi.ColumnMetadata;
import com.facebook.presto.spi.SchemaTableName;
import com.facebook.presto.spi.type.Type;
import com.facebook.presto.spi.type.TypeManager;
import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.tweak.ResultSetMapper;
import javax.inject.Inject;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.OptionalInt;
import static com.facebook.presto.raptor.util.DatabaseUtil.getOptionalInt;
import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature;
import static com.google.common.base.MoreObjects.toStringHelper;
import static com.google.common.base.Preconditions.checkArgument;
import static java.util.Objects.requireNonNull;
public class TableColumn
{
private final SchemaTableName table;
private final String columnName;
private final Type dataType;
private final long columnId;
private final OptionalInt bucketOrdinal;
private final OptionalInt sortOrdinal;
private final boolean temporal;
public TableColumn(SchemaTableName table, String columnName, Type dataType, long columnId, OptionalInt bucketOrdinal, OptionalInt sortOrdinal, boolean temporal)
{
this.table = requireNonNull(table, "table is null");
this.columnName = requireNonNull(columnName, "columnName is null");
this.dataType = requireNonNull(dataType, "dataType is null");
this.columnId = columnId;
this.bucketOrdinal = requireNonNull(bucketOrdinal, "bucketOrdinal is null");
this.sortOrdinal = requireNonNull(sortOrdinal, "sortOrdinal is null");
this.temporal = temporal;
}
public SchemaTableName getTable()
{
return table;
}
public String getColumnName()
{
return columnName;
}
public Type getDataType()
{
return dataType;
}
public long getColumnId()
{
return columnId;
}
public OptionalInt getBucketOrdinal()
{
return bucketOrdinal;
}
public OptionalInt getSortOrdinal()
{
return sortOrdinal;
}
public boolean isTemporal()
{
return temporal;
}
@Override
public String toString()
{
return toStringHelper(this)
.add("table", table)
.add("columnId", columnId)
.add("columnName", columnName)
.add("dataType", dataType)
.toString();
}
public ColumnMetadata toColumnMetadata()
{
return new ColumnMetadata(columnName, dataType);
}
public ColumnInfo toColumnInfo()
{
return new ColumnInfo(columnId, dataType);
}
public static class Mapper
implements ResultSetMapper<TableColumn>
{
private final TypeManager typeManager;
@Inject
public Mapper(TypeManager typeManager)
{
this.typeManager = requireNonNull(typeManager, "typeManager is null");
}
@Override
public TableColumn map(int index, ResultSet r, StatementContext ctx)
throws SQLException
{
SchemaTableName table = new SchemaTableName(
r.getString("schema_name"),
r.getString("table_name"));
String typeName = r.getString("data_type");
Type type = typeManager.getType(parseTypeSignature(typeName));
checkArgument(type != null, "Unknown type %s", typeName);
return new TableColumn(
table,
r.getString("column_name"),
type,
r.getLong("column_id"),
getOptionalInt(r, "bucket_ordinal_position"),
getOptionalInt(r, "sort_ordinal_position"),
r.getBoolean("temporal"));
}
}
}