mirror of
https://github.com/grafana/grafana.git
synced 2025-02-15 01:53:33 -06:00
Transformations: Add variable support to join by field (#76056)
Add variable support to join by field
This commit is contained in:
parent
4343c99e2a
commit
df9e7671d9
@ -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) {
|
||||
|
@ -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],
|
||||
|
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user