func mergeNumberDataPoints()

in internal/coreinternal/aggregateutil/aggregate.go [152:235]


func mergeNumberDataPoints(dpsMap map[string]pmetric.NumberDataPointSlice, agg AggregationType, to pmetric.NumberDataPointSlice) {
	for _, dps := range dpsMap {
		dp := to.AppendEmpty()
		dps.At(0).MoveTo(dp)
		switch dp.ValueType() {
		case pmetric.NumberDataPointValueTypeDouble:
			medianNumbers := []float64{dp.DoubleValue()}
			for i := 1; i < dps.Len(); i++ {
				switch agg {
				case Sum, Mean:
					dp.SetDoubleValue(dp.DoubleValue() + doubleVal(dps.At(i)))
				case Max:
					dp.SetDoubleValue(math.Max(dp.DoubleValue(), doubleVal(dps.At(i))))
				case Min:
					dp.SetDoubleValue(math.Min(dp.DoubleValue(), doubleVal(dps.At(i))))
				case Median:
					medianNumbers = append(medianNumbers, doubleVal(dps.At(i)))
				case Count:
					dp.SetDoubleValue(float64(dps.Len()))
				}
				if dps.At(i).StartTimestamp() < dp.StartTimestamp() {
					dp.SetStartTimestamp(dps.At(i).StartTimestamp())
				}
			}
			if agg == Mean {
				dp.SetDoubleValue(dp.DoubleValue() / float64(dps.Len()))
			}
			if agg == Median {
				if len(medianNumbers) == 1 {
					dp.SetDoubleValue(medianNumbers[0])
				} else {
					sort.Float64s(medianNumbers)
					mNumber := len(medianNumbers) / 2
					if math.Mod(float64(len(medianNumbers)), 2) != 0 {
						dp.SetDoubleValue(medianNumbers[mNumber])
					} else {
						dp.SetDoubleValue((medianNumbers[mNumber-1] + medianNumbers[mNumber]) / 2)
					}
				}
			}
		case pmetric.NumberDataPointValueTypeInt:
			medianNumbers := []int64{dp.IntValue()}
			for i := 1; i < dps.Len(); i++ {
				switch agg {
				case Sum, Mean:
					dp.SetIntValue(dp.IntValue() + dps.At(i).IntValue())
				case Max:
					if dp.IntValue() < intVal(dps.At(i)) {
						dp.SetIntValue(intVal(dps.At(i)))
					}
				case Min:
					if dp.IntValue() > intVal(dps.At(i)) {
						dp.SetIntValue(intVal(dps.At(i)))
					}
				case Median:
					medianNumbers = append(medianNumbers, intVal(dps.At(i)))
				case Count:
					dp.SetIntValue(int64(dps.Len()))
				}
				if dps.At(i).StartTimestamp() < dp.StartTimestamp() {
					dp.SetStartTimestamp(dps.At(i).StartTimestamp())
				}
			}
			if agg == Median {
				if len(medianNumbers) == 1 {
					dp.SetIntValue(medianNumbers[0])
				} else {
					sort.Slice(medianNumbers, func(i, j int) bool {
						return medianNumbers[i] < medianNumbers[j]
					})
					mNumber := len(medianNumbers) / 2
					if math.Mod(float64(len(medianNumbers)), 2) != 0 {
						dp.SetIntValue(medianNumbers[mNumber])
					} else {
						dp.SetIntValue((medianNumbers[mNumber-1] + medianNumbers[mNumber]) / 2)
					}
				}
			}
			if agg == Mean {
				dp.SetIntValue(dp.IntValue() / int64(dps.Len()))
			}
		}
	}
}