Skip to content

Commit f43e65a

Browse files
[ML]DF Analytics exploration: default filter of results page by defaultIsTraining value in url (#78303)
* df exploration page: handle default isTraining filter in url * default training query updated to match what the searchBar would produce. fixes evaluate panel dataset label * clear defaultIsTraining filter from url once applied
1 parent 9882afc commit f43e65a

11 files changed

Lines changed: 80 additions & 34 deletions

File tree

x-pack/plugins/ml/common/types/ml_url_generator.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ export interface DataFrameAnalyticsExplorationQueryState {
167167
ml: {
168168
jobId: JobId;
169169
analysisType: DataFrameAnalysisConfigType;
170+
defaultIsTraining?: boolean;
170171
};
171172
}
172173

@@ -176,6 +177,7 @@ export type DataFrameAnalyticsExplorationUrlState = MLPageState<
176177
jobId: JobId;
177178
analysisType: DataFrameAnalysisConfigType;
178179
globalState?: MlCommonGlobalState;
180+
defaultIsTraining?: boolean;
179181
}
180182
>;
181183

x-pack/plugins/ml/public/application/data_frame_analytics/common/analytics.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,17 @@ export const defaultSearchQuery = {
6767
match_all: {},
6868
};
6969

70+
export const getDefaultTrainingFilterQuery = (resultsField: string, isTraining: boolean) => ({
71+
bool: {
72+
minimum_should_match: 1,
73+
should: [
74+
{
75+
match: { [`${resultsField}.is_training`]: isTraining },
76+
},
77+
],
78+
},
79+
});
80+
7081
export interface SearchQuery {
7182
track_total_hits?: boolean;
7283
query: SavedSearchQuery;

x-pack/plugins/ml/public/application/data_frame_analytics/common/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export {
88
getAnalysisType,
99
getDependentVar,
1010
getPredictionFieldName,
11+
getDefaultTrainingFilterQuery,
1112
isOutlierAnalysis,
1213
refreshAnalyticsList$,
1314
useRefreshAnalyticsList,

x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/classification_exploration.tsx

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,20 @@ import { EvaluatePanel } from './evaluate_panel';
1313

1414
interface Props {
1515
jobId: string;
16+
defaultIsTraining?: boolean;
1617
}
1718

18-
export const ClassificationExploration: FC<Props> = ({ jobId }) => {
19-
return (
20-
<ExplorationPageWrapper
21-
jobId={jobId}
22-
title={i18n.translate(
23-
'xpack.ml.dataframe.analytics.classificationExploration.tableJobIdTitle',
24-
{
25-
defaultMessage: 'Destination index for classification job ID {jobId}',
26-
values: { jobId },
27-
}
28-
)}
29-
EvaluatePanel={EvaluatePanel}
30-
/>
31-
);
32-
};
19+
export const ClassificationExploration: FC<Props> = ({ jobId, defaultIsTraining }) => (
20+
<ExplorationPageWrapper
21+
jobId={jobId}
22+
title={i18n.translate(
23+
'xpack.ml.dataframe.analytics.classificationExploration.tableJobIdTitle',
24+
{
25+
defaultMessage: 'Destination index for classification job ID {jobId}',
26+
values: { jobId },
27+
}
28+
)}
29+
EvaluatePanel={EvaluatePanel}
30+
defaultIsTraining={defaultIsTraining}
31+
/>
32+
);

x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_page_wrapper/exploration_page_wrapper.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,15 @@ interface Props {
2727
jobId: string;
2828
title: string;
2929
EvaluatePanel: FC<EvaluatePanelProps>;
30+
defaultIsTraining?: boolean;
3031
}
3132

32-
export const ExplorationPageWrapper: FC<Props> = ({ jobId, title, EvaluatePanel }) => {
33+
export const ExplorationPageWrapper: FC<Props> = ({
34+
jobId,
35+
title,
36+
EvaluatePanel,
37+
defaultIsTraining,
38+
}) => {
3339
const {
3440
indexPattern,
3541
isInitialized,
@@ -70,6 +76,7 @@ export const ExplorationPageWrapper: FC<Props> = ({ jobId, title, EvaluatePanel
7076
needsDestIndexPattern={needsDestIndexPattern}
7177
setEvaluateSearchQuery={setSearchQuery}
7278
title={title}
79+
defaultIsTraining={defaultIsTraining}
7380
/>
7481
)}
7582
</>

x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_query_bar/exploration_query_bar.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ export const ExplorationQueryBar: FC<ExplorationQueryBarProps> = ({
5252
if (defaultQueryString !== undefined) {
5353
setSearchInput({ query: defaultQueryString, language: SEARCH_QUERY_LANGUAGE.KUERY });
5454
}
55-
}, []);
55+
}, [defaultQueryString !== undefined]);
5656

5757
const searchChangeHandler = (query: Query) => setSearchInput(query);
5858
const searchSubmitHandler = (query: Query) => {

x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/exploration_results_table.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
SEARCH_SIZE,
2121
defaultSearchQuery,
2222
getAnalysisType,
23+
getDefaultTrainingFilterQuery,
2324
} from '../../../../common';
2425
import { getTaskStateBadge } from '../../../analytics_management/components/analytics_list/use_columns';
2526
import { DATA_FRAME_TASK_STATE } from '../../../analytics_management/components/analytics_list/common';
@@ -30,6 +31,7 @@ import { IndexPatternPrompt } from '../index_pattern_prompt';
3031
import { useExplorationResults } from './use_exploration_results';
3132
import { useMlKibana } from '../../../../../contexts/kibana';
3233
import { DataFrameAnalysisConfigType } from '../../../../../../../common/types/data_frame_analytics';
34+
import { useUrlState } from '../../../../../util/url_state';
3335

3436
const showingDocs = i18n.translate(
3537
'xpack.ml.dataframe.analytics.explorationResults.documentsShownHelpText',
@@ -53,6 +55,7 @@ interface Props {
5355
needsDestIndexPattern: boolean;
5456
setEvaluateSearchQuery: React.Dispatch<React.SetStateAction<object>>;
5557
title: string;
58+
defaultIsTraining?: boolean;
5659
}
5760

5861
export const ExplorationResultsTable: FC<Props> = React.memo(
@@ -63,18 +66,36 @@ export const ExplorationResultsTable: FC<Props> = React.memo(
6366
needsDestIndexPattern,
6467
setEvaluateSearchQuery,
6568
title,
69+
defaultIsTraining,
6670
}) => {
6771
const {
6872
services: {
6973
mlServices: { mlApiServices },
7074
},
7175
} = useMlKibana();
76+
const [globalState, setGlobalState] = useUrlState('_g');
7277
const [searchQuery, setSearchQuery] = useState<SavedSearchQuery>(defaultSearchQuery);
78+
const [defaultQueryString, setDefaultQueryString] = useState<string | undefined>();
7379

7480
useEffect(() => {
7581
setEvaluateSearchQuery(searchQuery);
7682
}, [JSON.stringify(searchQuery)]);
7783

84+
useEffect(() => {
85+
if (defaultIsTraining !== undefined) {
86+
// Apply defaultIsTraining filter
87+
setSearchQuery(
88+
getDefaultTrainingFilterQuery(jobConfig.dest.results_field, defaultIsTraining)
89+
);
90+
setDefaultQueryString(`${jobConfig.dest.results_field}.is_training : ${defaultIsTraining}`);
91+
// Clear defaultIsTraining from url
92+
setGlobalState('ml', {
93+
analysisType: globalState.ml.analysisType,
94+
jobId: globalState.ml.jobId,
95+
});
96+
}
97+
}, []);
98+
7899
const analysisType = getAnalysisType(jobConfig.analysis);
79100

80101
const classificationData = useExplorationResults(
@@ -140,6 +161,7 @@ export const ExplorationResultsTable: FC<Props> = React.memo(
140161
<ExplorationQueryBar
141162
indexPattern={indexPattern}
142163
setSearchQuery={setSearchQuery}
164+
defaultQueryString={defaultQueryString}
143165
/>
144166
</EuiFlexItem>
145167
</EuiFlexGroup>

x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/regression_exploration.tsx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,17 @@ import { EvaluatePanel } from './evaluate_panel';
1414

1515
interface Props {
1616
jobId: string;
17+
defaultIsTraining?: boolean;
1718
}
1819

19-
export const RegressionExploration: FC<Props> = ({ jobId }) => {
20-
return (
21-
<ExplorationPageWrapper
22-
jobId={jobId}
23-
title={i18n.translate('xpack.ml.dataframe.analytics.regressionExploration.tableJobIdTitle', {
24-
defaultMessage: 'Destination index for regression job ID {jobId}',
25-
values: { jobId },
26-
})}
27-
EvaluatePanel={EvaluatePanel}
28-
/>
29-
);
30-
};
20+
export const RegressionExploration: FC<Props> = ({ jobId, defaultIsTraining }) => (
21+
<ExplorationPageWrapper
22+
jobId={jobId}
23+
title={i18n.translate('xpack.ml.dataframe.analytics.regressionExploration.tableJobIdTitle', {
24+
defaultMessage: 'Destination index for regression job ID {jobId}',
25+
values: { jobId },
26+
})}
27+
EvaluatePanel={EvaluatePanel}
28+
defaultIsTraining={defaultIsTraining}
29+
/>
30+
);

x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/page.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ import { DataFrameAnalysisConfigType } from '../../../../../common/types/data_fr
3232
export const Page: FC<{
3333
jobId: string;
3434
analysisType: DataFrameAnalysisConfigType;
35-
}> = ({ jobId, analysisType }) => (
35+
defaultIsTraining?: boolean;
36+
}> = ({ jobId, analysisType, defaultIsTraining }) => (
3637
<Fragment>
3738
<NavigationMenu tabId="data_frame_analytics" />
3839
<EuiPage data-test-subj="mlPageDataFrameAnalyticsExploration">
@@ -70,10 +71,10 @@ export const Page: FC<{
7071
<OutlierExploration jobId={jobId} />
7172
)}
7273
{analysisType === ANALYSIS_CONFIG_TYPE.REGRESSION && (
73-
<RegressionExploration jobId={jobId} />
74+
<RegressionExploration jobId={jobId} defaultIsTraining={defaultIsTraining} />
7475
)}
7576
{analysisType === ANALYSIS_CONFIG_TYPE.CLASSIFICATION && (
76-
<ClassificationExploration jobId={jobId} />
77+
<ClassificationExploration jobId={jobId} defaultIsTraining={defaultIsTraining} />
7778
)}
7879
</EuiPageContentBody>
7980
</EuiPageBody>

x-pack/plugins/ml/public/application/routing/routes/data_frame_analytics/analytics_job_exploration.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,11 @@ const PageWrapper: FC<PageProps> = ({ location, deps }) => {
6767
}
6868
const jobId: string = globalState.ml.jobId;
6969
const analysisType: DataFrameAnalysisConfigType = globalState.ml.analysisType;
70+
const defaultIsTraining: boolean | undefined = globalState.ml.defaultIsTraining;
7071

7172
return (
7273
<PageLoader context={context}>
73-
<Page {...{ jobId, analysisType }} />
74+
<Page {...{ jobId, analysisType, defaultIsTraining }} />
7475
</PageLoader>
7576
);
7677
};

0 commit comments

Comments
 (0)