@grafana/ui
Version:
Grafana Components Library
1 lines • 9.14 kB
Source Map (JSON)
{"version":3,"file":"nullInsertThreshold.mjs","sources":["../../../../src/graveyard/GraphNG/nullInsertThreshold.ts"],"sourcesContent":["import { DataFrame } from '@grafana/data';\n\nimport { getRefField } from './utils';\n\ntype InsertMode = (prev: number, next: number, threshold: number) => number;\n\nconst INSERT_MODES = {\n threshold: (prev: number, next: number, threshold: number) => prev + threshold,\n midpoint: (prev: number, next: number, threshold: number) => (prev + next) / 2,\n // previous time + 1ms to prevent StateTimeline from forward-interpolating prior state\n plusone: (prev: number, next: number, threshold: number) => prev + 1,\n};\n\ninterface NullInsertOptions {\n frame: DataFrame;\n refFieldName?: string | null;\n refFieldPseudoMax?: number;\n refFieldPseudoMin?: number;\n insertMode?: InsertMode;\n}\n\n/** @deprecated */\nexport function applyNullInsertThreshold(opts: NullInsertOptions): DataFrame {\n if (opts.frame.length === 0) {\n return opts.frame;\n }\n\n let thorough = true;\n let { frame, refFieldName, refFieldPseudoMax, refFieldPseudoMin, insertMode } = opts;\n\n if (!insertMode) {\n insertMode = INSERT_MODES.threshold;\n }\n\n const refField = getRefField(frame, refFieldName);\n\n if (refField == null) {\n return frame;\n }\n\n refField.state = {\n ...refField.state,\n nullThresholdApplied: true,\n };\n\n const thresholds = frame.fields.map((field) => field.config.custom?.insertNulls || refField.config.interval || null);\n\n const uniqueThresholds = new Set<number>(thresholds);\n\n uniqueThresholds.delete(null as any);\n\n if (uniqueThresholds.size === 0) {\n return frame;\n }\n\n if (uniqueThresholds.size === 1) {\n const threshold = uniqueThresholds.values().next().value;\n\n if (!threshold || threshold <= 0) {\n return frame;\n }\n\n const refValues = refField.values;\n\n const frameValues = frame.fields.map((field) => field.values);\n\n const filledFieldValues = nullInsertThreshold(\n refValues,\n frameValues,\n threshold,\n refFieldPseudoMin,\n refFieldPseudoMax,\n insertMode,\n thorough\n );\n\n if (filledFieldValues === frameValues) {\n return frame;\n }\n\n return {\n ...frame,\n length: filledFieldValues[0].length,\n fields: frame.fields.map((field, i) => ({\n ...field,\n values: filledFieldValues[i],\n })),\n };\n }\n\n // TODO: unique threshold-per-field (via overrides) is unimplemented\n // should be done by processing each (refField + thresholdA-field1 + thresholdA-field2...)\n // as a separate nullInsertThreshold() dataset, then re-join into single dataset via join()\n return frame;\n}\n\nfunction nullInsertThreshold(\n refValues: number[],\n frameValues: any[][],\n threshold: number,\n refFieldPseudoMin: number | null = null,\n // will insert a trailing null when refFieldPseudoMax > last datapoint + threshold\n refFieldPseudoMax: number | null = null,\n getInsertValue: InsertMode,\n // will insert the value at every missing interval\n thorough: boolean\n) {\n const len = refValues.length;\n const refValuesNew: number[] = [];\n\n // Continuously subtract the threshold from the first data point, filling in insert values accordingly\n if (refFieldPseudoMin != null && refFieldPseudoMin < refValues[0]) {\n let preFillCount = Math.ceil((refValues[0] - refFieldPseudoMin) / threshold);\n // this will be 0 or 1 threshold increment left of visible range\n let prevSlot = refValues[0] - preFillCount * threshold;\n\n while (prevSlot < refValues[0]) {\n // (prevSlot - threshold) is used to simulate the previous 'real' data point, as getInsertValue expects\n refValuesNew.push(getInsertValue(prevSlot - threshold, prevSlot, threshold));\n prevSlot += threshold;\n }\n }\n\n // Insert initial value\n refValuesNew.push(refValues[0]);\n\n let prevValue: number = refValues[0];\n\n // Fill nulls when a value is greater than the threshold value\n for (let i = 1; i < len; i++) {\n const curValue = refValues[i];\n\n while (curValue - prevValue > threshold) {\n refValuesNew.push(getInsertValue(prevValue, curValue, threshold));\n\n prevValue += threshold;\n\n if (!thorough) {\n break;\n }\n }\n\n refValuesNew.push(curValue);\n\n prevValue = curValue;\n }\n\n // At the end of the sequence\n if (refFieldPseudoMax != null && refFieldPseudoMax > prevValue) {\n while (prevValue + threshold < refFieldPseudoMax) {\n refValuesNew.push(getInsertValue(prevValue, refFieldPseudoMax, threshold));\n prevValue += threshold;\n }\n }\n\n const filledLen = refValuesNew.length;\n\n if (filledLen === len) {\n return frameValues;\n }\n\n const filledFieldValues: any[][] = [];\n\n for (let fieldValues of frameValues) {\n let filledValues;\n\n if (fieldValues !== refValues) {\n filledValues = Array(filledLen);\n\n for (let i = 0, j = 0; i < filledLen; i++) {\n filledValues[i] = refValues[j] === refValuesNew[i] ? fieldValues[j++] : null;\n }\n } else {\n filledValues = refValuesNew;\n }\n\n filledFieldValues.push(filledValues);\n }\n\n return filledFieldValues;\n}\n"],"names":[],"mappings":";;;AAMA,MAAM,YAAA,GAAe;AAAA,EACnB,SAAA,EAAW,CAAC,IAAA,EAAc,IAAA,EAAc,cAAsB,IAAA,GAAO,SAAA;AAAA,EACrE,UAAU,CAAC,IAAA,EAAc,IAAA,EAAc,SAAA,KAAA,CAAuB,OAAO,IAAA,IAAQ,CAAA;AAAA;AAAA,EAE7E,OAAA,EAAS,CAAC,IAAA,EAAc,IAAA,EAAc,cAAsB,IAAA,GAAO;AACrE,CAAA;AAWO,SAAS,yBAAyB,IAAA,EAAoC;AAC3E,EAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAEA,EAAA,IAAI,QAAA,GAAW,IAAA;AACf,EAAA,IAAI,EAAE,KAAA,EAAO,YAAA,EAAc,iBAAA,EAAmB,iBAAA,EAAmB,YAAW,GAAI,IAAA;AAEhF,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,UAAA,GAAa,YAAA,CAAa,SAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,KAAA,EAAO,YAAY,CAAA;AAEhD,EAAA,IAAI,YAAY,IAAA,EAAM;AACpB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,QAAA,CAAS,KAAA,GAAQ;AAAA,IACf,GAAG,QAAA,CAAS,KAAA;AAAA,IACZ,oBAAA,EAAsB;AAAA,GACxB;AAEA,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAO;AA7C9C,IAAA,IAAA,EAAA;AA6CiD,IAAA,OAAA,CAAA,CAAA,EAAA,GAAA,KAAA,CAAM,OAAO,MAAA,KAAb,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAqB,WAAA,KAAe,QAAA,CAAS,OAAO,QAAA,IAAY,IAAA;AAAA,EAAA,CAAI,CAAA;AAEnH,EAAA,MAAM,gBAAA,GAAmB,IAAI,GAAA,CAAY,UAAU,CAAA;AAEnD,EAAA,gBAAA,CAAiB,OAAO,IAAW,CAAA;AAEnC,EAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,IAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,MAAA,EAAO,CAAE,MAAK,CAAE,KAAA;AAEnD,IAAA,IAAI,CAAC,SAAA,IAAa,SAAA,IAAa,CAAA,EAAG;AAChC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,YAAY,QAAA,CAAS,MAAA;AAE3B,IAAA,MAAM,cAAc,KAAA,CAAM,MAAA,CAAO,IAAI,CAAC,KAAA,KAAU,MAAM,MAAM,CAAA;AAE5D,IAAA,MAAM,iBAAA,GAAoB,mBAAA;AAAA,MACxB,SAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,iBAAA;AAAA,MACA,iBAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,sBAAsB,WAAA,EAAa;AACrC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO;AAAA,MACL,GAAG,KAAA;AAAA,MACH,MAAA,EAAQ,iBAAA,CAAkB,CAAC,CAAA,CAAE,MAAA;AAAA,MAC7B,QAAQ,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,OAAO,CAAA,MAAO;AAAA,QACtC,GAAG,KAAA;AAAA,QACH,MAAA,EAAQ,kBAAkB,CAAC;AAAA,OAC7B,CAAE;AAAA,KACJ;AAAA,EACF;AAKA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,mBAAA,CACP,WACA,WAAA,EACA,SAAA,EACA,oBAAmC,IAAA,EAEnC,iBAAA,GAAmC,IAAA,EACnC,cAAA,EAEA,QAAA,EACA;AACA,EAAA,MAAM,MAAM,SAAA,CAAU,MAAA;AACtB,EAAA,MAAM,eAAyB,EAAC;AAGhC,EAAA,IAAI,iBAAA,IAAqB,IAAA,IAAQ,iBAAA,GAAoB,SAAA,CAAU,CAAC,CAAA,EAAG;AACjE,IAAA,IAAI,eAAe,IAAA,CAAK,IAAA,CAAA,CAAM,UAAU,CAAC,CAAA,GAAI,qBAAqB,SAAS,CAAA;AAE3E,IAAA,IAAI,QAAA,GAAW,SAAA,CAAU,CAAC,CAAA,GAAI,YAAA,GAAe,SAAA;AAE7C,IAAA,OAAO,QAAA,GAAW,SAAA,CAAU,CAAC,CAAA,EAAG;AAE9B,MAAA,YAAA,CAAa,KAAK,cAAA,CAAe,QAAA,GAAW,SAAA,EAAW,QAAA,EAAU,SAAS,CAAC,CAAA;AAC3E,MAAA,QAAA,IAAY,SAAA;AAAA,IACd;AAAA,EACF;AAGA,EAAA,YAAA,CAAa,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAE9B,EAAA,IAAI,SAAA,GAAoB,UAAU,CAAC,CAAA;AAGnC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,IAAA,MAAM,QAAA,GAAW,UAAU,CAAC,CAAA;AAE5B,IAAA,OAAO,QAAA,GAAW,YAAY,SAAA,EAAW;AACvC,MAAA,YAAA,CAAa,IAAA,CAAK,cAAA,CAAe,SAAA,EAAW,QAAA,EAAU,SAAS,CAAC,CAAA;AAEhE,MAAA,SAAA,IAAa,SAAA;AAEb,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,YAAA,CAAa,KAAK,QAAQ,CAAA;AAE1B,IAAA,SAAA,GAAY,QAAA;AAAA,EACd;AAGA,EAAA,IAAI,iBAAA,IAAqB,IAAA,IAAQ,iBAAA,GAAoB,SAAA,EAAW;AAC9D,IAAA,OAAO,SAAA,GAAY,YAAY,iBAAA,EAAmB;AAChD,MAAA,YAAA,CAAa,IAAA,CAAK,cAAA,CAAe,SAAA,EAAW,iBAAA,EAAmB,SAAS,CAAC,CAAA;AACzE,MAAA,SAAA,IAAa,SAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,MAAM,YAAY,YAAA,CAAa,MAAA;AAE/B,EAAA,IAAI,cAAc,GAAA,EAAK;AACrB,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,MAAM,oBAA6B,EAAC;AAEpC,EAAA,KAAA,IAAS,eAAe,WAAA,EAAa;AACnC,IAAA,IAAI,YAAA;AAEJ,IAAA,IAAI,gBAAgB,SAAA,EAAW;AAC7B,MAAA,YAAA,GAAe,MAAM,SAAS,CAAA;AAE9B,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAW,CAAA,EAAA,EAAK;AACzC,QAAA,YAAA,CAAa,CAAC,CAAA,GAAI,SAAA,CAAU,CAAC,CAAA,KAAM,aAAa,CAAC,CAAA,GAAI,WAAA,CAAY,CAAA,EAAG,CAAA,GAAI,IAAA;AAAA,MAC1E;AAAA,IACF,CAAA,MAAO;AACL,MAAA,YAAA,GAAe,YAAA;AAAA,IACjB;AAEA,IAAA,iBAAA,CAAkB,KAAK,YAAY,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO,iBAAA;AACT;;;;"}