Skip to content

Commit d6d27ae

Browse files
feat(customHomePage): add related entities filters to hierarchy module (#14179)
1 parent 836e301 commit d6d27ae

File tree

61 files changed

+3993
-76
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+3993
-76
lines changed

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/module/UpsertPageModuleResolver.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,10 @@ private DataHubPageModuleParams mapParamsInput(
139139
hierarchyViewParams.setShowRelatedEntities(
140140
paramsInput.getHierarchyViewParams().getShowRelatedEntities());
141141

142-
// TODO: add filters field
142+
if (paramsInput.getHierarchyViewParams().getRelatedEntitiesFilterJson() != null) {
143+
hierarchyViewParams.setRelatedEntitiesFilterJson(
144+
paramsInput.getHierarchyViewParams().getRelatedEntitiesFilterJson());
145+
}
143146

144147
gmsParams.setHierarchyViewParams(hierarchyViewParams);
145148
}

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/types/module/PageModuleParamsMapper.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,10 @@ public com.linkedin.datahub.graphql.generated.DataHubPageModuleParams apply(
8585
hierarchyViewParams.setShowRelatedEntities(
8686
params.getHierarchyViewParams().isShowRelatedEntities());
8787

88-
// TODO: add relatedEntitiesFilter
88+
if (params.getHierarchyViewParams().getRelatedEntitiesFilterJson() != null) {
89+
hierarchyViewParams.setRelatedEntitiesFilterJson(
90+
params.getHierarchyViewParams().getRelatedEntitiesFilterJson());
91+
}
8992

9093
result.setHierarchyViewParams(hierarchyViewParams);
9194
}

datahub-graphql-core/src/main/resources/module.graphql

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -144,11 +144,14 @@ input HierarchyViewModuleParamsInput {
144144
"""
145145
showRelatedEntities: Boolean!
146146

147-
# TODO: implement filters
148-
#"""
149-
#Optional filters to filter relatedEntities out
150-
#"""
151-
# relatedEntitiesFilter: []
147+
"""
148+
Optional filters to filter relatedEntities (assetUrns) out
149+
150+
The stringified json representing the logical predicate built in the UI to select assets.
151+
This predicate is turned into orFilters to send through graphql since graphql doesn't support
152+
arbitrary nesting. This string is used to restore the UI for this logical predicate.
153+
"""
154+
relatedEntitiesFilterJson: String
152155
}
153156

154157
"""
@@ -319,11 +322,14 @@ type HierarchyViewModuleParams {
319322
"""
320323
showRelatedEntities: Boolean!
321324

322-
# TODO: implement
323-
#"""
324-
#Optional filters to filter relatedEntities out
325-
#"""
326-
# relatedEntitiesFilter: []
325+
"""
326+
Optional filters to filter relatedEntities (assetUrns) out
327+
328+
The stringified json representing the logical predicate built in the UI to select assets.
329+
This predicate is turned into orFilters to send through graphql since graphql doesn't support
330+
arbitrary nesting. This string is used to restore the UI for this logical predicate.
331+
"""
332+
relatedEntitiesFilterJson: String
327333
}
328334

329335
"""

datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/module/UpsertPageModuleResolverTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ public void testUpsertPageModuleWithHierarchyParams() throws Exception {
175175
paramsInput.setHierarchyViewParams(new HierarchyViewModuleParamsInput());
176176
paramsInput.getHierarchyViewParams().setAssetUrns(List.of("urn:li:domain:test-domain"));
177177
paramsInput.getHierarchyViewParams().setShowRelatedEntities(true);
178+
paramsInput.getHierarchyViewParams().setRelatedEntitiesFilterJson("{}");
178179
input.setParams(paramsInput);
179180

180181
Urn moduleUrn = UrnUtils.getUrn(TEST_MODULE_URN);

datahub-web-react/src/alchemy-components/components/Select/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ export const getSelectPadding = (size) => {
6262
padding: `${spacing.xxsm} ${spacing.xsm}`,
6363
},
6464
md: {
65-
padding: `${spacing.xsm} ${spacing.xsm}`,
65+
padding: `${spacing.xxsm} ${spacing.xsm}`,
6666
},
6767
lg: {
6868
padding: `${spacing.sm} ${spacing.sm}`,

datahub-web-react/src/app/homeV3/modules/hierarchyViewModule/HierarchyViewModal.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,16 @@ export default function HierarchyViewModal() {
2424
const assetType = getAssetTypeFromAssetUrns(originalAssetUrns);
2525
const assetUrns = filterAssetUrnsByAssetType(originalAssetUrns, assetType);
2626

27+
const relatedEntitiesFilterJson =
28+
initialState?.properties.params.hierarchyViewParams?.relatedEntitiesFilterJson;
29+
2730
return {
2831
name: initialState?.properties.name || '',
2932
assetsType: assetType,
3033
domainAssets: assetType === ASSET_TYPE_DOMAINS ? assetUrns : [],
3134
glossaryAssets: assetType === ASSET_TYPE_GLOSSARY ? assetUrns : [],
3235
showRelatedEntities: !!initialState?.properties.params.hierarchyViewParams?.showRelatedEntities,
36+
relatedEntitiesFilter: relatedEntitiesFilterJson ? JSON.parse(relatedEntitiesFilterJson) : undefined,
3337
};
3438
}, [initialState]);
3539

@@ -55,6 +59,9 @@ export default function HierarchyViewModal() {
5559
hierarchyViewParams: {
5660
assetUrns,
5761
showRelatedEntities: values.showRelatedEntities,
62+
relatedEntitiesFilterJson: values.relatedEntitiesFilter
63+
? JSON.stringify(values.relatedEntitiesFilter)
64+
: undefined,
5865
},
5966
},
6067
});

datahub-web-react/src/app/homeV3/modules/hierarchyViewModule/HierarchyViewModule.tsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@ import { ModuleProps } from '@app/homeV3/module/types';
77
import AssetsTreeView from '@app/homeV3/modules/hierarchyViewModule/components/AssetsTreeView';
88
import { ASSET_TYPE_DOMAINS, ASSET_TYPE_GLOSSARY } from '@app/homeV3/modules/hierarchyViewModule/constants';
99
import { filterAssetUrnsByAssetType, getAssetTypeFromAssetUrns } from '@app/homeV3/modules/hierarchyViewModule/utils';
10+
import { LogicalPredicate } from '@app/sharedV2/queryBuilder/builder/types';
11+
import { convertLogicalPredicateToOrFilters } from '@app/sharedV2/queryBuilder/builder/utils';
1012
import { PageRoutes } from '@conf/Global';
1113

14+
import { AndFilterInput } from '@types';
15+
1216
export default function HierarchyViewModule(props: ModuleProps) {
1317
const history = useHistory();
1418

@@ -41,6 +45,22 @@ export default function HierarchyViewModule(props: ModuleProps) {
4145
[props.module.properties.params.hierarchyViewParams?.showRelatedEntities],
4246
);
4347

48+
const relatedEntitiesLogicalPredicate: LogicalPredicate | undefined = useMemo(
49+
() =>
50+
props.module.properties.params.hierarchyViewParams?.relatedEntitiesFilterJson
51+
? JSON.parse(props.module.properties.params.hierarchyViewParams?.relatedEntitiesFilterJson)
52+
: undefined,
53+
[props.module.properties.params.hierarchyViewParams?.relatedEntitiesFilterJson],
54+
);
55+
56+
const relatedEntitiesOrFilters: AndFilterInput[] | undefined = useMemo(
57+
() =>
58+
relatedEntitiesLogicalPredicate
59+
? convertLogicalPredicateToOrFilters(relatedEntitiesLogicalPredicate)
60+
: undefined,
61+
[relatedEntitiesLogicalPredicate],
62+
);
63+
4464
const onClickViewAll = useCallback(() => {
4565
if (assetType === ASSET_TYPE_DOMAINS) {
4666
history.push(PageRoutes.DOMAINS);
@@ -63,6 +83,7 @@ export default function HierarchyViewModule(props: ModuleProps) {
6383
assetType={assetType}
6484
assetUrns={assetUrns}
6585
shouldShowRelatedEntities={shouldShowRelatedEntities}
86+
relatedEntitiesOrFilters={relatedEntitiesOrFilters}
6687
/>
6788
)
6889
)}
Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
import useLoader from '@app/homeV3/modules/hierarchyViewModule/childrenLoader/hooks/useLoader';
22
import { ChildrenLoaderType } from '@app/homeV3/modules/hierarchyViewModule/childrenLoader/types';
33

4+
import { AndFilterInput } from '@types';
5+
46
interface Props {
57
parentValue: string;
68
loadChildren: ChildrenLoaderType;
79
loadRelatedEntities?: ChildrenLoaderType;
10+
relatedEntitiesOrFilters?: AndFilterInput[] | undefined;
811
}
912

10-
export default function ChildLoader({ parentValue, loadChildren, loadRelatedEntities }: Props) {
11-
useLoader(parentValue, loadChildren, loadRelatedEntities);
13+
export default function ChildLoader({
14+
parentValue,
15+
loadChildren,
16+
loadRelatedEntities,
17+
relatedEntitiesOrFilters,
18+
}: Props) {
19+
useLoader(parentValue, loadChildren, loadRelatedEntities, relatedEntitiesOrFilters);
1220

1321
return null;
1422
}

datahub-web-react/src/app/homeV3/modules/hierarchyViewModule/childrenLoader/ChildrenLoader.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,21 @@ import React from 'react';
33
import ChildLoader from '@app/homeV3/modules/hierarchyViewModule/childrenLoader/ChildLoader';
44
import { ChildrenLoaderType } from '@app/homeV3/modules/hierarchyViewModule/childrenLoader/types';
55

6+
import { AndFilterInput } from '@types';
7+
68
interface Props {
79
parentValues: string[];
810
loadChildren: ChildrenLoaderType;
911
loadRelatedEntities?: ChildrenLoaderType;
12+
relatedEntitiesOrFilters?: AndFilterInput[] | undefined;
1013
}
1114

12-
export default function ChildrenLoader({ parentValues, loadChildren, loadRelatedEntities }: Props) {
15+
export default function ChildrenLoader({
16+
parentValues,
17+
loadChildren,
18+
loadRelatedEntities,
19+
relatedEntitiesOrFilters,
20+
}: Props) {
1321
return (
1422
<>
1523
{parentValues.map((parentValue) => (
@@ -18,6 +26,7 @@ export default function ChildrenLoader({ parentValues, loadChildren, loadRelated
1826
key={parentValue}
1927
loadChildren={loadChildren}
2028
loadRelatedEntities={loadRelatedEntities}
29+
relatedEntitiesOrFilters={relatedEntitiesOrFilters}
2130
/>
2231
))}
2332
</>

datahub-web-react/src/app/homeV3/modules/hierarchyViewModule/childrenLoader/hooks/__tests__/useLoader.test.ts

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,13 @@ describe('useLoader hook', () => {
6565
};
6666
mockGet.mockReturnValue(mockMetadata);
6767

68-
renderHook(() => useLoader(mockParentValue, mockLoadChildren, undefined));
68+
renderHook(() => useLoader(mockParentValue, mockLoadChildren, undefined, undefined));
6969

7070
expect(mockGet).toHaveBeenCalledWith(mockParentValue);
7171
});
7272

7373
it('should use maxNumberOfChildrenToLoad from context', () => {
74-
renderHook(() => useLoader(mockParentValue, mockLoadChildren, undefined));
74+
renderHook(() => useLoader(mockParentValue, mockLoadChildren, undefined, undefined));
7575

7676
expect(mockLoadChildren).toHaveBeenCalledWith({
7777
parentValue: mockParentValue,
@@ -89,7 +89,7 @@ describe('useLoader hook', () => {
8989
};
9090
mockGet.mockReturnValue(mockMetadata);
9191

92-
renderHook(() => useLoader(mockParentValue, mockLoadChildren, undefined));
92+
renderHook(() => useLoader(mockParentValue, mockLoadChildren, undefined, undefined));
9393

9494
expect(mockLoadChildren).toHaveBeenCalledWith({
9595
parentValue: mockParentValue,
@@ -106,7 +106,7 @@ describe('useLoader hook', () => {
106106
total: 5,
107107
});
108108

109-
renderHook(() => useLoader(mockParentValue, mockLoadChildren, undefined));
109+
renderHook(() => useLoader(mockParentValue, mockLoadChildren, undefined, undefined));
110110

111111
expect(mockOnLoad).toHaveBeenCalledWith(
112112
mockChildrenNodes,
@@ -123,7 +123,7 @@ describe('useLoader hook', () => {
123123

124124
describe('related entities loading', () => {
125125
it('should not call loadRelatedEntities when undefined', () => {
126-
renderHook(() => useLoader(mockParentValue, mockLoadChildren, undefined));
126+
renderHook(() => useLoader(mockParentValue, mockLoadChildren, undefined, undefined));
127127

128128
expect(mockLoadRelatedEntities).not.toHaveBeenCalled();
129129
});
@@ -142,7 +142,7 @@ describe('useLoader hook', () => {
142142
total: 5,
143143
});
144144

145-
renderHook(() => useLoader(mockParentValue, mockLoadChildren, mockLoadRelatedEntities));
145+
renderHook(() => useLoader(mockParentValue, mockLoadChildren, mockLoadRelatedEntities, undefined));
146146

147147
expect(mockLoadRelatedEntities).toHaveBeenCalledWith({
148148
parentValue: mockParentValue,
@@ -160,7 +160,7 @@ describe('useLoader hook', () => {
160160
total: 5,
161161
});
162162

163-
renderHook(() => useLoader(mockParentValue, mockLoadChildren, mockLoadRelatedEntities));
163+
renderHook(() => useLoader(mockParentValue, mockLoadChildren, mockLoadRelatedEntities, undefined));
164164

165165
expect(mockLoadRelatedEntities).toHaveBeenCalledWith({
166166
parentValue: mockParentValue,
@@ -177,7 +177,7 @@ describe('useLoader hook', () => {
177177
total: 5,
178178
});
179179

180-
renderHook(() => useLoader(mockParentValue, mockLoadChildren, mockLoadRelatedEntities));
180+
renderHook(() => useLoader(mockParentValue, mockLoadChildren, mockLoadRelatedEntities, undefined));
181181

182182
expect(mockLoadRelatedEntities).toHaveBeenCalledWith({
183183
parentValue: mockParentValue,
@@ -196,7 +196,7 @@ describe('useLoader hook', () => {
196196
total: 2,
197197
});
198198

199-
renderHook(() => useLoader(mockParentValue, mockLoadChildren, undefined));
199+
renderHook(() => useLoader(mockParentValue, mockLoadChildren, undefined, undefined));
200200

201201
expect(mockOnLoad).not.toHaveBeenCalled();
202202
});
@@ -214,7 +214,7 @@ describe('useLoader hook', () => {
214214
total: 3,
215215
});
216216

217-
renderHook(() => useLoader(mockParentValue, mockLoadChildren, mockLoadRelatedEntities));
217+
renderHook(() => useLoader(mockParentValue, mockLoadChildren, mockLoadRelatedEntities, undefined));
218218

219219
expect(mockOnLoad).not.toHaveBeenCalled();
220220
});
@@ -235,7 +235,7 @@ describe('useLoader hook', () => {
235235
total: 3,
236236
});
237237

238-
renderHook(() => useLoader(mockParentValue, mockLoadChildren, mockLoadRelatedEntities));
238+
renderHook(() => useLoader(mockParentValue, mockLoadChildren, mockLoadRelatedEntities, undefined));
239239

240240
expect(mockOnLoad).toHaveBeenCalledWith(
241241
[...mockChildrenNodes, ...mockRelatedNodes],
@@ -275,7 +275,7 @@ describe('useLoader hook', () => {
275275
total: 9, // new total
276276
});
277277

278-
renderHook(() => useLoader(mockParentValue, mockLoadChildren, mockLoadRelatedEntities));
278+
renderHook(() => useLoader(mockParentValue, mockLoadChildren, mockLoadRelatedEntities, undefined));
279279

280280
expect(mockOnLoad).toHaveBeenCalledWith(
281281
[...mockChildrenNodes, ...mockRelatedNodes],
@@ -307,7 +307,7 @@ describe('useLoader hook', () => {
307307
total: 3,
308308
});
309309

310-
renderHook(() => useLoader(mockParentValue, mockLoadChildren, mockLoadRelatedEntities));
310+
renderHook(() => useLoader(mockParentValue, mockLoadChildren, mockLoadRelatedEntities, undefined));
311311

312312
expect(mockOnLoad).toHaveBeenCalledWith(
313313
[...mockChildrenNodes, ...mockRelatedNodes],
@@ -330,7 +330,7 @@ describe('useLoader hook', () => {
330330
total: undefined, // no total provided
331331
});
332332

333-
renderHook(() => useLoader(mockParentValue, mockLoadChildren, undefined));
333+
renderHook(() => useLoader(mockParentValue, mockLoadChildren, undefined, undefined));
334334

335335
expect(mockOnLoad).toHaveBeenCalledWith(
336336
mockChildrenNodes,
@@ -362,7 +362,7 @@ describe('useLoader hook', () => {
362362
total: 2,
363363
});
364364

365-
renderHook(() => useLoader(mockParentValue, mockLoadChildren, mockLoadRelatedEntities));
365+
renderHook(() => useLoader(mockParentValue, mockLoadChildren, mockLoadRelatedEntities, undefined));
366366

367367
expect(mockOnLoad).toHaveBeenCalledWith(
368368
[...mockChildrenNodes, ...mockRelatedNodes],
@@ -384,7 +384,7 @@ describe('useLoader hook', () => {
384384
total: 0,
385385
});
386386

387-
renderHook(() => useLoader(mockParentValue, mockLoadChildren, mockLoadRelatedEntities));
387+
renderHook(() => useLoader(mockParentValue, mockLoadChildren, mockLoadRelatedEntities, undefined));
388388

389389
expect(mockOnLoad).toHaveBeenCalledWith(
390390
[], // should default to empty array
@@ -402,7 +402,7 @@ describe('useLoader hook', () => {
402402
total: 0,
403403
});
404404

405-
renderHook(() => useLoader(mockParentValue, mockLoadChildren, undefined));
405+
renderHook(() => useLoader(mockParentValue, mockLoadChildren, undefined, undefined));
406406

407407
expect(mockOnLoad).toHaveBeenCalledWith(
408408
[],
@@ -417,9 +417,12 @@ describe('useLoader hook', () => {
417417
});
418418

419419
it('should re-trigger effect when dependencies change', () => {
420-
const { rerender } = renderHook(({ parentValue }) => useLoader(parentValue, mockLoadChildren, undefined), {
421-
initialProps: { parentValue: mockParentValue },
422-
});
420+
const { rerender } = renderHook(
421+
({ parentValue }) => useLoader(parentValue, mockLoadChildren, undefined, undefined),
422+
{
423+
initialProps: { parentValue: mockParentValue },
424+
},
425+
);
423426

424427
mockLoadChildren.mockReturnValue({
425428
nodes: [createTreeNode('child1')],
@@ -447,7 +450,7 @@ describe('useLoader hook', () => {
447450
total: 1,
448451
});
449452

450-
const { rerender } = renderHook(() => useLoader(mockParentValue, mockLoadChildren, undefined));
453+
const { rerender } = renderHook(() => useLoader(mockParentValue, mockLoadChildren, undefined, undefined));
451454

452455
// Should not call onLoad yet
453456
expect(mockOnLoad).not.toHaveBeenCalled();

0 commit comments

Comments
 (0)