Transformations: Add variable support to join by field (#76056)

Add variable support to join by field
This commit is contained in:
Oscar Kilhed 2023-10-06 00:03:50 +02:00 committed by GitHub
parent 4343c99e2a
commit df9e7671d9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 11 additions and 5 deletions

View File

@ -1,6 +1,6 @@
import { map } from 'rxjs/operators';
import { DataFrame, SynchronousDataTransformerInfo, FieldMatcher } from '../../types';
import { DataFrame, SynchronousDataTransformerInfo, FieldMatcher, DataTransformContext } from '../../types';
import { fieldMatchers } from '../matchers';
import { FieldMatcherID } from '../matchers/ids';
@ -32,12 +32,12 @@ export const joinByFieldTransformer: SynchronousDataTransformerInfo<JoinByFieldO
operator: (options, ctx) => (source) =>
source.pipe(map((data) => joinByFieldTransformer.transformer(options, ctx)(data))),
transformer: (options: JoinByFieldOptions) => {
transformer: (options: JoinByFieldOptions, ctx: DataTransformContext) => {
let joinBy: FieldMatcher | undefined = undefined;
return (data: DataFrame[]) => {
if (data.length > 1) {
if (options.byField && !joinBy) {
joinBy = fieldMatchers.get(FieldMatcherID.byName).get(options.byField);
joinBy = fieldMatchers.get(FieldMatcherID.byName).get(ctx.interpolate(options.byField));
}
const joined = joinDataFrames({ frames: data, joinBy, mode: options.mode });
if (joined) {

View File

@ -244,7 +244,7 @@ export function joinDataFrames(options: JoinOptions): DataFrame | undefined {
return {
// ...options.data[0], // keep name, meta?
length: joined[0].length,
length: joined[0] ? joined[0].length : 0,
fields: originalFields.map((f, index) => ({
...f,
values: joined[index],

View File

@ -9,6 +9,7 @@ import {
TransformerCategory,
} from '@grafana/data';
import { JoinByFieldOptions, JoinMode } from '@grafana/data/src/transformations/transformers/joinByField';
import { getTemplateSrv } from '@grafana/runtime';
import { Select, InlineFieldRow, InlineField } from '@grafana/ui';
import { useAllFieldNamesFromDataFrames } from '../utils';
@ -31,6 +32,11 @@ const modes = [
export function SeriesToFieldsTransformerEditor({ input, options, onChange }: TransformerUIProps<JoinByFieldOptions>) {
const fieldNames = useAllFieldNamesFromDataFrames(input).map((item: string) => ({ label: item, value: item }));
const variables = getTemplateSrv()
.getVariables()
.map((v) => {
return { value: '$' + v.name, label: '$' + v.name };
});
const onSelectField = useCallback(
(value: SelectableValue<string>) => {
@ -62,7 +68,7 @@ export function SeriesToFieldsTransformerEditor({ input, options, onChange }: Tr
<InlineFieldRow>
<InlineField label="Field" labelWidth={8} grow>
<Select
options={fieldNames}
options={[...fieldNames, ...variables]}
value={options.byField}
onChange={onSelectField}
placeholder="time"