content: package com.airbnb.airpal.presto;
  
  import com.fasterxml.jackson.annotation.JsonProperty;
  import com.google.common.base.Function;
  import com.google.common.base.Splitter;
  import lombok.Getter;
  import lombok.ToString;
  
  import javax.annotation.Nullable;
  
  import java.util.List;
  
  @ToString
  public class PartitionedTable extends Table
  {
      private static Splitter TABLE_PART_SPLITTER = Splitter.on(".").omitEmptyStrings().trimResults();
  
      @Getter
      private final String partitionName;
  
      protected PartitionedTable(@JsonProperty("connectorId") String connectorId,
                                 @JsonProperty("schema") String schema,
                                 @JsonProperty("table") String table,
                                 @JsonProperty("partition") String partitionName,
                                 @JsonProperty("columns") List<String> columns) {
          super(connectorId, schema, table, columns);
          this.partitionName = partitionName;
      }
  
      public PartitionedTable(String connectorId,
                              String schema,
                              String table,
                              String partitionName) {
          super(connectorId, schema, table);
          this.partitionName = partitionName;
      }
  
      public PartitionedTable(String connectorId,
                              String schema,
                              String table) {
          this(connectorId,
               schema,
               table,
               null);
      }
  
      public PartitionedTable withPartitionName(String partitionName)
      {
          return new PartitionedTable(getConnectorId(),
                                      getSchema(),
                                      getTable(),
                                      partitionName,
                                      getColumns());
      }
  
      public static PartitionedTable fromTable(Table table)
      {
          return new PartitionedTable(table.getConnectorId(),
                                      table.getSchema(),
                                      table.getTable(),
                                      null,
                                      table.getColumns());
      }
  
      public Table asTable()
      {
          return new Table(getConnectorId(),
                           getSchema(),
                           getTable(),
                           getColumns());
      }
  
      @Override
      public int hashCode()
      {
          return getConnectorId().hashCode() +
                  getSchema().hashCode() +
                  getTable().hashCode() +
                  ((getTable() == null) ? 0 : getTable().hashCode());
      }
  
      @Override
      public boolean equals(Object obj)
      {
          if (obj instanceof PartitionedTable) {
              PartitionedTable otherTable = (PartitionedTable) obj;
  
              return getConnectorId().equals(otherTable.getConnectorId()) &&
                      getSchema().equals(otherTable.getSchema()) &&
                      getTable().equals(otherTable.getTable()) &&
                      partitionsSame(partitionName, otherTable.getPartitionName());
          } else {
              return false;
          }
      }
  
      public static boolean partitionsSame(String partition1, String partition2)
      {
          if ((partition1 == null) && (partition2 == null)) {
              return true;
          } else if (((partition1 == null) && (partition2 != null))
                  || ((partition1 != null) && (partition2 == null))) {
              return false;
          } else {
              return partition1.equals(partition2);
          }
      }
  
      public static PartitionedTable valueOf(String s)
      {
          List<String> parts = TABLE_PART_SPLITTER.splitToList(s);
  
          if (parts.size() == 4) {
              // String of the form hive.default.request_search.d=2013-11-20
              return new PartitionedTable(parts.get(0), parts.get(1), parts.get(2), parts.get(3));
          } else if (parts.size() == 3) {
              // String of the form hive.default.request_search
              return new PartitionedTable(parts.get(0), parts.get(1), parts.get(2));
          } else if (parts.size() == 2) {
              // String of the form default.request_search
              return new PartitionedTable("hive", parts.get(0), parts.get(1));
          } else {
              throw new IllegalArgumentException("Table identifier parts not found.");
          }
      }
  
      public static class PartitionedTableToTable implements Function<PartitionedTable, Table>
      {
          @Nullable
          @Override
          public Table apply(PartitionedTable input)
          {
              return input;
          }
      }
  }
  