/** * Shared types that can be reused by Loki and other data sources */ import { type ComponentType } from 'react'; import { type DataSourceApi, type RegistryItem, type SelectableValue, type TimeRange } from '@grafana/data'; import { type PromVisualQuery } from '../types'; export interface QueryBuilderLabelFilter { label: string; op: string; value: string; } export interface QueryBuilderOperation { id: string; params: QueryBuilderOperationParamValue[]; } export interface QueryWithOperations { operations: QueryBuilderOperation[]; } export interface QueryBuilderOperationDef extends RegistryItem { documentation?: string; params: QueryBuilderOperationParamDef[]; defaultParams: QueryBuilderOperationParamValue[]; category: string; hideFromList?: boolean; alternativesKey?: string; /** Can be used to control operation placement when adding a new operations, lower are placed first */ orderRank?: number; renderer: QueryBuilderOperationRenderer; addOperationHandler: QueryBuilderAddOperationHandler; paramChangedHandler?: QueryBuilderOnParamChangedHandler; explainHandler?: QueryBuilderExplainOperationHandler; changeTypeHandler?: (op: QueryBuilderOperation, newDef: QueryBuilderOperationDef) => QueryBuilderOperation; } type QueryBuilderAddOperationHandler = (def: QueryBuilderOperationDef, query: T, modeller: VisualQueryModeller) => T; type QueryBuilderExplainOperationHandler = (op: QueryBuilderOperation, def?: QueryBuilderOperationDef) => string; type QueryBuilderOnParamChangedHandler = (index: number, operation: QueryBuilderOperation, operationDef: QueryBuilderOperationDef) => QueryBuilderOperation; type QueryBuilderOperationRenderer = (model: QueryBuilderOperation, def: QueryBuilderOperationDef, innerExpr: string) => string; export type QueryBuilderOperationParamValue = string | number | boolean; export interface QueryBuilderOperationParamDef { name: string; type: 'string' | 'number' | 'boolean'; options?: string[] | number[] | Array>; hideName?: boolean; restParam?: boolean; optional?: boolean; placeholder?: string; description?: string; minWidth?: number; editor?: ComponentType | string; runQueryOnEnter?: boolean; } export interface QueryBuilderOperationParamEditorProps { onChange: (index: number, value: QueryBuilderOperationParamValue) => void; onRunQuery: () => void; /** Parameter index */ index: number; operationId: string; query: PromVisualQuery; datasource: DataSourceApi; timeRange: TimeRange; paramDef: QueryBuilderOperationParamDef; queryModeller: VisualQueryModeller; value?: QueryBuilderOperationParamValue; } export declare enum QueryEditorMode { Code = "code", Builder = "builder" } export interface VisualQueryModeller { getOperationsForCategory(category: string): QueryBuilderOperationDef[]; getAlternativeOperations(key: string): QueryBuilderOperationDef[]; getCategories(): string[]; getOperationDef(id: string): QueryBuilderOperationDef | undefined; } export interface VisualQueryBinary { operator: string; vectorMatchesType?: 'on' | 'ignoring'; vectorMatches?: string; query: T; } export interface PrometheusVisualQuery { metric?: string; labels: QueryBuilderLabelFilter[]; operations: QueryBuilderOperation[]; binaryQueries?: Array>; } export {};