package com.airbnb.airpal.sql.beans;
import com.airbnb.airpal.presto.Table;
import com.facebook.presto.client.Column;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Function;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.tweak.ResultSetMapper;
import javax.annotation.Nullable;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import static com.google.common.base.Preconditions.checkNotNull;
@Data
@AllArgsConstructor
public class TableRow
{
private long id;
private String connectorId;
private String schema;
private String table;
private List<Column> columns;
public static MapToTable MAP_TO_TABLE = new MapToTable();
public static class MapToTable implements Function<TableRow, Table>
{
@Nullable
@Override
public Table apply(@Nullable TableRow input)
{
checkNotNull(input, "input was null");
return new Table(input.getConnectorId(), input.getSchema(), input.getTable());
}
}
@Slf4j
public static class TableRowMapper implements ResultSetMapper<TableRow>
{
private final ObjectMapper objectMapper;
private final TypeReference<List<Column>> columnTypeReference;
public TableRowMapper(ObjectMapper objectMapper)
{
this.objectMapper = objectMapper;
this.columnTypeReference = new TypeReference<List<Column>>() {};
}
@Override
public TableRow map(int index, ResultSet r, StatementContext ctx)
throws SQLException
{
try {
return new TableRow(
r.getLong("id"),
r.getString("connector_id"),
r.getString("schema_"),
r.getString("table_"),
objectMapper.<List<Column>>readValue(r.getString("columns"), columnTypeReference));
}
catch (IOException e) {
log.error("Caught exception mapping TableRow", e);
return null;
}
}
}
}