code: public AnalysisResultFuture run() {
          try {
              // the injection manager is job scoped
              final InjectionManager injectionManager = _configuration.getEnvironment().getInjectionManagerFactory()
                      .getInjectionManager(_configuration, _job);
  
              final LifeCycleHelper rowProcessingLifeCycleHelper =
                      new LifeCycleHelper(injectionManager, _includeNonDistributedTasks);
  
              final RowProcessingPublishers publishers =
                      new RowProcessingPublishers(_job, _analysisListener, _errorAware, _taskRunner,
                              rowProcessingLifeCycleHelper);
  
              final AnalysisJobMetrics analysisJobMetrics = publishers.getAnalysisJobMetrics();
  
              // A task listener that will register either succesfull executions
              // or unexpected errors (which will be delegated to the
              // errorListener)
              final JobCompletionTaskListener jobCompletionTaskListener =
                      new JobCompletionTaskListener(analysisJobMetrics, _analysisListener, 1);
  
              _analysisListener.jobBegin(_job, analysisJobMetrics);
  
              validateSingleTableInput(_job);
  
              // at this point we are done validating the job, it will run.
              scheduleRowProcessing(publishers, rowProcessingLifeCycleHelper, jobCompletionTaskListener,
                      analysisJobMetrics);
  
              return new AnalysisResultFutureImpl(_resultQueue, jobCompletionTaskListener, _errorAware);
          } catch (final RuntimeException e) {
              _analysisListener.errorUnknown(_job, e);
              throw e;
          }
  
      }
docs: Runs the job
  
  @return