package com.airbnb.airpal.api;
import com.airbnb.airpal.api.output.PersistentJobOutput;
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.fasterxml.jackson.annotation.*;
import com.google.common.collect.Sets;
import com.hubspot.rosetta.StoredAsJson;
import lombok.Data;
import lombok.experimental.Wither;
import org.joda.time.DateTime;
import java.util.List;
import java.util.Set;
import java.util.UUID;
@JsonIgnoreProperties(ignoreUnknown = true)
@Data
public class Job
{
@JsonProperty
@Wither
private final String user;
@JsonProperty
@Wither
private final String query;
@JsonProperty
@Wither
private final UUID uuid;
@JsonProperty
@Wither
private final PersistentJobOutput output;
@JsonProperty
@Wither
@StoredAsJson
private QueryStats queryStats;
@JsonProperty
@Wither
private JobState state;
@JsonProperty
@StoredAsJson
private List<Column> columns;
@JsonProperty
@Wither
private Set<Table> tablesUsed;
@JsonProperty
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
@Wither
private DateTime queryStarted = new DateTime();
@JsonProperty
@StoredAsJson
private QueryError error;
@JsonProperty
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
@Wither
private DateTime queryFinished;
@JsonCreator
public Job(@JsonProperty("user") final String user,
@JsonProperty("query") final String query,
@JsonProperty("uuid") final UUID uuid,
@JsonProperty("output") final PersistentJobOutput output,
@JsonProperty("queryStats") final QueryStats queryStats,
@JsonProperty("state") final JobState state,
@JsonProperty("columns") final List<Column> columns,
@JsonProperty("tablesUsed") final Set<Table> tablesUsed,
@JsonProperty("queryStarted") final DateTime queryStarted,
@JsonProperty("error") final QueryError error,
@JsonProperty("queryFinished") final DateTime queryFinished)
{
this.user = user;
this.query = query;
this.uuid = uuid;
this.output = output;
this.queryStats = queryStats;
this.state = state;
this.columns = columns;
this.tablesUsed = tablesUsed;
this.queryStarted = queryStarted;
this.error = error;
this.queryFinished = queryFinished;
}
public Job(final String user,
final String query,
final UUID uuid,
final PersistentJobOutput output,
final QueryStats stats,
final JobState state,
final List<Column> columns,
final QueryError error,
final DateTime queryFinished)
{
this(user,
query,
uuid,
output,
stats,
state,
columns,
Sets.<Table>newConcurrentHashSet(),
new DateTime(),
error,
queryFinished
);
}
@JsonIgnore
public DateTime getQueryFinishedDateTime()
{
return queryFinished;
}
@JsonIgnore
public DateTime getQueryStartedDateTime()
{
return queryStarted;
}
}