content: 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;
          }
      }
  }
  