function mergeYDomainForGroup()

in packages/charts/src/chart_types/xy_chart/domains/y_domain.ts [53:115]


function mergeYDomainForGroup(
  stacked: DataSeries[],
  nonStacked: DataSeries[],
  annotationYValueMap: Map<GroupId, number[]>,
  hasZeroBaselineSpecs: boolean,
  yScaleConfig: ScaleConfigs['y'],
): YDomain | null {
  const dataSeries = stacked.concat(nonStacked);
  if (!dataSeries[0]) return null;

  const [{ isStacked, stackMode, spec }] = dataSeries;
  const groupId = getSpecDomainGroupId(spec);
  const scaleConfig = yScaleConfig[groupId];

  if (!scaleConfig) return null;

  const { customDomain, type, nice, desiredTickCount } = scaleConfig;
  const newCustomDomain: YDomainRange = customDomain ? { ...customDomain } : { min: NaN, max: NaN };
  const { paddingUnit, padding, constrainPadding } = newCustomDomain;

  let mergedDomain: ContinuousDomain;
  if (isStacked && stackMode === StackMode.Percentage) {
    mergedDomain = computeContinuousDataDomain([0, 1], type, customDomain);
  } else {
    const annotationData = annotationYValueMap.get(groupId) ?? [];
    const stackedDomain = computeYDomain(stacked, annotationData, hasZeroBaselineSpecs, type, newCustomDomain);
    const nonStackedDomain = computeYDomain(nonStacked, annotationData, hasZeroBaselineSpecs, type, newCustomDomain);
    mergedDomain = computeContinuousDataDomain([...stackedDomain, ...nonStackedDomain], type, newCustomDomain);
    const [computedDomainMin, computedDomainMax] = mergedDomain;

    if (newCustomDomain && Number.isFinite(newCustomDomain.min) && Number.isFinite(newCustomDomain.max)) {
      // Don't need to check min > max because this has been validated on axis domain merge
      mergedDomain = [newCustomDomain.min, newCustomDomain.max];
    } else if (newCustomDomain && Number.isFinite(newCustomDomain.min)) {
      if (newCustomDomain.min > computedDomainMax) {
        Logger.warn(`custom yDomain for ${groupId} is invalid, custom min is greater than computed max.`);
        mergedDomain = [newCustomDomain.min, newCustomDomain.min];
      } else {
        mergedDomain = [newCustomDomain.min, computedDomainMax];
      }
    } else if (newCustomDomain && Number.isFinite(newCustomDomain.max)) {
      if (computedDomainMin > newCustomDomain.max) {
        Logger.warn(`custom yDomain for ${groupId} is invalid, custom max is less than computed max.`);
        mergedDomain = [newCustomDomain.max, newCustomDomain.max];
      } else {
        mergedDomain = [computedDomainMin, newCustomDomain.max];
      }
    }
  }

  return {
    type,
    nice,
    isBandScale: false,
    groupId,
    domain: mergedDomain,
    logBase: customDomain?.logBase,
    logMinLimit: customDomain?.logMinLimit,
    desiredTickCount,
    domainPixelPadding: paddingUnit === DomainPaddingUnit.Pixel ? padding : 0,
    constrainDomainPadding: constrainPadding,
  };
}