code: private String join(List<TaskInfo> taskInfoList) throws Exception {
      // get the job definition
      JobDefinition<JobConfig, Serializable, Serializable> definition =
          JobDefinitionRegistry.INSTANCE.getJobDefinition(mJobInfo.getJobConfig());
      Map<WorkerInfo, Serializable> taskResults = Maps.newHashMap();
      for (TaskInfo taskInfo : taskInfoList) {
        taskResults.put(mTaskIdToWorkerInfo.get(taskInfo.getTaskId()), taskInfo.getResult());
      }
      return definition.join(mJobInfo.getJobConfig(), taskResults);
    }
docs: Joins the task results and produces a final result.
  
  @param taskInfoList the list of task information
  @return the aggregated result as a String
  @throws Exception if any error occurs