Skip to content

Commit

Permalink
[TSVB] Rollup Search - override index pattern functionality is not wo…
Browse files Browse the repository at this point in the history
…rking with Rollup search (#36641) (#37078)
  • Loading branch information
alexwizp authored May 24, 2019
1 parent ed5fe5f commit d710b06
Show file tree
Hide file tree
Showing 33 changed files with 168 additions and 172 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,32 +18,32 @@
*/
import { uniq } from 'lodash';

export function extractIndexPatterns(params, fetchedFields = {}) {
const patternsToFetch = [];
export function extractIndexPatterns(panel, excludedFields = {}) {
const patterns = [];

if (!fetchedFields[params.index_pattern]) {
patternsToFetch.push(params.index_pattern);
if (!excludedFields[panel.index_pattern]) {
patterns.push(panel.index_pattern);
}

params.series.forEach(series => {
panel.series.forEach(series => {
const indexPattern = series.series_index_pattern;
if (series.override_index_pattern && !fetchedFields[indexPattern]) {
patternsToFetch.push(indexPattern);
if (indexPattern && series.override_index_pattern && !excludedFields[indexPattern]) {
patterns.push(indexPattern);
}
});

if (params.annotations) {
params.annotations.forEach(item => {
if (panel.annotations) {
panel.annotations.forEach(item => {
const indexPattern = item.index_pattern;
if (indexPattern && !fetchedFields[indexPattern]) {
patternsToFetch.push(indexPattern);
if (indexPattern && !excludedFields[indexPattern]) {
patterns.push(indexPattern);
}
});
}

if (patternsToFetch.length === 0) {
patternsToFetch.push('');
if (patterns.length === 0) {
patterns.push('');
}

return uniq(patternsToFetch).sort();
return uniq(patterns).sort();
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,49 +17,51 @@
* under the License.
*/

import { extractIndexPatterns } from '../extract_index_patterns';
import { expect } from 'chai';
import { extractIndexPatterns } from './extract_index_patterns';

describe('extractIndexPatterns(vis)', () => {
let visParams;
let visFields;

beforeEach(() => {
visFields = {
'*': []
'*': [],
};
visParams = {
index_pattern: '*',
series: [
{
override_index_pattern: 1,
series_index_pattern: 'example-1-*'
series_index_pattern: 'example-1-*',
},
{
override_index_pattern: 1,
series_index_pattern: 'example-2-*'
}
series_index_pattern: 'example-2-*',
},
],
annotations: [
{ index_pattern: 'notes-*' },
{ index_pattern: 'example-1-*' }
]
{ index_pattern: 'example-1-*' },
],
};
});

it('should return index patterns', () => {
test('should return index patterns', () => {
visFields = {};
expect(extractIndexPatterns(visParams, visFields)).to.eql([

expect(extractIndexPatterns(visParams, visFields)).toEqual([
'*',
'example-1-*',
'example-2-*',
'notes-*'
'notes-*',
]);
});

it('should return index patterns that do not exist in visFields', () => {
expect(extractIndexPatterns(visParams, visFields)).to.eql([
test('should return index patterns that do not exist in visFields', () => {
expect(extractIndexPatterns(visParams, visFields)).toEqual([
'example-1-*',
'example-2-*',
'notes-*'
'notes-*',
]);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import VisPicker from './vis_picker';
import PanelConfig from './panel_config';
import brushHandler from '../lib/create_brush_handler';
import { fetchFields } from '../lib/fetch_fields';
import { extractIndexPatterns } from '../lib/extract_index_patterns';
import { extractIndexPatterns } from '../../common/extract_index_patterns';

const VIS_STATE_DEBOUNCE_DELAY = 200;

Expand Down
2 changes: 1 addition & 1 deletion src/legacy/core_plugins/metrics/public/lib/fetch_fields.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import { kfetch } from 'ui/kfetch';
import { toastNotifications } from 'ui/notify';
import { i18n } from '@kbn/i18n';
import { extractIndexPatterns } from './extract_index_patterns';
import { extractIndexPatterns } from '../../common/extract_index_patterns';

export async function fetchFields(indexPatterns = ['*']) {
const patterns = Array.isArray(indexPatterns) ? indexPatterns : [indexPatterns];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,8 @@ const getTimezoneFromRequest = request => {
};

export class DefaultSearchCapabilities {
constructor(request, batchRequestsSupport, fieldsCapabilities = {}) {
constructor(request, fieldsCapabilities = {}) {
this.request = request;
this.batchRequestsSupport = batchRequestsSupport;
this.fieldsCapabilities = fieldsCapabilities;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,15 @@ import { DefaultSearchCapabilities } from './default_search_capabilities';

describe('DefaultSearchCapabilities', () => {
let defaultSearchCapabilities;
let batchRequestsSupport;
let req;

beforeEach(() => {
req = {};
batchRequestsSupport = true;
defaultSearchCapabilities = new DefaultSearchCapabilities(req, batchRequestsSupport);
defaultSearchCapabilities = new DefaultSearchCapabilities(req);
});

test('should init default search capabilities', () => {
expect(defaultSearchCapabilities.request).toBe(req);
expect(defaultSearchCapabilities.batchRequestsSupport).toBe(batchRequestsSupport);
expect(defaultSearchCapabilities.fieldsCapabilities).toEqual({});
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ import { AbstractSearchRequest } from './searh_requests/abstract_request';
import { DefaultSearchStrategy } from './strategies/default_search_strategy';
import { DefaultSearchCapabilities } from './default_search_capabilities';

import { extractIndexPatterns } from '../../../common/extract_index_patterns';

const strategies = [];

const addStrategy = searchStrategy => {
Expand Down Expand Up @@ -52,4 +54,10 @@ export class SearchStrategiesRegister {
}
}
}

static async getViableStrategyForPanel(req, panel) {
const indexPattern = extractIndexPatterns(panel).join(',');

return SearchStrategiesRegister.getViableStrategy(req, indexPattern);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,9 @@
* under the License.
*/
export class AbstractSearchRequest {
constructor(req, callWithRequest, indexPattern) {
constructor(req, callWithRequest) {
this.req = req;
this.callWithRequest = callWithRequest;
this.indexPattern = indexPattern;
}

search() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,16 @@ describe('AbstractSearchRequest', () => {
let searchRequest;
let req;
let callWithRequest;
let indexPattern;

beforeEach(() => {
req = {};
callWithRequest = jest.fn();
indexPattern = 'indexPattern';
searchRequest = new AbstractSearchRequest(req, callWithRequest, indexPattern);
searchRequest = new AbstractSearchRequest(req, callWithRequest);
});

test('should init an AbstractSearchRequest instance', () => {
expect(searchRequest.req).toBe(req);
expect(searchRequest.callWithRequest).toBe(callWithRequest);
expect(searchRequest.indexPattern).toBe(indexPattern);
expect(searchRequest.search).toBeDefined();
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,19 @@ import { AbstractSearchRequest } from './abstract_request';
const SEARCH_METHOD = 'msearch';

export class MultiSearchRequest extends AbstractSearchRequest {
async search(options) {
async search(searches) {
const includeFrozen = await this.req.getUiSettingsService().get('search:includeFrozen');
const multiSearchBody = searches.reduce((acc, { body, index }) => ([
...acc,
{
index,
ignoreUnavailable: true,
},
body,
]), []);

const { responses } = await this.callWithRequest(this.req, SEARCH_METHOD, {
...options,
body: multiSearchBody,
rest_total_hits_as_int: true,
ignore_throttled: !includeFrozen,
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,38 +22,43 @@ describe('MultiSearchRequest', () => {
let searchRequest;
let req;
let callWithRequest;
let indexPattern;
let getServiceMock;
let includeFrozen;

beforeEach(() => {
includeFrozen = false;
getServiceMock = jest.fn().mockResolvedValue(includeFrozen);
req = {
getUiSettingsService: jest.fn().mockReturnValue({ get: getServiceMock })
getUiSettingsService: jest.fn().mockReturnValue({ get: getServiceMock }),
};
callWithRequest = jest.fn().mockReturnValue({ responses: [] });
indexPattern = 'indexPattern';
searchRequest = new MultiSearchRequest(req, callWithRequest, indexPattern);
searchRequest = new MultiSearchRequest(req, callWithRequest);
});

test('should init an MultiSearchRequest instance', () => {
expect(searchRequest.req).toBe(req);
expect(searchRequest.callWithRequest).toBe(callWithRequest);
expect(searchRequest.indexPattern).toBe(indexPattern);
expect(searchRequest.search).toBeDefined();
});

test('should get the response from elastic msearch', async () => {
const options = {};
const searches = [
{ body: 'body1', index: 'index' },
{ body: 'body2', index: 'index' },
];

const responses = await searchRequest.search(options);
const responses = await searchRequest.search(searches);

expect(responses).toEqual([]);
expect(req.getUiSettingsService).toHaveBeenCalled();
expect(getServiceMock).toHaveBeenCalledWith('search:includeFrozen');
expect(callWithRequest).toHaveBeenCalledWith(req, 'msearch', {
...options,
body: [
{ ignoreUnavailable: true, index: 'index' },
'body1',
{ ignoreUnavailable: true, index: 'index' },
'body2',
],
rest_total_hits_as_int: true,
ignore_throttled: !includeFrozen,
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@ import { MultiSearchRequest } from './multi_search_request';
import { SingleSearchRequest } from './single_search_request';

export class SearchRequest extends AbstractSearchRequest {
getSearchRequestType(options) {
const isMultiSearch = Array.isArray(options.body);
getSearchRequestType(searches) {
const isMultiSearch = Array.isArray(searches) && searches.length > 1;
const SearchRequest = isMultiSearch ? MultiSearchRequest : SingleSearchRequest;

return new SearchRequest(this.req, this.callWithRequest, this.indexPattern);
return new SearchRequest(this.req, this.callWithRequest);
}

async search(options) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,31 +24,28 @@ describe('SearchRequest', () => {
let searchRequest;
let req;
let callWithRequest;
let indexPattern;
let getServiceMock;
let includeFrozen;

beforeEach(() => {
includeFrozen = false;
getServiceMock = jest.fn().mockResolvedValue(includeFrozen);
req = {
getUiSettingsService: jest.fn().mockReturnValue({ get: getServiceMock })
getUiSettingsService: jest.fn().mockReturnValue({ get: getServiceMock }),
};
callWithRequest = jest.fn().mockReturnValue({ responses: [] });
indexPattern = 'indexPattern';
searchRequest = new SearchRequest(req, callWithRequest, indexPattern);
searchRequest = new SearchRequest(req, callWithRequest);
});

test('should init an AbstractSearchRequest instance', () => {
expect(searchRequest.req).toBe(req);
expect(searchRequest.callWithRequest).toBe(callWithRequest);
expect(searchRequest.indexPattern).toBe(indexPattern);
expect(searchRequest.search).toBeDefined();
});

test('should return search value', async () => {
const concreteSearchRequest = {
search: jest.fn().mockReturnValue('concreteSearchRequest')
search: jest.fn().mockReturnValue('concreteSearchRequest'),
};
const options = {};
searchRequest.getSearchRequestType = jest.fn().mockReturnValue(concreteSearchRequest);
Expand All @@ -58,20 +55,18 @@ describe('SearchRequest', () => {
expect(result).toBe('concreteSearchRequest');
});

test('should return a MultiSearchRequest if options has body as an array', () => {
const options = {
body: []
};
test('should return a MultiSearchRequest for multi searches', () => {
const searches = [{ index: 'index', body: 'body' }, { index: 'index', body: 'body' }];

const result = searchRequest.getSearchRequestType(options);
const result = searchRequest.getSearchRequestType(searches);

expect(result instanceof MultiSearchRequest).toBe(true);
});

test('should return a SingleSearchRequest if options has body', () => {
const options = {};
test('should return a SingleSearchRequest for single search', () => {
const searches = [{ index: 'index', body: 'body' }];

const result = searchRequest.getSearchRequestType(options);
const result = searchRequest.getSearchRequestType(searches);

expect(result instanceof SingleSearchRequest).toBe(true);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ import { AbstractSearchRequest } from './abstract_request';
const SEARCH_METHOD = 'search';

export class SingleSearchRequest extends AbstractSearchRequest {
async search(options) {
async search([{ body, index }]) {
const includeFrozen = await this.req.getUiSettingsService().get('search:includeFrozen');
const resp = await this.callWithRequest(this.req, SEARCH_METHOD, {
...options,
index: this.indexPattern,
ignore_throttled: !includeFrozen,
body,
index,
});

return [resp];
Expand Down
Loading

0 comments on commit d710b06

Please sign in to comment.