{"version":3,"file":"histogram.cjs","sources":["../../../../src/transformations/transformers/histogram.ts"],"sourcesContent":["import { map } from 'rxjs/operators';\n\nimport { outerJoinDataFrames } from '../..';\nimport { getDisplayProcessor } from '../../field/displayProcessor';\nimport { createTheme } from '../../themes/createTheme';\nimport { GrafanaTheme2 } from '../../themes/types';\nimport { DataFrame, Field, FieldConfig, FieldType } from '../../types/dataFrame';\nimport { DataFrameType } from '../../types/dataFrameTypes';\nimport { DataTransformContext, SynchronousDataTransformerInfo } from '../../types/transformations';\nimport { roundDecimals } from '../../utils/numbers';\n\nimport { DataTransformerID } from './ids';\nimport { AlignedData, join } from './joinDataFrames';\nimport { nullToValueField } from './nulls/nullToValue';\n\n/**\n * @internal\n */\n/* eslint-disable */\n// prettier-ignore\nexport const histogramBucketSizes = [\n  1e-9,  2e-9,  2.5e-9,  4e-9,  5e-9,\n  1e-8,  2e-8,  2.5e-8,  4e-8,  5e-8,\n  1e-7,  2e-7,  2.5e-7,  4e-7,  5e-7,\n  1e-6,  2e-6,  2.5e-6,  4e-6,  5e-6,\n  1e-5,  2e-5,  2.5e-5,  4e-5,  5e-5,\n  1e-4,  2e-4,  2.5e-4,  4e-4,  5e-4,\n  1e-3,  2e-3,  2.5e-3,  4e-3,  5e-3,\n  1e-2,  2e-2,  2.5e-2,  4e-2,  5e-2,\n  1e-1,  2e-1,  2.5e-1,  4e-1,  5e-1,\n  1,     2,              4,     5,\n  1e+1,  2e+1,  2.5e+1,  4e+1,  5e+1,\n  1e+2,  2e+2,  2.5e+2,  4e+2,  5e+2,\n  1e+3,  2e+3,  2.5e+3,  4e+3,  5e+3,\n  1e+4,  2e+4,  2.5e+4,  4e+4,  5e+4,\n  1e+5,  2e+5,  2.5e+5,  4e+5,  5e+5,\n  1e+6,  2e+6,  2.5e+6,  4e+6,  5e+6,\n  1e+7,  2e+7,  2.5e+7,  4e+7,  5e+7,\n  1e+8,  2e+8,  2.5e+8,  4e+8,  5e+8,\n  1e+9,  2e+9,  2.5e+9,  4e+9,  5e+9,\n];\n/* eslint-enable */\n\nconst DEFAULT_BUCKET_COUNT = 30;\n\nconst histFilter: number[] = [];\nconst histSort = (a: number, b: number) => a - b;\n\nexport interface HistogramTransformerInputs {\n  bucketCount?: number;\n  bucketSize?: string | number;\n  bucketOffset?: string | number;\n  combine?: boolean;\n}\n\n/**\n * @alpha\n */\nexport interface HistogramTransformerOptions {\n  bucketCount?: number;\n  bucketSize?: number; // 0 is auto\n  bucketOffset?: number;\n  // xMin?: number;\n  // xMax?: number;\n  combine?: boolean; // if multiple series are input, join them into one\n}\n\n/**\n * This is a helper class to use the same text in both a panel and transformer UI\n *\n * @internal\n */\nexport const histogramFieldInfo = {\n  bucketCount: {\n    name: 'Bucket count',\n    description: 'approx bucket count',\n  },\n  bucketSize: {\n    name: 'Bucket size',\n    description: undefined,\n  },\n  bucketOffset: {\n    name: 'Bucket offset',\n    description: 'for non-zero-based buckets',\n  },\n  combine: {\n    name: 'Combine series',\n    description: 'combine all series into a single histogram',\n  },\n};\n\n/**\n * @alpha\n */\nexport const histogramTransformer: SynchronousDataTransformerInfo<HistogramTransformerInputs> = {\n  id: DataTransformerID.histogram,\n  name: 'Histogram',\n  description: 'Calculate a histogram from input data.',\n  defaultOptions: {\n    fields: {},\n  },\n\n  operator: (options, ctx) => (source) =>\n    source.pipe(map((data) => histogramTransformer.transformer(options, ctx)(data))),\n\n  transformer: (options: HistogramTransformerInputs, ctx: DataTransformContext) => (data: DataFrame[]) => {\n    if (!Array.isArray(data) || data.length === 0) {\n      return data;\n    }\n\n    let bucketSize,\n      bucketOffset: number | undefined = undefined;\n\n    if (options.bucketSize) {\n      if (typeof options.bucketSize === 'string') {\n        bucketSize = parseFloat(options.bucketSize);\n      } else {\n        bucketSize = options.bucketSize;\n      }\n\n      if (isNaN(bucketSize)) {\n        bucketSize = undefined;\n      }\n    }\n\n    if (options.bucketOffset) {\n      if (typeof options.bucketOffset === 'string') {\n        bucketOffset = parseFloat(options.bucketOffset);\n      } else {\n        bucketOffset = options.bucketOffset;\n      }\n\n      if (isNaN(bucketOffset)) {\n        bucketOffset = undefined;\n      }\n    }\n\n    const interpolatedOptions: HistogramTransformerOptions = {\n      bucketSize: bucketSize,\n      bucketOffset: bucketOffset,\n      combine: options.combine,\n    };\n\n    const hist = buildHistogram(data, interpolatedOptions);\n    if (hist == null) {\n      return [];\n    }\n    return [histogramFieldsToFrame(hist)];\n  },\n};\n\n/**\n * @internal\n */\nexport const histogramFrameBucketMinFieldName = 'xMin';\n\n/**\n * @internal\n */\nexport function isHistogramFrameBucketMinFieldName(v: string) {\n  return v === histogramFrameBucketMinFieldName || v === 'BucketMin'; // REMOVE 'BuckentMin/Max'\n}\n\n/**\n * @internal\n */\nexport const histogramFrameBucketMaxFieldName = 'xMax';\n\n/**\n * @internal\n */\nexport function isHistogramFrameBucketMaxFieldName(v: string) {\n  return v === histogramFrameBucketMaxFieldName || v === 'BucketMax'; // REMOVE 'BuckentMin/Max'\n}\n\n/**\n * @alpha\n */\nexport interface HistogramFields {\n  xMin: Field;\n  xMax: Field;\n  counts: Field[]; // frequency\n}\n\n/**\n * Given a frame, find the explicit histogram fields\n *\n * @alpha\n */\nexport function getHistogramFields(frame: DataFrame): HistogramFields | undefined {\n  // we ignore xMax (time field) and sum all counts together for each found bucket\n  if (frame.meta?.type === DataFrameType.HeatmapCells) {\n    // we assume uniform bucket size for now\n    // we assume xMax, yMin, yMax fields\n    let yMinField = frame.fields.find((f) => f.name === 'yMin')!;\n    let yMaxField = frame.fields.find((f) => f.name === 'yMax')!;\n    let countField = frame.fields.find((f) => f.name === 'count')!;\n\n    let uniqueMaxs = [...new Set(yMaxField.values)].sort((a, b) => a - b);\n    let uniqueMins = [...new Set(yMinField.values)].sort((a, b) => a - b);\n\n    // useLogScale is assumed for native histograms, we get the multiplier from first bucket's min/max bounds\n    let bucketFactor = uniqueMaxs[0] / uniqueMins[0];\n\n    // NOTES:\n    // native histograms default bucket growth factor is 8th root of 2 (schema 3) -> (2 ** (2 ** -3)) = 1.0905077326652577\n    // the by-division inference from data results in 1.090507732665258\n\n    // densify the buckets using 0 counts (consumers of this fn assume a dense structure)\n    let denseMins: number[] = [];\n    let denseMaxs: number[] = [];\n\n    const MAX_DENSIFIED_BUCKETS = 1000;\n\n    for (let i = 0; i < uniqueMaxs.length; i++) {\n      let curMax = uniqueMaxs[i];\n      let curMin = uniqueMins[i];\n\n      denseMaxs.push(curMax);\n      denseMins.push(curMin);\n\n      let nextMax = uniqueMaxs[i + 1];\n\n      if (nextMax != null) {\n        curMax = curMax * bucketFactor;\n        curMin = curMin * bucketFactor;\n\n        while (curMax < nextMax * 0.999999 && denseMaxs.length < MAX_DENSIFIED_BUCKETS) {\n          denseMaxs.push(curMax);\n          denseMins.push(curMin);\n\n          curMax = curMax * bucketFactor;\n          curMin = curMin * bucketFactor;\n        }\n\n        if (denseMaxs.length >= MAX_DENSIFIED_BUCKETS) {\n          break;\n        }\n      }\n    }\n\n    let countsByMax = new Map<number, number>();\n    denseMaxs.forEach((max) => countsByMax.set(max, 0));\n\n    for (let i = 0; i < yMaxField.values.length; i++) {\n      let max = yMaxField.values[i];\n      let currentCount = countsByMax.get(max);\n      if (currentCount !== undefined) {\n        countsByMax.set(max, currentCount + countField.values[i]);\n      }\n    }\n\n    let fields = {\n      xMin: {\n        ...yMinField,\n        name: 'xMin',\n        values: denseMins,\n      },\n      xMax: {\n        ...yMaxField,\n        name: 'xMax',\n        values: denseMaxs,\n      },\n      counts: [\n        {\n          ...countField,\n          values: [...countsByMax.values()],\n        },\n      ],\n    };\n\n    return fields;\n  } else if (frame.meta?.type === DataFrameType.HeatmapRows) {\n    // assumes le\n\n    // tick label strings (will be ordinal-ized)\n    let minVals: string[] = [];\n    let maxVals: string[] = [];\n\n    // sums of all timstamps per bucket\n    let countVals: number[] = [];\n\n    let minVal = '0';\n    frame.fields.forEach((f) => {\n      if (f.type === FieldType.number) {\n        let countsSum = f.values.reduce((acc, v) => acc + v, 0);\n        countVals.push(countsSum);\n        minVals.push(minVal);\n        maxVals.push((minVal = f.name));\n      }\n    });\n\n    // fake extra value for +Inf (for x scale ranging since bars are right-aligned)\n    countVals.push(0);\n    minVals.push(minVal);\n    maxVals.push(minVal);\n\n    let fields = {\n      xMin: {\n        ...frame.fields[1],\n        name: 'xMin',\n        type: FieldType.string,\n        values: minVals,\n      },\n      xMax: {\n        ...frame.fields[1],\n        name: 'xMax',\n        type: FieldType.string,\n        values: maxVals,\n      },\n      counts: [\n        {\n          ...frame.fields[1],\n          name: 'count',\n          type: FieldType.number,\n          values: countVals,\n        },\n      ],\n    };\n\n    return fields;\n  }\n\n  let xMin: Field | undefined = undefined;\n  let xMax: Field | undefined = undefined;\n  const counts: Field[] = [];\n  for (const field of frame.fields) {\n    if (isHistogramFrameBucketMinFieldName(field.name)) {\n      xMin = field;\n    } else if (isHistogramFrameBucketMaxFieldName(field.name)) {\n      xMax = field;\n    } else if (field.type === FieldType.number) {\n      counts.push(field);\n    }\n  }\n\n  // guess bucket size from single explicit bucket field\n  if (!xMax && xMin && xMin.values.length > 1) {\n    let vals = xMin.values;\n    let bucketSize = roundDecimals(vals[1] - vals[0], 6);\n\n    xMax = {\n      ...xMin,\n      name: histogramFrameBucketMaxFieldName,\n      values: vals.map((v) => v + bucketSize),\n    };\n  }\n\n  if (!xMin && xMax && xMax?.values.length > 1) {\n    let vals = xMax.values;\n    let bucketSize = roundDecimals(vals[1] - vals[0], 6);\n\n    xMin = {\n      ...xMax,\n      name: histogramFrameBucketMinFieldName,\n      values: vals.map((v) => v - bucketSize),\n    };\n  }\n\n  if (xMin && xMax && counts.length) {\n    return {\n      xMin,\n      xMax,\n      counts,\n    };\n  }\n  return undefined;\n}\n\n/**\n * @alpha\n */\nexport function buildHistogram(\n  frames: DataFrame[],\n  options?: HistogramTransformerOptions,\n  theme?: GrafanaTheme2\n): HistogramFields | null {\n  let bucketSize = options?.bucketSize;\n  let bucketCount = options?.bucketCount ?? DEFAULT_BUCKET_COUNT;\n  let bucketOffset = options?.bucketOffset ?? 0;\n\n  // replace or filter nulls from numeric fields\n  frames = frames.map((frame) => {\n    return {\n      ...frame,\n      fields: frame.fields.map((field) => {\n        if (field.type === FieldType.number) {\n          const noValue = Number(field.config.noValue);\n\n          if (!Number.isNaN(noValue)) {\n            field = nullToValueField(field, noValue);\n          } else {\n            field = { ...field, values: field.values.filter((v) => v != null) };\n          }\n        }\n\n        return field;\n      }),\n    };\n  });\n\n  // if bucket size is auto, try to calc from all numeric fields\n  if (!bucketSize || bucketSize < 0) {\n    let allValues: number[] = [];\n\n    // TODO: include field configs!\n    for (const frame of frames) {\n      for (const field of frame.fields) {\n        if (field.type === FieldType.number) {\n          allValues = allValues.concat(field.values);\n        }\n      }\n    }\n\n    allValues.sort((a, b) => a - b);\n\n    let smallestDelta = Infinity;\n\n    // TODO: case of 1 value needs work\n    if (allValues.length === 1) {\n      smallestDelta = 1;\n    } else {\n      for (let i = 1; i < allValues.length; i++) {\n        let delta = allValues[i] - allValues[i - 1];\n\n        if (delta !== 0) {\n          smallestDelta = Math.min(smallestDelta, delta);\n        }\n      }\n    }\n\n    let min = allValues[0];\n    let max = allValues[allValues.length - 1];\n\n    let range = max - min;\n\n    const targetSize = range / bucketCount;\n\n    // choose bucket\n    for (let i = 0; i < histogramBucketSizes.length; i++) {\n      let _bucketSize = histogramBucketSizes[i];\n\n      if (targetSize < _bucketSize && _bucketSize >= smallestDelta) {\n        bucketSize = _bucketSize;\n        break;\n      }\n    }\n  }\n\n  const getBucket = (v: number) => roundDecimals(incrRoundDn(v - bucketOffset, bucketSize!) + bucketOffset, 9);\n\n  // guess number of decimals\n  let bucketDecimals = (('' + bucketSize).match(/\\.\\d+$/) ?? ['.'])[0].length - 1;\n\n  let histograms: AlignedData[] = [];\n  let counts: Field[] = [];\n  let config: FieldConfig | undefined = undefined;\n\n  for (const frame of frames) {\n    for (const field of frame.fields) {\n      if (field.type === FieldType.number) {\n        let fieldHist = histogram(field.values, getBucket, histFilter, histSort);\n        histograms.push(fieldHist);\n\n        const count = {\n          ...field,\n          config: {\n            ...field.config,\n            unit: field.config.unit === 'short' ? 'short' : undefined,\n          },\n        };\n\n        count.display = getDisplayProcessor({\n          field: count,\n          theme: theme ?? createTheme(),\n        });\n        counts.push(count);\n        if (!config && field.config.unit) {\n          config = field.config;\n        }\n      }\n    }\n  }\n\n  // Quit early for empty a\n  if (!counts.length) {\n    return null;\n  }\n\n  // align histograms\n  let joinedHists = join(histograms);\n\n  // zero-fill all undefined values (missing buckets -> 0 counts)\n  for (let histIdx = 1; histIdx < joinedHists.length; histIdx++) {\n    let hist = joinedHists[histIdx];\n\n    for (let bucketIdx = 0; bucketIdx < hist.length; bucketIdx++) {\n      if (hist[bucketIdx] == null) {\n        hist[bucketIdx] = 0;\n      }\n    }\n  }\n\n  const xMin: Field = {\n    name: histogramFrameBucketMinFieldName,\n    values: joinedHists[0],\n    type: FieldType.number,\n    state: undefined,\n    config:\n      bucketDecimals === 0\n        ? (config ?? {})\n        : {\n            ...config,\n            decimals: bucketDecimals,\n          },\n  };\n  const xMax = {\n    ...xMin,\n    name: histogramFrameBucketMaxFieldName,\n    values: joinedHists[0].map((v) => v + bucketSize!),\n  };\n\n  if (options?.combine) {\n    const vals = new Array(joinedHists[0].length).fill(0);\n    for (let i = 1; i < joinedHists.length; i++) {\n      for (let j = 0; j < vals.length; j++) {\n        vals[j] += joinedHists[i][j];\n      }\n    }\n    counts = [\n      {\n        ...counts[0],\n        name: 'count',\n        values: vals,\n        type: FieldType.number,\n        state: {\n          ...counts[0].state,\n          displayName: 'Count',\n          multipleFrames: false,\n          origin: { frameIndex: 0, fieldIndex: 2 },\n        },\n      },\n    ];\n  } else {\n    counts.forEach((field, i) => {\n      field.values = joinedHists[i + 1];\n    });\n  }\n\n  return {\n    xMin,\n    xMax,\n    counts,\n  };\n}\n\n/**\n * @internal\n */\nexport function incrRound(num: number, incr: number) {\n  return Math.round(num / incr) * incr;\n}\n\n/**\n * @internal\n */\nexport function incrRoundUp(num: number, incr: number) {\n  return Math.ceil(num / incr) * incr;\n}\n\n/**\n * @internal\n */\nexport function incrRoundDn(num: number, incr: number) {\n  return Math.floor(num / incr) * incr;\n}\n\nfunction histogram(\n  vals: number[],\n  getBucket: (v: number) => number,\n  filterOut?: number[],\n  sort?: ((a: number, b: number) => number) | null\n): AlignedData {\n  let hist = new Map();\n\n  for (let i = 0; i < vals.length; i++) {\n    let v = vals[i];\n\n    if (v != null) {\n      v = getBucket(v);\n    }\n\n    let entry = hist.get(v);\n\n    if (entry) {\n      entry.count++;\n    } else {\n      hist.set(v, { value: v, count: 1 });\n    }\n  }\n\n  filterOut && filterOut.forEach((v) => hist.delete(v));\n\n  let bins = [...hist.values()];\n\n  sort && bins.sort((a, b) => sort(a.value, b.value));\n\n  let values = Array(bins.length);\n  let counts = Array(bins.length);\n\n  for (let i = 0; i < bins.length; i++) {\n    values[i] = bins[i].value;\n    counts[i] = bins[i].count;\n  }\n\n  return [values, counts];\n}\n\n/**\n * @internal\n */\nexport function histogramFieldsToFrame(info: HistogramFields, theme?: GrafanaTheme2): DataFrame {\n  if (!info.xMin.display) {\n    const display = getDisplayProcessor({\n      field: info.xMin,\n      theme: theme ?? createTheme(),\n    });\n    info.xMin.display = display;\n    info.xMax.display = display;\n  }\n\n  return {\n    length: info.xMin.values.length,\n    meta: {\n      type: DataFrameType.Histogram,\n    },\n    fields: [info.xMin, info.xMax, ...info.counts],\n    refId: `${DataTransformerID.histogram}`,\n  };\n}\n\n/**\n *\n * Join multiple histograms into a histogram with multiple counts.\n * Useful eg if you want to overlay them for comparison.\n *\n * This is needed because histogram results from database\n * will have buckets omitted for 0 counts, but when joining multiple histograms\n * we need to fill in the 0 values for missing buckets.\n *\n * Returns field configs of the first provided histogram.\n * @alpha\n */\n\nexport function joinHistograms(histograms: HistogramFields[]): HistogramFields {\n  if (histograms.length === 1) {\n    return histograms[0];\n  }\n\n  let joined = outerJoinDataFrames({\n    frames: histograms.map((h) => ({\n      length: h.xMax.values.length,\n      fields: [h.xMax, h.xMin, ...h.counts],\n    })),\n    joinBy: (field) => field.name === 'xMax',\n  })!;\n\n  let xMaxField: Field | null = null;\n  let xMinField: Field | null = null;\n  let countFields: Field[] = [];\n\n  // merge all xMin fields into first xMin field\n  // and default all count fields to 0\n  joined.fields.forEach((f) => {\n    if (f.name === 'xMax') {\n      xMaxField = f;\n    } else if (f.name === 'xMin') {\n      if (xMinField == null) {\n        xMinField = f;\n      } else {\n        for (let i = 0; i < f.values.length; i++) {\n          xMinField.values[i] ??= f.values[i];\n        }\n      }\n    } else {\n      countFields.push({\n        ...f,\n        values: f.values.map((v) => v ?? 0),\n      });\n    }\n  });\n\n  const result: HistogramFields = {\n    xMin: xMinField!,\n    xMax: xMaxField!,\n    counts: countFields,\n  };\n\n  return result;\n}\n"],"names":["DataTransformerID","map","DataFrameType","FieldType","roundDecimals","nullToValueField","getDisplayProcessor","createTheme","join","outerJoinDataFrames"],"mappings":"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"}