Skip to content

Commit 9ccbbef

Browse files
authored
[ML] Fix "View by" swim lane with applied filter and sorting by score (#105217)
* [ML] fix top influencers fetch with filter selection * [ML] add relative position to the chart container * [ML] fix ts * [ML] fix updating search input from influencer filter
1 parent ff0b0e9 commit 9ccbbef

File tree

10 files changed

+37
-35
lines changed

10 files changed

+37
-35
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ export interface Influencer {
1212
influencer_field_values: string[];
1313
}
1414

15+
export type MLAnomalyDoc = AnomalyRecordDoc;
16+
1517
export interface AnomalyRecordDoc {
1618
[key: string]: any;
1719
job_id: string;

x-pack/plugins/ml/public/application/explorer/actions/load_explorer_data.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,9 @@ const loadExplorerDataProvider = (
223223
swimlaneLimit,
224224
viewByPerPage,
225225
viewByFromPage,
226-
swimlaneContainerWidth
226+
swimlaneContainerWidth,
227+
selectionInfluencers,
228+
influencersFilterQuery
227229
)
228230
: Promise.resolve([]),
229231
}).pipe(

x-pack/plugins/ml/public/application/explorer/components/explorer_query_bar/explorer_query_bar.tsx

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ function getInitSearchInputState({
9595

9696
interface ExplorerQueryBarProps {
9797
filterActive: boolean;
98-
filterIconTriggeredQuery: string;
9998
filterPlaceHolder: string;
10099
indexPattern: IIndexPattern;
101100
queryString?: string;
@@ -104,7 +103,6 @@ interface ExplorerQueryBarProps {
104103

105104
export const ExplorerQueryBar: FC<ExplorerQueryBarProps> = ({
106105
filterActive,
107-
filterIconTriggeredQuery,
108106
filterPlaceHolder,
109107
indexPattern,
110108
queryString,
@@ -116,21 +114,20 @@ export const ExplorerQueryBar: FC<ExplorerQueryBarProps> = ({
116114
);
117115
const [errorMessage, setErrorMessage] = useState<ErrorMessage | undefined>(undefined);
118116

119-
useEffect(() => {
120-
if (filterIconTriggeredQuery !== undefined) {
121-
setSearchInput({
122-
language: searchInput.language,
123-
query: filterIconTriggeredQuery,
124-
});
125-
}
126-
}, [filterIconTriggeredQuery]);
117+
useEffect(
118+
function updateSearchInputFromFilter() {
119+
setSearchInput(getInitSearchInputState({ filterActive, queryString }));
120+
},
121+
[filterActive, queryString]
122+
);
127123

128124
const searchChangeHandler = (query: Query) => {
129125
if (searchInput.language !== query.language) {
130126
updateLanguage(query.language);
131127
}
132128
setSearchInput(query);
133129
};
130+
134131
const applyInfluencersFilterQuery = (query: Query) => {
135132
try {
136133
const { clearSettings, settings } = getKqlQueryValues({

x-pack/plugins/ml/public/application/explorer/explorer.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ const ExplorerPage = ({
8686
filterPlaceHolder,
8787
indexPattern,
8888
queryString,
89-
filterIconTriggeredQuery,
9089
updateLanguage,
9190
}) => (
9291
<div data-test-subj="mlPageAnomalyExplorer">
@@ -121,7 +120,6 @@ const ExplorerPage = ({
121120
filterPlaceHolder={filterPlaceHolder}
122121
indexPattern={indexPattern}
123122
queryString={queryString}
124-
filterIconTriggeredQuery={filterIconTriggeredQuery}
125123
updateLanguage={updateLanguage}
126124
/>
127125
</div>
@@ -151,7 +149,7 @@ export class ExplorerUI extends React.Component {
151149
selectedJobsRunning: PropTypes.bool.isRequired,
152150
};
153151

154-
state = { filterIconTriggeredQuery: undefined, language: DEFAULT_QUERY_LANG };
152+
state = { language: DEFAULT_QUERY_LANG };
155153
htmlIdGen = htmlIdGenerator();
156154

157155
componentDidMount() {
@@ -200,8 +198,6 @@ export class ExplorerUI extends React.Component {
200198
}
201199
}
202200

203-
this.setState({ filterIconTriggeredQuery: `${newQueryString}` });
204-
205201
try {
206202
const { clearSettings, settings } = getKqlQueryValues({
207203
inputString: `${newQueryString}`,
@@ -327,7 +323,6 @@ export class ExplorerUI extends React.Component {
327323
influencers={influencers}
328324
filterActive={filterActive}
329325
filterPlaceHolder={filterPlaceHolder}
330-
filterIconTriggeredQuery={this.state.filterIconTriggeredQuery}
331326
indexPattern={indexPattern}
332327
queryString={queryString}
333328
updateLanguage={this.updateLanguage}

x-pack/plugins/ml/public/application/explorer/explorer_utils.d.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -181,15 +181,6 @@ declare interface LoadOverallDataResponse {
181181
overallSwimlaneData: OverallSwimlaneData;
182182
}
183183

184-
export declare const loadViewByTopFieldValuesForSelectedTime: (
185-
earliestMs: number,
186-
latestMs: number,
187-
selectedJobs: ExplorerJob[],
188-
viewBySwimlaneFieldName: string,
189-
swimlaneLimit: number,
190-
noInfluencersConfigured: boolean
191-
) => Promise<any>;
192-
193184
export declare interface FilterData {
194185
influencersFilterQuery: InfluencersFilterQuery;
195186
filterActive: boolean;

x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,7 @@ export const SwimlaneContainer: FC<SwimlaneProps> = ({
411411
>
412412
<>
413413
<div>
414-
<div style={{ height: `${containerHeight}px` }}>
414+
<div style={{ height: `${containerHeight}px`, position: 'relative' }}>
415415
{showSwimlane && !isLoading && (
416416
<Chart className={'mlSwimLaneContainer'}>
417417
<Settings

x-pack/plugins/ml/public/application/jobs/new_job/common/results_loader/searches.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ export function getScoresByRecord(
7474
timestamp: {
7575
gte: earliestMs,
7676
lte: latestMs,
77+
// @ts-ignore
7778
format: 'epoch_millis',
7879
},
7980
},

x-pack/plugins/ml/public/application/services/anomaly_timeline_service.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import {
2525
} from '../explorer/explorer_utils';
2626
import { OVERALL_LABEL, VIEW_BY_JOB_LABEL } from '../explorer/explorer_constants';
2727
import { MlResultsService } from './results_service';
28+
import { EntityField } from '../../../common/util/anomaly_utils';
29+
import { InfluencersFilterQuery } from '../../../common/types/es_client';
2830

2931
/**
3032
* Service for retrieving anomaly swim lanes data.
@@ -241,7 +243,9 @@ export class AnomalyTimelineService {
241243
swimlaneLimit: number,
242244
perPage: number,
243245
fromPage: number,
244-
swimlaneContainerWidth: number
246+
swimlaneContainerWidth: number,
247+
selectionInfluencers: EntityField[],
248+
influencersFilterQuery: InfluencersFilterQuery
245249
) {
246250
const selectedJobIds = selectedJobs.map((d) => d.id);
247251

@@ -254,7 +258,9 @@ export class AnomalyTimelineService {
254258
latestMs,
255259
swimlaneLimit,
256260
perPage,
257-
fromPage
261+
fromPage,
262+
selectionInfluencers,
263+
influencersFilterQuery
258264
);
259265
if (resp.influencers[viewBySwimlaneFieldName] === undefined) {
260266
return [];
@@ -276,6 +282,8 @@ export class AnomalyTimelineService {
276282
earliestMs,
277283
latestMs,
278284
this.getSwimlaneBucketInterval(selectedJobs, swimlaneContainerWidth).asMilliseconds(),
285+
perPage,
286+
fromPage,
279287
swimlaneLimit
280288
);
281289
return Object.keys(resp.results);

x-pack/plugins/ml/public/application/services/ml_api_service/results.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ import { JobId } from '../../../../common/types/anomaly_detection_jobs';
1616
import { JOB_ID, PARTITION_FIELD_VALUE } from '../../../../common/constants/anomalies';
1717
import { PartitionFieldsDefinition } from '../results_service/result_service_rx';
1818
import { PartitionFieldsConfig } from '../../../../common/types/storage';
19+
import {
20+
ESSearchRequest,
21+
ESSearchResponse,
22+
} from '../../../../../../../src/core/types/elasticsearch';
23+
import { MLAnomalyDoc } from '../../../../common/types/anomalies';
1924

2025
export const resultsApiProvider = (httpService: HttpService) => ({
2126
getAnomaliesTableData(
@@ -112,18 +117,18 @@ export const resultsApiProvider = (httpService: HttpService) => ({
112117
});
113118
},
114119

115-
anomalySearch(query: any, jobIds: string[]) {
120+
anomalySearch(query: ESSearchRequest, jobIds: string[]) {
116121
const body = JSON.stringify({ query, jobIds });
117-
return httpService.http<any>({
122+
return httpService.http<ESSearchResponse<MLAnomalyDoc>>({
118123
path: `${basePath()}/results/anomaly_search`,
119124
method: 'POST',
120125
body,
121126
});
122127
},
123128

124-
anomalySearch$(query: any, jobIds: string[]) {
129+
anomalySearch$(query: ESSearchRequest, jobIds: string[]) {
125130
const body = JSON.stringify({ query, jobIds });
126-
return httpService.http$<any>({
131+
return httpService.http$<ESSearchResponse<MLAnomalyDoc>>({
127132
path: `${basePath()}/results/anomaly_search`,
128133
method: 'POST',
129134
body,

x-pack/plugins/ml/public/application/services/results_service/results_service.d.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ export function resultsServiceProvider(
2323
intervalMs: number,
2424
perPage?: number,
2525
fromPage?: number,
26-
swimLaneSeverity?: number
26+
swimLaneSeverity?: number,
27+
influencersFilterQuery?: InfluencersFilterQuery
2728
): Promise<any>;
2829
getTopInfluencers(
2930
selectedJobIds: string[],
@@ -32,7 +33,7 @@ export function resultsServiceProvider(
3233
maxFieldValues: number,
3334
perPage?: number,
3435
fromPage?: number,
35-
influencers?: any[],
36+
influencers?: EntityField[],
3637
influencersFilterQuery?: InfluencersFilterQuery
3738
): Promise<any>;
3839
getTopInfluencerValues(): Promise<any>;

0 commit comments

Comments
 (0)