protected void traversDetailWithOutCheckpoint() {
    final List<Phase> phases = batchPhaseList;

    while (detailSplitter.hasNextRow()) {
      for (Phase phase : phases) {
        context.setCurrentPhaseId(phase.getName());
        feedJobManager.startPhaseStats(phase, context);
        phase.execute();
        feedJobManager.endPhaseStats(phase, context);
      }
    }
  }
  protected void traversDetailWithCheckpoint(FeedCheckpoint checkpoint) {
    final List<Phase> phases = batchPhaseList;

    // Determine if a checkpoint has been created and if so, move to it.
    Boolean movingToCheckpoint = performCheckpoint(detailSplitter, checkpoint);

    while (detailSplitter.hasNextRow()) {
      for (Phase phase : phases) {
        // Bypass phases processing when restart from a checkpoint.
        if (!movingToCheckpoint) {
          context.setCurrentPhaseId(phase.getName());
          feedJobManager.startPhaseStats(phase, context);
          phase.execute();
          feedJobManager.endPhaseStats(phase, context);
        }

        // Checkpoint restart has be reached.
        if (movingToCheckpoint && checkpoint.getPhaseId().equals(phase.getName())) {
          movingToCheckpoint = false;
        }
      }
    }
  }