Skip to content

Commit

Permalink
[discover] undefined datasource fix for index patterns for PPL and SQL(
Browse files Browse the repository at this point in the history
…#8027)

Deconstructing the dataSource caused an exception when no dataSource was set with the query. This can be the case with index patterns that are created and pointed to the default. Most times the default is the local cluster so there is no data source object in the query the case of the local.

Accessing by dot notation with null operator fixes this issue. Adding tests to prevent this happening again.

With query enhancements enabled we should considered ensuring index patterns always have a datasource object in the query.

Signed-off-by: Kawika Avilla <[email protected]>
(cherry picked from commit 06816d5)
Signed-off-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
  • Loading branch information
github-actions[bot] committed Sep 5, 2024
1 parent dce573e commit d21fda9
Show file tree
Hide file tree
Showing 2 changed files with 121 additions and 2 deletions.
119 changes: 119 additions & 0 deletions src/plugins/query_enhancements/server/utils/facet.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

import { Logger } from 'opensearch-dashboards/server';
import { Facet, FacetProps } from './facet';

describe('Facet', () => {
let facet: Facet;
let mockClient: jest.Mock;
let mockLogger: jest.Mocked<Logger>;
let mockContext: any;
let mockRequest: any;

beforeEach(() => {
mockClient = jest.fn();
mockLogger = ({
error: jest.fn(),
} as unknown) as jest.Mocked<Logger>;

const props: FacetProps = {
client: { asScoped: jest.fn().mockReturnValue({ callAsCurrentUser: mockClient }) },
logger: mockLogger,
endpoint: 'test-endpoint',
};

facet = new Facet(props);

mockContext = {
dataSource: {
opensearch: {
legacy: {
getClient: jest.fn().mockReturnValue({ callAPI: mockClient }),
},
},
},
};

mockRequest = {
body: {
query: {
query: 'test query',
dataset: {
dataSource: {
id: 'test-id',
meta: {
name: 'test-name',
sessionId: 'test-session',
},
},
},
},
format: 'jdbc',
lang: 'sql',
},
};
});

describe('describeQuery', () => {
it('should handle request with complete dataset information', async () => {
mockClient.mockResolvedValue({ result: 'success' });

const result = await facet.describeQuery(mockContext, mockRequest);

expect(result).toEqual({ success: true, data: { result: 'success' } });
expect(mockClient).toHaveBeenCalledWith('test-endpoint', {
body: {
query: 'test query',
datasource: 'test-name',
sessionId: 'test-session',
lang: 'sql',
},
});
});

it('should handle request with missing dataSource', async () => {
mockRequest.body.query.dataset.dataSource = undefined;
mockClient.mockResolvedValue({ result: 'success' });

const result = await facet.describeQuery(mockContext, mockRequest);

expect(result).toEqual({ success: true, data: { result: 'success' } });
expect(mockClient).toHaveBeenCalledWith('test-endpoint', {
body: {
query: 'test query',
lang: 'sql',
},
});
});

it('should handle request with missing dataset', async () => {
mockRequest.body.query.dataset = undefined;
mockClient.mockResolvedValue({ result: 'success' });

const result = await facet.describeQuery(mockContext, mockRequest);

expect(result).toEqual({ success: true, data: { result: 'success' } });
expect(mockClient).toHaveBeenCalledWith('test-endpoint', {
body: {
query: 'test query',
lang: 'sql',
},
});
});

it('should handle errors', async () => {
const error = new Error('Test error');
mockClient.mockRejectedValue(error);

const result = await facet.describeQuery(mockContext, mockRequest);

expect(result).toEqual({ success: false, data: error });
expect(mockLogger.error).toHaveBeenCalledWith(
'Facet fetch: test-endpoint: Error: Test error'
);
});
});
});
4 changes: 2 additions & 2 deletions src/plugins/query_enhancements/server/utils/facet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ export class Facet {
): Promise<FacetResponse> => {
try {
const query: Query = request.body.query;
const { dataSource } = query.dataset!;
const { meta } = dataSource!;
const dataSource = query.dataset?.dataSource;
const meta = dataSource?.meta;
const { format, lang } = request.body;
const params = {
body: {
Expand Down

0 comments on commit d21fda9

Please sign in to comment.