Skip to content

Commit eb9174a

Browse files
Merge branch 'master' into implement/ftr-configured-users
2 parents 4fe9d22 + dd680c7 commit eb9174a

File tree

6 files changed

+49
-24
lines changed

6 files changed

+49
-24
lines changed

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,15 @@ export function dictionaryToArray<TValue>(dict: Dictionary<TValue>): TValue[] {
1919
export type DeepPartial<T> = {
2020
[P in keyof T]?: DeepPartial<T[P]>;
2121
};
22+
23+
export type DeepReadonly<T> = T extends Array<infer R>
24+
? ReadonlyArray<DeepReadonly<T>>
25+
: T extends Function
26+
? T
27+
: T extends object
28+
? DeepReadonlyObject<T>
29+
: T;
30+
31+
type DeepReadonlyObject<T> = {
32+
readonly [P in keyof T]: DeepReadonly<T[P]>;
33+
};

x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.tsx

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66

77
import { EuiButtonEmpty } from '@elastic/eui';
88
import React, { FC } from 'react';
9-
import { isEqual } from 'lodash';
9+
import { isEqual, cloneDeep } from 'lodash';
1010
import { i18n } from '@kbn/i18n';
11+
import { DeepReadonly } from '../../../../../../../common/types/common';
1112
import { DataFrameAnalyticsConfig, isOutlierAnalysis } from '../../../../common';
1213
import { isClassificationAnalysis, isRegressionAnalysis } from '../../../../common/analytics';
1314
import { CreateAnalyticsFormProps } from '../../hooks/use_create_analytics_form';
@@ -97,6 +98,10 @@ const getAnalyticsJobMeta = (config: CloneDataFrameAnalyticsConfig): AnalyticsJo
9798
num_top_feature_importance_values: {
9899
optional: true,
99100
},
101+
class_assignment_objective: {
102+
optional: true,
103+
defaultValue: 'maximize_minimum_recall',
104+
},
100105
},
101106
}
102107
: {}),
@@ -257,20 +262,25 @@ export type CloneDataFrameAnalyticsConfig = Omit<
257262
'id' | 'version' | 'create_time'
258263
>;
259264

260-
export function extractCloningConfig(
261-
originalConfig: DataFrameAnalyticsConfig
262-
): CloneDataFrameAnalyticsConfig {
263-
const {
264-
// Omit non-relevant props from the configuration
265-
id,
266-
version,
267-
create_time,
268-
...cloneConfig
269-
} = originalConfig;
270-
271-
// Reset the destination index
272-
cloneConfig.dest.index = '';
273-
return cloneConfig;
265+
/**
266+
* Gets complete original configuration as an input
267+
* and returns the config for cloning omitting
268+
* non-relevant parameters and resetting the destination index.
269+
*/
270+
export function extractCloningConfig({
271+
id,
272+
version,
273+
create_time,
274+
...configToClone
275+
}: DeepReadonly<DataFrameAnalyticsConfig>): CloneDataFrameAnalyticsConfig {
276+
return (cloneDeep({
277+
...configToClone,
278+
dest: {
279+
...configToClone.dest,
280+
// Reset the destination index
281+
index: '',
282+
},
283+
}) as unknown) as CloneDataFrameAnalyticsConfig;
274284
}
275285

276286
export function getCloneAction(createAnalyticsForm: CreateAnalyticsFormProps) {
@@ -280,7 +290,7 @@ export function getCloneAction(createAnalyticsForm: CreateAnalyticsFormProps) {
280290

281291
const { actions } = createAnalyticsForm;
282292

283-
const onClick = async (item: DataFrameAnalyticsListRow) => {
293+
const onClick = async (item: DeepReadonly<DataFrameAnalyticsListRow>) => {
284294
await actions.setJobClone(item.config);
285295
};
286296

@@ -294,7 +304,7 @@ export function getCloneAction(createAnalyticsForm: CreateAnalyticsFormProps) {
294304
}
295305

296306
interface CloneActionProps {
297-
item: DataFrameAnalyticsListRow;
307+
item: DeepReadonly<DataFrameAnalyticsListRow>;
298308
createAnalyticsForm: CreateAnalyticsFormProps;
299309
}
300310

x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/actions.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import React from 'react';
88
import { i18n } from '@kbn/i18n';
99
import { EuiButtonEmpty, EuiToolTip } from '@elastic/eui';
10+
import { DeepReadonly } from '../../../../../../../common/types/common';
1011

1112
import {
1213
checkPermission,
@@ -107,7 +108,7 @@ export const getActions = (createAnalyticsForm: CreateAnalyticsFormProps) => {
107108
},
108109
},
109110
{
110-
render: (item: DataFrameAnalyticsListRow) => {
111+
render: (item: DeepReadonly<DataFrameAnalyticsListRow>) => {
111112
return <CloneAction item={item} createAnalyticsForm={createAnalyticsForm} />;
112113
},
113114
},

x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/actions.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
* you may not use this file except in compliance with the Elastic License.
55
*/
66

7+
import { DeepReadonly } from '../../../../../../../common/types/common';
78
import { DataFrameAnalyticsConfig } from '../../../../common';
89
import { FormMessage, State, SourceIndexMap } from './state';
910

@@ -64,7 +65,7 @@ export type Action =
6465
| { type: ACTION.SET_JOB_CONFIG; payload: State['jobConfig'] }
6566
| { type: ACTION.SET_JOB_IDS; jobIds: State['jobIds'] }
6667
| { type: ACTION.SET_ESTIMATED_MODEL_MEMORY_LIMIT; value: State['estimatedModelMemoryLimit'] }
67-
| { type: ACTION.SET_JOB_CLONE; cloneJob: DataFrameAnalyticsConfig };
68+
| { type: ACTION.SET_JOB_CLONE; cloneJob: DeepReadonly<DataFrameAnalyticsConfig> };
6869

6970
// Actions wrapping the dispatcher exposed by the custom hook
7071
export interface ActionDispatchers {
@@ -79,5 +80,5 @@ export interface ActionDispatchers {
7980
startAnalyticsJob: () => void;
8081
switchToAdvancedEditor: () => void;
8182
setEstimatedModelMemoryLimit: (value: State['estimatedModelMemoryLimit']) => void;
82-
setJobClone: (cloneJob: DataFrameAnalyticsConfig) => Promise<void>;
83+
setJobClone: (cloneJob: DeepReadonly<DataFrameAnalyticsConfig>) => Promise<void>;
8384
}

x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*/
66

77
import { EuiComboBoxOptionOption } from '@elastic/eui';
8-
import { DeepPartial } from '../../../../../../../common/types/common';
8+
import { DeepPartial, DeepReadonly } from '../../../../../../../common/types/common';
99
import { checkPermission } from '../../../../../privilege/check_privilege';
1010
import { mlNodesAvailable } from '../../../../../ml_nodes_check';
1111

@@ -91,7 +91,7 @@ export interface State {
9191
jobIds: DataFrameAnalyticsId[];
9292
requestMessages: FormMessage[];
9393
estimatedModelMemoryLimit: string;
94-
cloneJob?: DataFrameAnalyticsConfig;
94+
cloneJob?: DeepReadonly<DataFrameAnalyticsConfig>;
9595
}
9696

9797
export const getInitialState = (): State => ({
@@ -195,7 +195,7 @@ export const getJobConfigFromFormState = (
195195
* For cloning we keep job id and destination index empty.
196196
*/
197197
export function getCloneFormStateFromJobConfig(
198-
analyticsJobConfig: CloneDataFrameAnalyticsConfig
198+
analyticsJobConfig: Readonly<CloneDataFrameAnalyticsConfig>
199199
): Partial<State['form']> {
200200
const jobType = Object.keys(analyticsJobConfig.analysis)[0] as ANALYSIS_CONFIG_TYPE;
201201

x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { i18n } from '@kbn/i18n';
1010

1111
import { SimpleSavedObject } from 'kibana/public';
1212
import { isErrorResponse } from '../../../../../../../common/types/errors';
13+
import { DeepReadonly } from '../../../../../../../common/types/common';
1314
import { ml } from '../../../../../services/ml_api_service';
1415
import { useMlContext } from '../../../../../contexts/ml';
1516

@@ -313,7 +314,7 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => {
313314
dispatch({ type: ACTION.SET_ESTIMATED_MODEL_MEMORY_LIMIT, value });
314315
};
315316

316-
const setJobClone = async (cloneJob: DataFrameAnalyticsConfig) => {
317+
const setJobClone = async (cloneJob: DeepReadonly<DataFrameAnalyticsConfig>) => {
317318
resetForm();
318319
await prepareFormValidation();
319320

0 commit comments

Comments
 (0)