@Override
    protected Aggregator doCreateInternal(
        ValuesSource valuesSource,
        AggregationContext context,
        Aggregator parent,
        boolean collectsFromSingleBucket,
        List<PipelineAggregator> pipelineAggregators,
        Map<String, Object> metaData)
        throws IOException {

      if (valuesSource instanceof ValuesSource.Numeric) {
        return new DiversifiedNumericSamplerAggregator(
            name,
            shardSize,
            factories,
            context,
            parent,
            pipelineAggregators,
            metaData,
            (Numeric) valuesSource,
            maxDocsPerValue);
      }

      if (valuesSource instanceof ValuesSource.Bytes) {
        ExecutionMode execution = null;
        if (executionHint != null) {
          execution =
              ExecutionMode.fromString(executionHint, context.searchContext().parseFieldMatcher());
        }

        // In some cases using ordinals is just not supported: override
        // it
        if (execution == null) {
          execution = ExecutionMode.GLOBAL_ORDINALS;
        }
        if ((execution.needsGlobalOrdinals())
            && (!(valuesSource instanceof ValuesSource.Bytes.WithOrdinals))) {
          execution = ExecutionMode.MAP;
        }
        return execution.create(
            name,
            factories,
            shardSize,
            maxDocsPerValue,
            valuesSource,
            context,
            parent,
            pipelineAggregators,
            metaData);
      }

      throw new AggregationExecutionException(
          "Sampler aggregation cannot be applied to field ["
              + config.fieldContext().field()
              + "]. It can only be applied to numeric or string fields.");
    }
  @Override
  protected Aggregator doCreateInternal(
      ValuesSource valuesSource,
      AggregationContext aggregationContext,
      Aggregator parent,
      boolean collectsFromSingleBucket,
      List<PipelineAggregator> pipelineAggregators,
      Map<String, Object> metaData)
      throws IOException {
    if (collectsFromSingleBucket == false) {
      return asMultiBucketAggregator(this, aggregationContext, parent);
    }

    numberOfAggregatorsCreated++;

    if (valuesSource instanceof ValuesSource.Bytes) {
      ExecutionMode execution = null;
      if (executionHint != null) {
        execution =
            ExecutionMode.fromString(
                executionHint, aggregationContext.searchContext().parseFieldMatcher());
      }
      if (!(valuesSource instanceof ValuesSource.Bytes.WithOrdinals)) {
        execution = ExecutionMode.MAP;
      }
      if (execution == null) {
        if (Aggregator.descendsFromBucketAggregator(parent)) {
          execution = ExecutionMode.GLOBAL_ORDINALS_HASH;
        } else {
          execution = ExecutionMode.GLOBAL_ORDINALS;
        }
      }
      assert execution != null;
      return execution.create(
          name,
          factories,
          valuesSource,
          bucketCountThresholds,
          includeExclude,
          aggregationContext,
          parent,
          this,
          pipelineAggregators,
          metaData);
    }

    if ((includeExclude != null) && (includeExclude.isRegexBased())) {
      throw new AggregationExecutionException(
          "Aggregation ["
              + name
              + "] cannot support regular expression style include/exclude "
              + "settings as they can only be applied to string fields. Use an array of numeric values for include/exclude clauses used to filter numeric fields");
    }

    if (valuesSource instanceof ValuesSource.Numeric) {

      if (((ValuesSource.Numeric) valuesSource).isFloatingPoint()) {
        throw new UnsupportedOperationException("No support for examining floating point numerics");
      }
      IncludeExclude.LongFilter longFilter = null;
      if (includeExclude != null) {
        longFilter = includeExclude.convertToLongFilter();
      }
      return new SignificantLongTermsAggregator(
          name,
          factories,
          (ValuesSource.Numeric) valuesSource,
          config.format(),
          bucketCountThresholds,
          aggregationContext,
          parent,
          this,
          longFilter,
          pipelineAggregators,
          metaData);
    }

    throw new AggregationExecutionException(
        "sigfnificant_terms aggregation cannot be applied to field ["
            + config.fieldContext().field()
            + "]. It can only be applied to numeric or string fields.");
  }