or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

data-transformations.mddataframe-operations.mddatetime-operations.mdevent-system.mdfield-processing.mdindex.mdplugin-system.mdtheme-system.mdutility-functions.mdvalue-formatting.md
tile.json

data-transformations.mddocs/

Data Transformations

Pluggable transformation system for filtering, aggregating, joining, and modifying data frames with built-in transformers, field reducers, matchers, and custom transformation support.

Capabilities

Core Transformation System

Primary functions for applying and managing data transformations.

/**
 * Applies transformations to DataFrames
 * @param options - Transformation context with config and data
 * @returns Observable stream of transformed DataFrames
 */
function transformDataFrame(options: DataTransformContext): Observable<DataFrame[]>;

/**
 * Registry of standard transformations
 */
const standardTransformers: Registry<DataTransformerInfo>;

/**
 * Registry for transformer registration and management
 */
const standardTransformersRegistry: Registry<TransformerRegistryItem>;

Field Reducers

Functions for reducing field data to single values using various calculations.

/**
 * Reduces field values to a single calculated value
 * @param field - Field to reduce
 * @param id - Reducer ID (calculation type)
 * @param nullValueMode - How to handle null values
 * @returns Reduced value
 */
function reduceField(field: Field, id: ReducerID, nullValueMode?: NullValueMode): ReduceDataOptions;

/**
 * Checks if string is a valid reducer ID
 * @param id - ID to check
 * @returns True if valid reducer ID
 */
function isReducerID(id: string): id is ReducerID;

/**
 * Registry of field reducers (calculations)
 */
const fieldReducers: Registry<FieldReducerInfo>;

/**
 * Default calculation types for field reduction
 */
const defaultCalcs: ReducerID[];

/**
 * Performs standard calculations on field values
 * @param values - Array of values to calculate
 * @returns Object with calculation results
 */
function doStandardCalcs(values: number[]): { [key: string]: number };

Usage Examples:

import { reduceField, fieldReducers, ReducerID } from "@grafana/data";

// Reduce field to mean value
const avgValue = reduceField(temperatureField, ReducerID.mean);

// Get all available reducers
const allReducers = fieldReducers.list();

// Perform multiple calculations
const calculations = doStandardCalcs([1, 2, 3, 4, 5]);
// Result: { mean: 3, sum: 15, count: 5, min: 1, max: 5, ... }

Matcher System

Functions for matching fields, frames, and values using various criteria.

/**
 * Gets field matcher by ID
 * @param id - Field matcher ID
 * @returns Field matcher function
 */
function getFieldMatcher(id: FieldMatcherID): FieldMatcher;

/**
 * Gets frame matchers
 * @returns Array of frame matcher info
 */
function getFrameMatchers(): FrameMatcherInfo[];

/**
 * Gets value matcher by ID
 * @param id - Value matcher ID
 * @returns Value matcher function
 */
function getValueMatcher(id: ValueMatcherID): ValueMatcher;

/**
 * Collection of field matchers
 */
const fieldMatchers: Registry<FieldMatcherInfo>;

/**
 * Collection of frame matchers
 */
const frameMatchers: Registry<FrameMatcherInfo>;

/**
 * Collection of value matchers
 */
const valueMatchers: Registry<ValueMatcherInfo>;

Null Value Processing

Functions for handling null values in transformations.

/**
 * Applies null insertion threshold to create gaps in time series
 * @param frame - DataFrame to process
 * @param refField - Reference field for gap detection
 * @param threshold - Threshold for gap detection
 * @returns DataFrame with null values inserted for gaps
 */
function applyNullInsertThreshold(frame: DataFrame, refField?: Field, threshold?: number): DataFrame;

/**
 * Converts null values to specified value
 * @param frame - DataFrame to process
 * @param options - Null to value conversion options
 * @returns DataFrame with nulls replaced
 */
function nullToValue(frame: DataFrame, options: NullToValueOptions): DataFrame;

DataFrame Joining

Functions for joining and combining multiple DataFrames.

/**
 * Joins DataFrames using outer join strategy
 * @deprecated Use modern join transformers instead
 * @param dataFrames - Array of DataFrames to join
 * @returns Single joined DataFrame
 */
function joinDataFrames(dataFrames: DataFrame[]): DataFrame;

/**
 * Checks if vector values are likely in ascending order
 * @param values - Array of values to check
 * @returns True if values appear to be ascending
 */
function isLikelyAscendingVector(values: any[]): boolean;

Field Type Conversion

Functions for converting and ensuring field types.

/**
 * Ensures DataFrame has a time field, converting if necessary
 * @param frame - DataFrame to process
 * @returns DataFrame with guaranteed time field
 */
function ensureTimeField(frame: DataFrame): DataFrame;

Histogram Generation

Functions for creating histogram data from field values.

/**
 * All histogram transformation functionality exported from histogram module
 * Includes functions for binning data and creating histogram DataFrames
 */
// Re-exported from histogram module - see histogram transformer documentation

Matcher Configuration Types

/**
 * Configuration for regex or names matchers
 */
interface RegexpOrNamesMatcherOptions {
  pattern?: string;
  names?: string[];
}

/**
 * Configuration for by-names matchers
 */
interface ByNamesMatcherOptions {
  mode: ByNamesMatcherMode;
  names: string[];
  readOnly?: boolean;
}

/**
 * By-names matcher modes
 */
enum ByNamesMatcherMode {
  exclude = 'exclude',
  include = 'include'
}

/**
 * Field value matcher configuration
 */
interface FieldValueMatcherConfig {
  id: string;
  options?: any;
}

/**
 * Value matcher options base interface
 */
interface ValueMatcherOptions {
  value: any;
}

/**
 * Basic value matcher options
 */
interface BasicValueMatcherOptions extends ValueMatcherOptions {
  value: string | number;
}

/**
 * Range value matcher options
 */
interface RangeValueMatcherOptions {
  from: number;
  to: number;
}

Transformer Configuration Types

/**
 * Rename by regex transformer options
 */
interface RenameByRegexTransformerOptions {
  regex: string;
  renamePattern: string;
}

/**
 * Grouping to matrix transformer options
 */
interface GroupingToMatrixTransformerOptions {
  columnField?: string;
  rowField?: string;
  valueField?: string;
  emptyValue?: number;
}

Type Definitions

/**
 * Data transformation context
 */
interface DataTransformContext {
  data: DataFrame[];
  interpolate: InterpolateFunction;
  options?: any;
}

/**
 * Data transformer information
 */
interface DataTransformerInfo<TOptions = any> {
  id: string;
  name: string;
  description: string;
  defaultOptions: TOptions;
  operator: (options: TOptions, ctx: DataTransformContext) => Observable<DataFrame[]>;
  transformer: (options: TOptions) => (source: Observable<DataFrame[]>) => Observable<DataFrame[]>;
}

/**
 * Synchronous data transformer
 */
interface SynchronousDataTransformerInfo<TOptions = any> extends Omit<DataTransformerInfo<TOptions>, 'transformer'> {
  transformer: (options: TOptions) => (data: DataFrame[]) => DataFrame[];
}

/**
 * Custom transform operator
 */
type CustomTransformOperator<TOptions> = (options: TOptions, ctx: DataTransformContext) => Observable<DataFrame[]>;

/**
 * Data transformer configuration
 */
interface DataTransformerConfig<TOptions = any> {
  id: string;
  disabled?: boolean;
  options: TOptions;
  filter?: MatcherConfig;
}

/**
 * Matcher configuration
 */
interface MatcherConfig<TOptions = any> {
  id: string;
  options?: TOptions;
}

/**
 * Field matcher function type
 */
type FieldMatcher = (field: Field, frame: DataFrame, allFrames: DataFrame[]) => boolean;

/**
 * Frame matcher function type
 */
type FrameMatcher = (frame: DataFrame, allFrames: DataFrame[]) => boolean;

/**
 * Value matcher function type
 */
type ValueMatcher = (valueIndex: number, field: Field, frame: DataFrame, allFrames: DataFrame[]) => boolean;

/**
 * Field matcher information
 */
interface FieldMatcherInfo<TOptions = any> {
  id: FieldMatcherID;
  name: string;
  description: string;
  defaultOptions?: TOptions;
  get: (options?: TOptions) => FieldMatcher;
}

/**
 * Frame matcher information
 */
interface FrameMatcherInfo<TOptions = any> {
  id: FrameMatcherID;
  name: string;
  description: string;
  defaultOptions?: TOptions;
  get: (options?: TOptions) => FrameMatcher;
}

/**
 * Value matcher information
 */
interface ValueMatcherInfo<TOptions = any> {
  id: ValueMatcherID;
  name: string;
  description: string;
  defaultOptions?: TOptions;
  get: (options?: TOptions) => ValueMatcher;
}

/**
 * Field reducer information
 */
interface FieldReducerInfo {
  id: ReducerID;
  name: string;
  description: string;
  standard: boolean;
  aliasIds?: string[];
  reduce?: (field: Field, ignoreNulls: boolean, nullAsZero: boolean) => ReduceDataOptions;
}

/**
 * Transformation applicability levels
 */
enum TransformationApplicabilityLevels {
  NotApplicable = 0,  
  Manual = 1,
  Suggested = 2
}

/**
 * Transformation applicability score
 */
type TransformationApplicabilityScore = TransformationApplicabilityLevels;

/**
 * Transformer registry item
 */
interface TransformerRegistryItem<TOptions = any> {
  id: string;
  category: TransformerCategory;
  name: string;
  description: string;
  state: FeatureState;
  transformation: DataTransformerInfo<TOptions>;
  help?: string;
  applicability?: (data: DataFrame[]) => TransformationApplicabilityScore;
}

/**
 * Transformer UI properties
 */
interface TransformerUIProps<T> {
  options: T;
  onChange: (options: T) => void;
  input: DataFrame[];
}

/**
 * Transformer categories
 */
enum TransformerCategory {
  Combine = 'combine',
  Calculate = 'calculate',
  Filter = 'filter',
  Reformat = 'reformat',
  Spatial = 'spatial'
}

/**
 * Reducer IDs (calculation types)
 */
enum ReducerID {
  sum = 'sum',
  max = 'max',
  min = 'min',
  logmin = 'logmin',
  mean = 'mean',
  last = 'last',
  first = 'first',
  count = 'count',
  range = 'range',
  diff = 'diff',
  delta = 'delta',
  step = 'step',
  firstNotNull = 'firstNotNull',
  lastNotNull = 'lastNotNull',
  changeCount = 'changeCount',
  distinctCount = 'distinctCount',
  allIsZero = 'allIsZero',
  allIsNull = 'allIsNull',
  variance = 'variance',
  stdDev = 'stdDev',
  allValues = 'allValues'
}

/**
 * Data transformer IDs
 */
enum DataTransformerID {
  append = 'append',
  reduce = 'reduce',
  order = 'order',
  organize = 'organize',
  rename = 'rename',
  calculateField = 'calculateField',
  joinByField = 'joinByField',
  seriesToRows = 'seriesToRows',
  concatenate = 'concatenate',
  merge = 'merge',
  limit = 'limit',
  sortBy = 'sortBy',
  noop = 'noop',
  filterByName = 'filterByName',
  filterByRefId = 'filterByRefId',
  filterByValue = 'filterByValue',
  convertFieldType = 'convertFieldType',
  ensureColumns = 'ensureColumns',
  groupBy = 'groupBy',
  pivot = 'pivot',
  histogram = 'histogram'
}

/**
 * Matcher IDs
 */
enum MatcherID {
  anyMatch = 'anyMatch',
  allMatch = 'allMatch',
  invertMatch = 'invertMatch'
}

/**
 * Field matcher IDs
 */
enum FieldMatcherID {
  numeric = 'numeric',
  time = 'time',  
  first = 'first',
  firstTimeField = 'firstTimeField',
  byName = 'byName',
  byNames = 'byNames',
  byType = 'byType',
  byTypes = 'byTypes',
  byRegexp = 'byRegexp',
  byFrameRefID = 'byFrameRefID'
}

/**
 * Frame matcher IDs
 */
enum FrameMatcherID {
  byName = 'byName',
  byIndex = 'byIndex',
  byRefId = 'byRefId'
}

/**
 * Value matcher IDs
 */
enum ValueMatcherID {
  greater = 'greater',
  greaterOrEqual = 'greaterOrEqual',
  lower = 'lower',
  lowerOrEqual = 'lowerOrEqual',
  equal = 'equal',
  notEqual = 'notEqual',
  substring = 'substring',
  regex = 'regex',
  isNull = 'isNull',
  isNotNull = 'isNotNull',
  range = 'range'
}

/**
 * Special values for transformations
 */
enum SpecialValue {
  True = 'true',
  False = 'false',
  Null = 'null',
  Empty = 'empty'
}