Elasticsearch: Fix handling multiple datalinks for a single field (#44029)

This commit is contained in:
Giordano Ricci 2022-01-14 14:05:23 +00:00 committed by GitHub
parent 9f404daf9f
commit cb27c9cd6f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 62 additions and 37 deletions

View File

@ -955,28 +955,53 @@ describe('enhanceDataFrame', () => {
field: 'urlField', field: 'urlField',
url: 'someUrl', url: 'someUrl',
}, },
{
field: 'urlField',
url: 'someOtherUrl',
},
{ {
field: 'traceField', field: 'traceField',
url: 'query', url: 'query',
datasourceUid: 'dsUid', datasourceUid: 'ds1',
},
{
field: 'traceField',
url: 'otherQuery',
datasourceUid: 'ds2',
}, },
]); ]);
expect(df.fields[0].config.links!.length).toBe(1); expect(df.fields[0].config.links).toHaveLength(2);
expect(df.fields[0].config.links![0]).toEqual({ expect(df.fields[0].config.links).toContainEqual({
title: '', title: '',
url: 'someUrl', url: 'someUrl',
}); });
expect(df.fields[1].config.links!.length).toBe(1); expect(df.fields[0].config.links).toContainEqual({
expect(df.fields[1].config.links![0]).toEqual({ title: '',
url: 'someOtherUrl',
});
expect(df.fields[1].config.links).toHaveLength(2);
expect(df.fields[1].config.links).toContainEqual(
expect.objectContaining({
title: '', title: '',
url: '', url: '',
internal: { internal: expect.objectContaining({
query: { query: 'query' }, query: { query: 'query' },
datasourceName: 'elastic25', datasourceUid: 'ds1',
datasourceUid: 'dsUid', }),
}, })
}); );
expect(df.fields[1].config.links).toContainEqual(
expect.objectContaining({
title: '',
url: '',
internal: expect.objectContaining({
query: { query: 'otherQuery' },
datasourceUid: 'ds2',
}),
})
);
}); });
it('adds limit to dataframe', () => { it('adds limit to dataframe', () => {

View File

@ -936,8 +936,6 @@ export class ElasticDatasource
* Exported for tests. * Exported for tests.
*/ */
export function enhanceDataFrame(dataFrame: DataFrame, dataLinks: DataLinkConfig[], limit?: number) { export function enhanceDataFrame(dataFrame: DataFrame, dataLinks: DataLinkConfig[], limit?: number) {
const dataSourceSrv = getDataSourceSrv();
if (limit) { if (limit) {
dataFrame.meta = { dataFrame.meta = {
...dataFrame.meta, ...dataFrame.meta,
@ -950,36 +948,38 @@ export function enhanceDataFrame(dataFrame: DataFrame, dataLinks: DataLinkConfig
} }
for (const field of dataFrame.fields) { for (const field of dataFrame.fields) {
const dataLinkConfig = dataLinks.find((dataLink) => field.name && field.name.match(dataLink.field)); const linksToApply = dataLinks.filter((dataLink) => new RegExp(dataLink.field).test(field.name));
if (!dataLinkConfig) { if (linksToApply.length === 0) {
continue; continue;
} }
let link: DataLink; field.config = field.config || {};
field.config.links = [...(field.config.links || [], linksToApply.map(generateDataLink))];
}
}
if (dataLinkConfig.datasourceUid) { function generateDataLink(linkConfig: DataLinkConfig): DataLink {
const dsSettings = dataSourceSrv.getInstanceSettings(dataLinkConfig.datasourceUid); const dataSourceSrv = getDataSourceSrv();
link = { if (linkConfig.datasourceUid) {
title: dataLinkConfig.urlDisplayLabel || '', const dsSettings = dataSourceSrv.getInstanceSettings(linkConfig.datasourceUid);
return {
title: linkConfig.urlDisplayLabel || '',
url: '', url: '',
internal: { internal: {
query: { query: dataLinkConfig.url }, query: { query: linkConfig.url },
datasourceUid: dataLinkConfig.datasourceUid, datasourceUid: linkConfig.datasourceUid,
datasourceName: dsSettings?.name ?? 'Data source not found', datasourceName: dsSettings?.name ?? 'Data source not found',
}, },
}; };
} else { } else {
link = { return {
title: dataLinkConfig.urlDisplayLabel || '', title: linkConfig.urlDisplayLabel || '',
url: dataLinkConfig.url, url: linkConfig.url,
}; };
} }
field.config = field.config || {};
field.config.links = [...(field.config.links || []), link];
}
} }
function transformHitsBasedOnDirection(response: any, direction: 'asc' | 'desc') { function transformHitsBasedOnDirection(response: any, direction: 'asc' | 'desc') {