Skip to content

Commit 87f4edb

Browse files
committed
loader in expressions
1 parent 59c73f9 commit 87f4edb

10 files changed

Lines changed: 80 additions & 26 deletions

File tree

src/platform/plugins/shared/data/common/search/expressions/esaggs/request_handler.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { defer } from 'rxjs';
1313
import { map, switchMap } from 'rxjs';
1414
import type { Adapters } from '@kbn/inspector-plugin/common';
1515
import type { DataView } from '@kbn/data-views-plugin/common';
16-
import type { Filter, TimeRange } from '@kbn/es-query';
16+
import type { Filter, ProjectRouting, TimeRange } from '@kbn/es-query';
1717

1818
import type { Query } from '../../..';
1919
import { calculateBounds } from '../../..';
@@ -38,6 +38,7 @@ export interface RequestHandlerParams {
3838
executionContext?: KibanaExecutionContext;
3939
title?: string;
4040
description?: string;
41+
projectRouting?: ProjectRouting;
4142
}
4243

4344
export const handleRequest = ({
@@ -56,6 +57,7 @@ export const handleRequest = ({
5657
executionContext,
5758
title,
5859
description,
60+
projectRouting,
5961
}: RequestHandlerParams) => {
6062
return defer(async () => {
6163
const forceNow = getNow?.();
@@ -107,6 +109,10 @@ export const handleRequest = ({
107109
requestSearchSource.setField('filter', filters);
108110
requestSearchSource.setField('query', query);
109111

112+
if (projectRouting) {
113+
requestSearchSource.setField('projectRouting', projectRouting);
114+
}
115+
110116
return { allTimeFields, forceNow, requestSearchSource };
111117
}).pipe(
112118
switchMap(({ allTimeFields, forceNow, requestSearchSource }) =>

src/platform/plugins/shared/data/common/search/search_source/search_source.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,8 @@ export class SearchSource {
680680
return addToBody(key, sort);
681681
case 'pit':
682682
return addToRoot(key, val);
683+
case 'projectRouting':
684+
return addToRoot('project_routing', val);
683685
case 'aggs':
684686
if ((val as unknown) instanceof AggConfigs) {
685687
return addToBody('aggs', val.toDsl());

src/platform/plugins/shared/data/common/search/search_source/types.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
import type { estypes } from '@elastic/elasticsearch';
1111
import type { RequestAdapter } from '@kbn/inspector-plugin/common';
12-
import type { AggregateQuery, Filter, Query } from '@kbn/es-query';
12+
import type { AggregateQuery, Filter, ProjectRouting, Query } from '@kbn/es-query';
1313
import type { Serializable, SerializableRecord } from '@kbn/utility-types';
1414
import type { PersistableStateService } from '@kbn/kibana-utils-plugin/common';
1515
import type { ISearchOptions } from '@kbn/search-types';
@@ -116,6 +116,10 @@ export interface SearchSourceFields {
116116
* Allow querying to use a point-in-time ID for paging results
117117
*/
118118
pit?: estypes.SearchPointInTimeReference;
119+
/**
120+
* {@link ProjectRouting}
121+
*/
122+
projectRouting?: ProjectRouting;
119123

120124
parent?: SearchSourceFields;
121125
}
@@ -164,6 +168,10 @@ export type SerializedSearchSourceFields = {
164168
searchAfter?: estypes.SortResults;
165169
timeout?: string;
166170
terminate_after?: number;
171+
/**
172+
* {@link ProjectRouting}
173+
*/
174+
projectRouting?: ProjectRouting;
167175

168176
parent?: SerializedSearchSourceFields;
169177
};

src/platform/plugins/shared/data/public/search/expressions/esaggs.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ export function getFunctionDefinition({
6767
}).pipe(
6868
switchMap(({ aggConfigs, indexPattern, searchSource, getNow, handleEsaggsRequest }) => {
6969
const { disableWarningToasts } = getSearchContext();
70+
const projectRouting = get(input, 'projectRouting', undefined);
7071

7172
return handleEsaggsRequest({
7273
abortSignal,
@@ -82,6 +83,7 @@ export function getFunctionDefinition({
8283
disableWarningToasts: (disableWarningToasts || false) as boolean,
8384
getNow,
8485
executionContext: getExecutionContext(),
86+
projectRouting,
8587
});
8688
})
8789
);

src/platform/plugins/shared/data/server/search/expressions/esaggs.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ export function getFunctionDefinition({
7575
disableWarningToasts: false,
7676
timeFields: args.timeFields,
7777
timeRange: get(input, 'timeRange', undefined),
78+
projectRouting: get(input, 'projectRouting', undefined),
7879
})
7980
)
8081
);

src/platform/plugins/shared/expressions/public/loader.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -172,11 +172,18 @@ export class ExpressionLoader {
172172
}
173173

174174
if (params.searchContext) {
175-
this.params.searchContext = defaults(
176-
{},
177-
params.searchContext,
178-
this.params.searchContext || {}
179-
);
175+
console.log('searchContext in setParams:', {}, params.searchContext, this.params.searchContext);
176+
console.log('searchContext in setParams:', defaults(
177+
{},
178+
params.searchContext,
179+
this.params.searchContext || {}
180+
));
181+
182+
this.params.searchContext = defaults(
183+
{},
184+
params.searchContext,
185+
this.params.searchContext || {}
186+
);
180187
}
181188
if (params.uiState && this.params) {
182189
this.params.uiState = params.uiState;

src/platform/plugins/shared/unified_search/public/project_picker/project_picker.tsx

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,11 @@ export const ProjectPicker = ({ projectRouting, onProjectRoutingChange }: Projec
195195
const originProject: Project = Object.values(response.origin)[0];
196196

197197
const projects =
198-
projectRouting === '_alias:_origin' ? [originProject] : [originProject, ...linkedProjects];
198+
projectRouting === '_alias:_origin'
199+
? [originProject]
200+
: projectRouting === '_alias:*' || projectRouting === undefined
201+
? [originProject, ...linkedProjects]
202+
: [originProject, ...linkedProjects];
199203

200204
useEffect(() => {
201205
// TODO: replace with fetch linked projects from cross project API
@@ -293,25 +297,39 @@ export const ProjectPicker = ({ projectRouting, onProjectRoutingChange }: Projec
293297
<EuiButtonGroup
294298
isFullWidth
295299
legend={strings.getProjectPickerButtonAriaLabel()}
296-
idSelected={projectRouting ?? '_alias:*'}
300+
idSelected={projectRouting ?? 'undefined'}
297301
options={[
298302
{
299303
id: '_alias:*',
300304
value: '_alias:*',
301305
label: i18n.translate('unifiedSearch.projectPicker.allProjectsLabel', {
302-
defaultMessage: 'All projects',
306+
defaultMessage: 'All projects (explicit)',
303307
}),
304308
},
305309
{
306310
id: '_alias:_origin',
307311
value: '_alias:_origin',
308312
label: strings.getOriginProjectLabel(),
309313
},
314+
{
315+
id: 'undefined',
316+
value: 'undefined',
317+
label: i18n.translate('unifiedSearch.projectPicker.undefinedLabel', {
318+
defaultMessage: 'Undefined (test)',
319+
}),
320+
},
310321
]}
311322
onChange={(value: string) => {
312323
// TODO: add telemetry for project scope change?
313-
const newProjectRouting: ProjectRouting =
314-
value === '_alias:_origin' ? '_alias:_origin' : '_alias:*';
324+
let newProjectRouting: ProjectRouting | undefined;
325+
if (value === '_alias:_origin') {
326+
newProjectRouting = '_alias:_origin';
327+
} else if (value === '_alias:*') {
328+
newProjectRouting = '_alias:*';
329+
} else {
330+
newProjectRouting = undefined;
331+
}
332+
console.log('[ProjectPicker] onChange:', { value, newProjectRouting });
315333
onProjectRoutingChange?.(newProjectRouting);
316334
}}
317335
css={{ margin: '8px' }}
@@ -333,7 +351,9 @@ export const ProjectPicker = ({ projectRouting, onProjectRoutingChange }: Projec
333351
defaultMessage="Searching across {numberOfProjects, plural, one {# project} other {# projects}}"
334352
values={{
335353
numberOfProjects:
336-
projectRouting === '_alias:_origin' ? 1 : linkedProjects.length + 1,
354+
projectRouting === '_alias:_origin'
355+
? 1
356+
: linkedProjects.length + 1,
337357
}}
338358
/>
339359
</h6>

x-pack/platform/plugins/shared/lens/public/app_plugin/lens_top_nav.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,9 +1008,9 @@ export const LensTopNavMenu = ({
10081008
if (value !== projectRouting) {
10091009
const newProjectRouting = value === '_alias:*' ? undefined : value;
10101010
// Start a new search session when project routing changes
1011-
console.log('Project routing changed from:', projectRouting, 'to:', newProjectRouting);
1011+
console.log('Project routing changed from:', projectRouting, 'to:', value);
10121012
dispatchSetState({
1013-
projectRouting: newProjectRouting,
1013+
projectRouting: value,
10141014
searchSessionId: data.search.session.start(),
10151015
resolvedDateRange: getResolvedDateRange(data.query.timefilter.timefilter),
10161016
});

x-pack/platform/plugins/shared/lens/public/react_embeddable/expressions/merged_search_context.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export interface MergedSearchContext {
2626
filters: Filter[];
2727
disableWarningToasts: boolean;
2828
esqlVariables?: ESQLControlVariable[];
29+
projectRouting?: ProjectRouting;
2930
}
3031

3132
export function getMergedSearchContext(
@@ -35,11 +36,13 @@ export function getMergedSearchContext(
3536
query,
3637
timeRange,
3738
esqlVariables,
39+
projectRouting,
3840
}: {
3941
filters?: Filter[];
4042
query?: Query | AggregateQuery;
4143
timeRange?: TimeRange;
4244
esqlVariables?: ESQLControlVariable[];
45+
projectRouting?: ProjectRouting;
4346
},
4447
customTimeRange$: PublishingSubject<TimeRange | undefined>,
4548
parentApi: unknown,
@@ -70,6 +73,7 @@ export function getMergedSearchContext(
7073
query: [attributes.state.query].filter(nonNullable),
7174
filters: injectFilterReferences(attributes.state.filters || [], attributes.references),
7275
disableWarningToasts: true,
76+
projectRouting,
7377
};
7478
// Prepend query and filters from dashboard to the visualization ones
7579
if (query) {

x-pack/platform/plugins/shared/lens/public/state_management/selectors.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -60,17 +60,21 @@ export const selectExecutionContext = createSelector(
6060
})
6161
);
6262

63-
export const selectExecutionContextSearch = createSelector(selectExecutionContext, (res) => ({
64-
now: res.now,
65-
query: isOfAggregateQueryType(res.query) ? undefined : res.query,
66-
timeRange: {
67-
from: res.dateRange.fromDate,
68-
to: res.dateRange.toDate,
69-
},
70-
filters: res.filters,
71-
disableWarningToasts: true,
72-
projectRouting: res.projectRouting,
73-
}));
63+
export const selectExecutionContextSearch = createSelector(selectExecutionContext, (res) => {
64+
const result = {
65+
now: res.now,
66+
query: isOfAggregateQueryType(res.query) ? undefined : res.query,
67+
timeRange: {
68+
from: res.dateRange.fromDate,
69+
to: res.dateRange.toDate,
70+
},
71+
filters: res.filters,
72+
disableWarningToasts: true,
73+
projectRouting: res.projectRouting,
74+
};
75+
console.log('[selectExecutionContextSearch] projectRouting:', res.projectRouting);
76+
return result;
77+
});
7478

7579
const selectInjectedDependencies = (_state: LensState, dependencies: unknown) => dependencies;
7680

0 commit comments

Comments
 (0)