Skip to content

Commit 2b580fd

Browse files
committed
Basic data frames cache implementation
Signed-off-by: abbyhu2000 <[email protected]>
1 parent 4f54049 commit 2b580fd

File tree

10 files changed

+88
-91
lines changed

10 files changed

+88
-91
lines changed

src/plugins/data/common/data_frames/_df_cache.ts

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,28 @@
55

66
import { IDataFrame } from '..';
77

8-
export interface DfCache {
9-
get: () => IDataFrame | undefined;
10-
set: (value: IDataFrame) => IDataFrame;
11-
clear: () => void;
8+
export interface DfsCache {
9+
get: (name: string) => IDataFrame | undefined;
10+
set: (name: string, prom: IDataFrame) => void;
11+
clear: (name: string) => void;
12+
clearAll: () => void;
1213
}
1314

14-
export function createDataFrameCache(): DfCache {
15-
let df: IDataFrame | undefined;
16-
const cache: DfCache = {
17-
get: () => {
18-
return df;
15+
export function createDataFramesCache(): DfsCache {
16+
const dfs: Record<string, IDataFrame> = {};
17+
const cache: DfsCache = {
18+
get: (name: string) => {
19+
return dfs[name];
1920
},
20-
set: (prom: IDataFrame) => {
21-
df = prom;
22-
return prom;
21+
set: (name: string, df: IDataFrame) => {
22+
dfs[name] = df;
23+
return;
2324
},
24-
clear: () => {
25-
df = undefined;
25+
clear: (name: string) => {
26+
delete dfs[name];
27+
},
28+
clearAll: () => {
29+
Object.keys(dfs).forEach((name) => delete dfs[name]);
2630
},
2731
};
2832
return cache;

src/plugins/data/common/data_frames/types.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@ export enum DATA_FRAME_TYPES {
1414
POLLING = 'data_frame_polling',
1515
}
1616

17-
export interface DataFrameService {
18-
get: () => IDataFrame | undefined;
19-
set: (dataFrame: IDataFrame) => Promise<void>;
20-
clear: () => void;
17+
export interface DataFramesService {
18+
get: (name: string) => IDataFrame | undefined;
19+
set: (name: string, df: IDataFrame) => void;
20+
clear: (name: string) => void;
21+
clearAll: () => void;
2122
}
2223

2324
/**

src/plugins/data/common/search/search_source/fetch/get_search_params.ts

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -82,17 +82,9 @@ export function getSearchParamsFromRequest(
8282
destroyDataFrame?: DestroyDataFrameFn;
8383
}
8484
): ISearchRequestParams {
85-
const { getConfig, getDataFrame, destroyDataFrame } = dependencies;
85+
const { getConfig } = dependencies;
8686
const searchParams = getSearchParams(getConfig);
8787

88-
if (getDataFrame && destroyDataFrame) {
89-
if (getDataFrame()) {
90-
delete searchRequest.body.df;
91-
delete searchRequest.indexType;
92-
destroyDataFrame();
93-
}
94-
}
95-
9688
return {
9789
index: searchRequest.index.title || searchRequest.index,
9890
body: searchRequest.body,

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

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,13 @@ import { normalizeSortRequest } from './normalize_sort_request';
8787
import { filterDocvalueFields } from './filter_docvalue_fields';
8888
import { fieldWildcardFilter } from '../../../../opensearch_dashboards_utils/common';
8989
import { IIndexPattern } from '../../index_patterns';
90-
import { DATA_FRAME_TYPES, IDataFrame, IDataFrameResponse, convertResult } from '../../data_frames';
90+
import {
91+
DATA_FRAME_TYPES,
92+
DataFramesService,
93+
IDataFrame,
94+
IDataFrameResponse,
95+
convertResult,
96+
} from '../../data_frames';
9197
import { IOpenSearchSearchRequest, IOpenSearchSearchResponse, ISearchOptions } from '../..';
9298
import { IOpenSearchDashboardsSearchRequest, IOpenSearchDashboardsSearchResponse } from '../types';
9399
import { ISearchSource, SearchSourceOptions, SearchSourceFields } from './types';
@@ -138,11 +144,7 @@ export interface SearchSourceDependencies extends FetchHandlers {
138144
request: SearchStrategyRequest,
139145
options: ISearchOptions
140146
) => Promise<SearchStrategyResponse>;
141-
df: {
142-
get: () => IDataFrame | undefined;
143-
set: (dataFrame: IDataFrame) => Promise<void>;
144-
clear: () => void;
145-
};
147+
dfs: DataFramesService;
146148
}
147149

148150
/** @public **/
@@ -286,8 +288,8 @@ export class SearchSource {
286288
* Get the data frame of this SearchSource
287289
* @return {undefined|IDataFrame}
288290
*/
289-
getDataFrame() {
290-
return this.dependencies.df.get();
291+
getDataFrame(dfName: string) {
292+
return this.dependencies.dfs.get(dfName);
291293
}
292294

293295
/**
@@ -296,20 +298,24 @@ export class SearchSource {
296298
* @async
297299
* @return {undefined|IDataFrame}
298300
*/
299-
async setDataFrame(dataFrame: IDataFrame | undefined) {
301+
async setDataFrame(dfName: string, dataFrame: IDataFrame | undefined) {
300302
if (dataFrame) {
301-
await this.dependencies.df.set(dataFrame);
303+
await this.dependencies.dfs.set(dfName, dataFrame);
302304
} else {
303-
this.destroyDataFrame();
305+
this.destroyDataFrame(dfName);
304306
}
305-
return this.getDataFrame();
307+
return this.getDataFrame(dfName);
306308
}
307309

308310
/**
309311
* Clear the data frame of this SearchSource
310312
*/
311-
destroyDataFrame() {
312-
this.dependencies.df.clear();
313+
destroyDataFrame(dfName: string) {
314+
this.dependencies.dfs.clear(dfName);
315+
}
316+
317+
clearDataFramesCache() {
318+
this.dependencies.dfs.clearAll();
313319
}
314320

315321
/**

src/plugins/data/common/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export * from './data_frames/types';
4747
* not possible.
4848
*/
4949
export type GetConfigFn = <T = any>(key: string, defaultOverride?: T) => T;
50-
export type GetDataFrameFn = () => IDataFrame | undefined;
50+
export type GetDataFrameFn = (dfName: string) => IDataFrame | undefined;
5151
export type GetDataFrameAggQsFn = ({
5252
qs,
5353
aggConfig,
@@ -60,5 +60,5 @@ export type GetDataFrameAggQsFn = ({
6060
timeFilter: any;
6161
}) => any;
6262

63-
export type DestroyDataFrameFn = () => void;
63+
export type DestroyDataFrameFn = (dfName: string) => void;
6464
export type GetAggTypeFn = (id: string) => BucketAggType<any> | MetricAggType<any>;

src/plugins/data/public/search/search_service.ts

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,11 @@ import {
5858
} from '../../common/search/aggs/buckets/shard_delay';
5959
import { aggShardDelay } from '../../common/search/aggs/buckets/shard_delay_fn';
6060
import {
61-
DataFrameService,
61+
DataFramesService,
6262
IDataFrame,
6363
IDataFrameResponse,
64-
createDataFrameCache,
64+
createDataFrame,
65+
createDataFramesCache,
6566
dataFrameToSpec,
6667
} from '../../common/data_frames';
6768

@@ -80,7 +81,7 @@ export interface SearchServiceStartDependencies {
8081
export class SearchService implements Plugin<ISearchSetup, ISearchStart> {
8182
private readonly aggsService = new AggsService();
8283
private readonly searchSourceService = new SearchSourceService();
83-
private readonly dfCache = createDataFrameCache();
84+
private readonly dfsCache = createDataFramesCache();
8485
private searchInterceptor!: ISearchInterceptor;
8586
private defaultSearchInterceptor!: ISearchInterceptor;
8687
private usageCollector?: SearchUsageCollector;
@@ -139,26 +140,32 @@ export class SearchService implements Plugin<ISearchSetup, ISearchStart> {
139140
const loadingCount$ = new BehaviorSubject(0);
140141
http.addLoadingCountSource(loadingCount$);
141142

142-
const dfService: DataFrameService = {
143-
get: () => this.dfCache.get(),
144-
set: async (dataFrame: IDataFrame) => {
145-
if (this.dfCache.get() && this.dfCache.get()?.name !== dataFrame.name) {
146-
indexPatterns.clearCache(this.dfCache.get()!.name, false);
143+
const dfsService: DataFramesService = {
144+
get: (dfName: string) => {
145+
if (this.dfsCache.get(dfName)) {
146+
return this.dfsCache.get(dfName);
147+
} else {
148+
const df = createDataFrame({ name: dfName, fields: [] });
149+
this.dfsCache.set(dfName, df);
150+
return df;
147151
}
148-
this.dfCache.set(dataFrame);
149-
const existingIndexPattern = indexPatterns.getByTitle(dataFrame.name!, true);
152+
},
153+
set: async (dfName: string, df: IDataFrame) => {
154+
this.dfsCache.set(dfName, df);
155+
const existingIndexPattern = indexPatterns.getByTitle(dfName, true);
150156
const dataSet = await indexPatterns.create(
151-
dataFrameToSpec(dataFrame, existingIndexPattern?.id),
157+
dataFrameToSpec(df, existingIndexPattern?.id),
152158
!existingIndexPattern?.id
153159
);
154160
// save to cache by title because the id is not unique for temporary index pattern created
155161
indexPatterns.saveToCache(dataSet.title, dataSet);
156162
},
157-
clear: () => {
158-
if (this.dfCache.get() === undefined) return;
159-
// name because the id is not unique for temporary index pattern created
160-
indexPatterns.clearCache(this.dfCache.get()!.name, false);
161-
this.dfCache.clear();
163+
clear: (dfName: string) => {
164+
indexPatterns.clearCache(dfName, false);
165+
this.dfsCache.clear(dfName);
166+
},
167+
clearAll: () => {
168+
this.dfsCache.clearAll();
162169
},
163170
};
164171

@@ -180,7 +187,7 @@ export class SearchService implements Plugin<ISearchSetup, ISearchStart> {
180187
callMsearch: getCallMsearch({ http }),
181188
loadingCount$,
182189
},
183-
df: dfService,
190+
dfs: dfsService,
184191
};
185192

186193
return {
@@ -194,7 +201,7 @@ export class SearchService implements Plugin<ISearchSetup, ISearchStart> {
194201
this.searchInterceptor = enhancements.searchInterceptor;
195202
},
196203
getDefaultSearchInterceptor: () => this.defaultSearchInterceptor,
197-
df: dfService,
204+
dfs: dfsService,
198205
};
199206
}
200207

src/plugins/data/public/search/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import { AggsSetup, AggsSetupDependencies, AggsStartDependencies, AggsStart } fr
3535
import { ISearchGeneric, ISearchStartSearchSource } from '../../common/search';
3636
import { IndexPatternsContract } from '../../common/index_patterns/index_patterns';
3737
import { UsageCollectionSetup } from '../../../usage_collection/public';
38-
import { DataFrameService } from '../../common/data_frames';
38+
import { DataFramesService } from '../../common/data_frames';
3939

4040
export { ISearchStartSearchSource };
4141

@@ -81,7 +81,7 @@ export interface ISearchStart {
8181
searchSource: ISearchStartSearchSource;
8282
__enhance: (enhancements: SearchEnhancements) => void;
8383
getDefaultSearchInterceptor: () => ISearchInterceptor;
84-
df: DataFrameService;
84+
dfs: DataFramesService;
8585
}
8686

8787
export { SEARCH_EVENT_TYPE } from './collectors';

src/plugins/data/public/ui/settings/settings.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ export class Settings {
8989

9090
setUserQueryLanguage(language: string) {
9191
this.storage.set('opensearchDashboards.userQueryLanguage', language);
92-
this.search.df.clear();
9392
const queryEnhancement = this.queryEnhancements.get(language);
9493
this.search.__enhance({
9594
searchInterceptor: queryEnhancement

src/plugins/data/server/search/search_service.ts

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,10 @@ import {
7474
import { aggShardDelay } from '../../common/search/aggs/buckets/shard_delay_fn';
7575
import { ConfigSchema } from '../../config';
7676
import {
77-
DataFrameService,
77+
DataFramesService,
7878
IDataFrame,
7979
IDataFrameResponse,
80-
createDataFrameCache,
80+
createDataFramesCache,
8181
dataFrameToSpec,
8282
} from '../../common';
8383

@@ -105,7 +105,7 @@ export interface SearchRouteDependencies {
105105
export class SearchService implements Plugin<ISearchSetup, ISearchStart> {
106106
private readonly aggsService = new AggsService();
107107
private readonly searchSourceService = new SearchSourceService();
108-
private readonly dfCache = createDataFrameCache();
108+
private readonly dfsCache = createDataFramesCache();
109109
private defaultSearchStrategyName: string = OPENSEARCH_SEARCH_STRATEGY;
110110
private searchStrategies: StrategyMap = {};
111111

@@ -212,13 +212,10 @@ export class SearchService implements Plugin<ISearchSetup, ISearchStart> {
212212
searchSourceRequiredUiSettings
213213
);
214214

215-
const dfService: DataFrameService = {
216-
get: () => this.dfCache.get(),
217-
set: async (dataFrame: IDataFrame) => {
218-
if (this.dfCache.get() && this.dfCache.get()?.name !== dataFrame.name) {
219-
scopedIndexPatterns.clearCache(this.dfCache.get()!.name, false);
220-
}
221-
this.dfCache.set(dataFrame);
215+
const dfsService: DataFramesService = {
216+
get: (dfName: string) => this.dfsCache.get(dfName),
217+
set: async (dfName: string, dataFrame: IDataFrame) => {
218+
this.dfsCache.set(dfName, dataFrame);
222219
const existingIndexPattern = scopedIndexPatterns.getByTitle(dataFrame.name!, true);
223220
const dataSet = await scopedIndexPatterns.create(
224221
dataFrameToSpec(dataFrame, existingIndexPattern?.id),
@@ -227,11 +224,13 @@ export class SearchService implements Plugin<ISearchSetup, ISearchStart> {
227224
// save to cache by title because the id is not unique for temporary index pattern created
228225
scopedIndexPatterns.saveToCache(dataSet.title, dataSet);
229226
},
230-
clear: () => {
231-
if (this.dfCache.get() === undefined) return;
227+
clear: (dfName: string) => {
232228
// name because the id is not unique for temporary index pattern created
233-
scopedIndexPatterns.clearCache(this.dfCache.get()!.name, false);
234-
this.dfCache.clear();
229+
scopedIndexPatterns.clearCache(this.dfsCache.get(dfName)!.name, false);
230+
this.dfsCache.clear(dfName);
231+
},
232+
clearAll: () => {
233+
this.dfsCache.clearAll();
235234
},
236235
};
237236

@@ -269,7 +268,7 @@ export class SearchService implements Plugin<ISearchSetup, ISearchStart> {
269268
}),
270269
loadingCount$: new BehaviorSubject(0),
271270
},
272-
df: dfService,
271+
dfs: dfsService,
273272
};
274273

275274
return this.searchSourceService.start(scopedIndexPatterns, searchSourceDependencies);

src/plugins/discover/public/application/view_components/utils/update_search_source.ts

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,7 @@ export const updateSearchSource = async ({
3030
histogramConfigs,
3131
}: Props) => {
3232
const { uiSettings, data } = services;
33-
let dataSet = indexPattern;
34-
const dataFrame = searchSource?.getDataFrame();
35-
if (
36-
searchSource &&
37-
dataFrame &&
38-
dataFrame.name &&
39-
dataFrame.name !== '' &&
40-
dataSet.title !== dataFrame.name
41-
) {
42-
dataSet = data.indexPatterns.getByTitle(dataFrame.name, true) ?? dataSet;
43-
searchSource.setField('index', dataSet);
44-
}
33+
const dataSet = indexPattern;
4534

4635
const sortForSearchSource = getSortForSearchSource(
4736
sort,

0 commit comments

Comments
 (0)