From ed2bac360e8189625951fc04c1227e0cf1ee9b66 Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Thu, 6 Feb 2020 12:21:40 +0100 Subject: [PATCH] [Lens] Make field stats work for index patterns without time fields (#56759) * Fix field stats not loaded without time field * Add integration test for API * Add unit test for API call * Correct typo in comment --- .../indexpattern_plugin/field_item.test.tsx | 18 ++++++++++++++++++ .../plugins/lens/server/routes/field_stats.ts | 14 +++++++++----- .../api_integration/apis/lens/field_stats.ts | 18 ++++++++++++++++++ 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/field_item.test.tsx b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/field_item.test.tsx index 1b49eb6bca7fa..62e2e628c254f 100644 --- a/x-pack/legacy/plugins/lens/public/indexpattern_plugin/field_item.test.tsx +++ b/x-pack/legacy/plugins/lens/public/indexpattern_plugin/field_item.test.tsx @@ -90,6 +90,24 @@ describe('IndexPattern Field Item', () => { } as unknown) as FieldFormatsStart; }); + it('should request field stats without a time field, if the index pattern has none', async () => { + indexPattern.timeFieldName = undefined; + core.http.post.mockImplementationOnce(() => { + return Promise.resolve({}); + }); + const wrapper = mountWithIntl(); + wrapper.find('[data-test-subj="lnsFieldListPanelField-bytes"]').simulate('click'); + + expect(core.http.post).toHaveBeenCalledWith( + '/api/lens/index_stats/my-fake-index-pattern/field', + expect.anything() + ); + // Function argument types not detected correctly (https://github.com/microsoft/TypeScript/issues/26591) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const { body } = (core.http.post.mock.calls[0] as any)[1]; + expect(JSON.parse(body)).not.toHaveProperty('timeFieldName'); + }); + it('should request field stats every time the button is clicked', async () => { let resolveFunction: (arg: unknown) => void; diff --git a/x-pack/plugins/lens/server/routes/field_stats.ts b/x-pack/plugins/lens/server/routes/field_stats.ts index ceefb492cdabe..786aba5efe3fb 100644 --- a/x-pack/plugins/lens/server/routes/field_stats.ts +++ b/x-pack/plugins/lens/server/routes/field_stats.ts @@ -27,7 +27,7 @@ export async function initFieldsRoute(setup: CoreSetup) { dslQuery: schema.object({}, { allowUnknowns: true }), fromDate: schema.string(), toDate: schema.string(), - timeFieldName: schema.string(), + timeFieldName: schema.maybe(schema.string()), field: schema.object( { name: schema.string(), @@ -46,9 +46,8 @@ export async function initFieldsRoute(setup: CoreSetup) { const { fromDate, toDate, timeFieldName, field, dslQuery } = req.body; try { - const query = { - bool: { - filter: [ + const filter = timeFieldName + ? [ { range: { [timeFieldName]: { @@ -58,7 +57,12 @@ export async function initFieldsRoute(setup: CoreSetup) { }, }, dslQuery, - ], + ] + : [dslQuery]; + + const query = { + bool: { + filter, }, }; diff --git a/x-pack/test/api_integration/apis/lens/field_stats.ts b/x-pack/test/api_integration/apis/lens/field_stats.ts index b2bb791e2da7f..51d81668d275d 100644 --- a/x-pack/test/api_integration/apis/lens/field_stats.ts +++ b/x-pack/test/api_integration/apis/lens/field_stats.ts @@ -47,6 +47,24 @@ export default ({ getService }: FtrProviderContext) => { .expect(404); }); + it('should also work without specifying a time field', async () => { + const { body } = await supertest + .post('/api/lens/index_stats/logstash-2015.09.22/field') + .set(COMMON_HEADERS) + .send({ + dslQuery: { match_all: {} }, + fromDate: TEST_START_TIME, + toDate: TEST_END_TIME, + field: { + name: 'bytes', + type: 'number', + }, + }) + .expect(200); + + expect(body).to.have.property('totalDocuments', 4633); + }); + it('should return an auto histogram for numbers and top values', async () => { const { body } = await supertest .post('/api/lens/index_stats/logstash-2015.09.22/field')