package com.airbnb.airpal.presto;
import com.facebook.presto.execution.Column;
import com.facebook.presto.execution.Input;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableList;
import com.hubspot.rosetta.StoredAsJson;
import lombok.Data;
import lombok.ToString;
import javax.annotation.concurrent.Immutable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static com.google.common.base.Preconditions.checkNotNull;
@ToString
@Data
@Immutable
@JsonIgnoreProperties(ignoreUnknown = true)
public class Table
{
private static Splitter TABLE_PART_SPLITTER = Splitter.on(".").omitEmptyStrings().trimResults();
private static Joiner TABLE_PART_JOINER = Joiner.on(".").skipNulls();
private final String connectorId;
private final String schema;
private final String table;
@StoredAsJson
private final ImmutableList<String> columns;
@JsonCreator
protected Table(@JsonProperty("connectorId") String connectorId,
@JsonProperty("schema") String schema,
@JsonProperty("table") String table,
@JsonProperty("columns") List<String> columns)
{
this.connectorId = checkNotNull(connectorId, "connectorId is null");
this.schema = checkNotNull(schema, "schema is null");
this.table = checkNotNull(table, "table is null");
this.columns = ImmutableList.copyOf(checkNotNull(columns, "columns is null"));
}
public Table(String connectorId,
String schema,
String table)
{
this(connectorId, schema, table, Collections.<String>emptyList());
}
public static Table valueOf(String s)
{
List<String> parts = TABLE_PART_SPLITTER.splitToList(s);
if (parts.size() == 3) {
return new Table(parts.get(0), parts.get(1), parts.get(2));
}
else if (parts.size() == 2) {
return new Table("hive", parts.get(0), parts.get(1));
}
else {
throw new IllegalArgumentException("Table identifier parts not found.");
}
}
public static Table fromInput(Input input)
{
List<String> columns = new ArrayList<>(input.getColumns().size());
for (Column c : input.getColumns()) {
columns.add(c.getName());
}
return new Table(input.getConnectorId(), input.getSchema(), input.getTable(), columns);
}
@JsonProperty("fqn")
public String getFqn()
{
return TABLE_PART_JOINER.join(getConnectorId(), getSchema(), getTable());
}
@Override
public int hashCode()
{
int result = getConnectorId().hashCode();
result = 31 * result + getSchema().hashCode();
result = 31 * result + getTable().hashCode();
return result;
}
@Override
public boolean equals(Object obj)
{
if (obj == this) {
return true;
}
if (obj == null) {
return false;
}
if (obj instanceof Input) {
Input other = (Input)obj;
return getConnectorId().equals(other.getConnectorId()) &&
getSchema().equals(other.getSchema()) &&
getTable().equals(other.getTable());
} else if (obj instanceof Table) {
Table other = (Table)obj;
return getConnectorId().equals(other.getConnectorId()) &&
getSchema().equals(other.getSchema()) &&
getTable().equals(other.getTable());
}
return false;
}
}