package com.airbnb.airpal.sql.beans;
import com.airbnb.airpal.api.Job;
import com.airbnb.airpal.api.JobState;
import com.airbnb.airpal.api.output.PersistentJobOutput;
import com.airbnb.airpal.api.output.PersistentJobOutputFactory;
import com.airbnb.airpal.presto.Table;
import com.facebook.presto.client.Column;
import com.facebook.presto.client.QueryError;
import com.facebook.presto.execution.QueryStats;
import com.hubspot.rosetta.StoredAsJson;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.skife.jdbi.v2.FoldController;
import org.skife.jdbi.v2.Folder3;
import org.skife.jdbi.v2.StatementContext;
import java.net.URI;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@Slf4j
@Data
public class JobTableOutputJoinRow
{
private long id;
private String query;
private String user;
private UUID uuid;
@StoredAsJson
private QueryStats queryStats;
private JobState state;
@StoredAsJson
private List<Column> columns;
private DateTime queryFinished;
private DateTime queryStarted;
@StoredAsJson
private QueryError error;
private String connectorId;
private String schema;
private String table;
private String type;
private String description;
private URI location;
public PersistentJobOutput getJobOutput()
{
return PersistentJobOutputFactory.create(getType(), getDescription(), getLocation());
}
public static class JobFolder implements Folder3<Map<Long, Job>, JobTableOutputJoinRow>
{
@Override
public Map<Long, Job> fold(
Map<Long, Job> accumulator,
JobTableOutputJoinRow rs,
FoldController control,
StatementContext ctx)
throws SQLException
{
if (!accumulator.containsKey(rs.getId())) {
accumulator.put(
rs.getId(),
new Job(
rs.getUser(),
rs.getQuery(),
rs.getUuid(),
rs.getJobOutput(),
rs.getQueryStats(),
rs.getState(),
rs.getColumns(),
new HashSet<Table>(),
rs.getQueryStarted(),
rs.getError(),
rs.getQueryFinished()));
}
Job job = accumulator.get(rs.getId());
if (rs.getConnectorId() != null && rs.getSchema() != null && rs.getTable() != null) {
job.getTablesUsed().add(new Table(rs.getConnectorId(), rs.getSchema(), rs.getTable()));
}
return accumulator;
}
}
}