@Override
  public <SuppliedValue, Result> Result aggregate(
      Supplier<K, V, SuppliedValue> supplier,
      Aggregation<K, SuppliedValue, Result> aggregation,
      JobTracker jobTracker) {

    try {
      Preconditions.isNotNull(jobTracker, "jobTracker");
      KeyValueSource<K, V> keyValueSource = KeyValueSource.fromMultiMap(this);
      Job<K, V> job = jobTracker.newJob(keyValueSource);
      Mapper mapper = aggregation.getMapper(supplier);
      CombinerFactory combinerFactory = aggregation.getCombinerFactory();
      ReducerFactory reducerFactory = aggregation.getReducerFactory();
      Collator collator = aggregation.getCollator();

      MappingJob mappingJob = job.mapper(mapper);
      ReducingSubmittableJob reducingJob;
      if (combinerFactory != null) {
        reducingJob = mappingJob.combiner(combinerFactory).reducer(reducerFactory);
      } else {
        reducingJob = mappingJob.reducer(reducerFactory);
      }

      ICompletableFuture<Result> future = reducingJob.submit(collator);
      return future.get();
    } catch (Exception e) {
      throw new HazelcastException(e);
    }
  }