Skip to content

Commit a8d7980

Browse files
committed
Merge remote-tracking branch 'oss-datahub/master' into vertex_src_temp
2 parents e6feb8a + 6097820 commit a8d7980

File tree

37 files changed

+1777
-197
lines changed

37 files changed

+1777
-197
lines changed

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/GmsGraphQLEngine.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -1026,7 +1026,8 @@ private void configureQueryResolvers(final RuntimeWiring.Builder builder) {
10261026
new ScrollAcrossEntitiesResolver(this.entityClient, this.viewService))
10271027
.dataFetcher(
10281028
"searchAcrossLineage",
1029-
new SearchAcrossLineageResolver(this.entityClient, this.entityRegistry))
1029+
new SearchAcrossLineageResolver(
1030+
this.entityClient, this.entityRegistry, this.viewService))
10301031
.dataFetcher(
10311032
"scrollAcrossLineage", new ScrollAcrossLineageResolver(this.entityClient))
10321033
.dataFetcher(

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/search/SearchAcrossLineageResolver.java

+26-3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import com.google.common.collect.ImmutableSet;
88
import com.linkedin.common.urn.Urn;
9+
import com.linkedin.common.urn.UrnUtils;
910
import com.linkedin.datahub.graphql.QueryContext;
1011
import com.linkedin.datahub.graphql.concurrency.GraphQLConcurrencyUtils;
1112
import com.linkedin.datahub.graphql.generated.AndFilterInput;
@@ -25,8 +26,12 @@
2526
import com.linkedin.metadata.query.LineageFlags;
2627
import com.linkedin.metadata.query.SearchFlags;
2728
import com.linkedin.metadata.query.filter.Filter;
29+
import com.linkedin.metadata.query.filter.SortCriterion;
2830
import com.linkedin.metadata.search.LineageSearchResult;
31+
import com.linkedin.metadata.service.ViewService;
32+
import com.linkedin.metadata.utils.elasticsearch.FilterUtils;
2933
import com.linkedin.r2.RemoteInvocationException;
34+
import com.linkedin.view.DataHubViewInfo;
3035
import graphql.VisibleForTesting;
3136
import graphql.schema.DataFetcher;
3237
import graphql.schema.DataFetchingEnvironment;
@@ -53,10 +58,13 @@ public class SearchAcrossLineageResolver
5358

5459
private final EntityRegistry _entityRegistry;
5560

61+
private final ViewService _viewService;
62+
5663
@VisibleForTesting final Set<String> _allEntities;
5764
private final List<String> _allowedEntities;
5865

59-
public SearchAcrossLineageResolver(EntityClient entityClient, EntityRegistry entityRegistry) {
66+
public SearchAcrossLineageResolver(
67+
EntityClient entityClient, EntityRegistry entityRegistry, final ViewService viewService) {
6068
this._entityClient = entityClient;
6169
this._entityRegistry = entityRegistry;
6270
this._allEntities =
@@ -68,6 +76,8 @@ public SearchAcrossLineageResolver(EntityClient entityClient, EntityRegistry ent
6876
this._allEntities.stream()
6977
.filter(e -> !TRANSIENT_ENTITIES.contains(e))
7078
.collect(Collectors.toList());
79+
80+
this._viewService = viewService;
7181
}
7282

7383
private List<String> getEntityNamesFromInput(List<EntityType> inputTypes) {
@@ -127,6 +137,13 @@ public CompletableFuture<SearchAcrossLineageResults> get(DataFetchingEnvironment
127137
com.linkedin.metadata.graph.LineageDirection.valueOf(lineageDirection.toString());
128138
return GraphQLConcurrencyUtils.supplyAsync(
129139
() -> {
140+
final DataHubViewInfo maybeResolvedView =
141+
(input.getViewUrn() != null)
142+
? resolveView(
143+
context.getOperationContext(),
144+
_viewService,
145+
UrnUtils.getUrn(input.getViewUrn()))
146+
: null;
130147
try {
131148
log.debug(
132149
"Executing search across relationships: source urn {}, direction {}, entity types {}, query {}, filters: {}, start: {}, count: {}",
@@ -138,8 +155,13 @@ public CompletableFuture<SearchAcrossLineageResults> get(DataFetchingEnvironment
138155
start,
139156
count);
140157

141-
final Filter filter =
158+
final Filter baseFilter =
142159
ResolverUtils.buildFilter(input.getFilters(), input.getOrFilters());
160+
Filter filter =
161+
maybeResolvedView != null
162+
? FilterUtils.combineFilters(
163+
baseFilter, maybeResolvedView.getDefinition().getFilter())
164+
: baseFilter;
143165
final SearchFlags searchFlags;
144166
com.linkedin.datahub.graphql.generated.SearchFlags inputFlags = input.getSearchFlags();
145167
if (inputFlags != null) {
@@ -150,6 +172,7 @@ public CompletableFuture<SearchAcrossLineageResults> get(DataFetchingEnvironment
150172
} else {
151173
searchFlags = new SearchFlags().setFulltext(true).setSkipHighlighting(true);
152174
}
175+
List<SortCriterion> sortCriteria = SearchUtils.getSortCriteria(input.getSortInput());
153176
LineageSearchResult salResults =
154177
_entityClient.searchAcrossLineage(
155178
context
@@ -162,7 +185,7 @@ public CompletableFuture<SearchAcrossLineageResults> get(DataFetchingEnvironment
162185
sanitizedQuery,
163186
maxHops,
164187
filter,
165-
null,
188+
sortCriteria,
166189
start,
167190
count);
168191

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

+10
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,16 @@ input SearchAcrossLineageInput {
417417
Flags controlling the lineage query
418418
"""
419419
lineageFlags: LineageFlags
420+
421+
"""
422+
Optional - A View to apply when generating results
423+
"""
424+
viewUrn: String
425+
426+
"""
427+
Optional - Information on how to sort this search result
428+
"""
429+
sortInput: SearchSortInput
420430
}
421431

422432
"""

datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/search/ScrollAcrossLineageResolverTest.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import com.linkedin.metadata.search.LineageSearchEntityArray;
3232
import com.linkedin.metadata.search.MatchedFieldArray;
3333
import com.linkedin.metadata.search.SearchResultMetadata;
34+
import com.linkedin.metadata.service.ViewService;
3435
import graphql.schema.DataFetchingEnvironment;
3536
import io.datahubproject.metadata.context.OperationContext;
3637
import java.io.InputStream;
@@ -76,7 +77,7 @@ public void testAllEntitiesInitialization() {
7677
InputStream inputStream = ClassLoader.getSystemResourceAsStream("entity-registry.yml");
7778
EntityRegistry entityRegistry = new ConfigEntityRegistry(inputStream);
7879
SearchAcrossLineageResolver resolver =
79-
new SearchAcrossLineageResolver(_entityClient, entityRegistry);
80+
new SearchAcrossLineageResolver(_entityClient, entityRegistry, mock(ViewService.class));
8081
assertTrue(resolver._allEntities.contains("dataset"));
8182
assertTrue(resolver._allEntities.contains("dataFlow"));
8283
// Test for case sensitivity

datahub-graphql-core/src/test/java/com/linkedin/datahub/graphql/resolvers/search/SearchAcrossLineageResolverTest.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.linkedin.metadata.search.LineageSearchResult;
2323
import com.linkedin.metadata.search.MatchedFieldArray;
2424
import com.linkedin.metadata.search.SearchResultMetadata;
25+
import com.linkedin.metadata.service.ViewService;
2526
import graphql.schema.DataFetchingEnvironment;
2627
import io.datahubproject.metadata.context.OperationContext;
2728
import java.io.InputStream;
@@ -48,6 +49,7 @@ public class SearchAcrossLineageResolverTest {
4849
private SearchAcrossLineageResolver _resolver;
4950

5051
private EntityRegistry _entityRegistry;
52+
private ViewService _viewService;
5153

5254
@BeforeMethod
5355
public void setupTest() {
@@ -56,15 +58,16 @@ public void setupTest() {
5658
_authentication = mock(Authentication.class);
5759

5860
_entityRegistry = mock(EntityRegistry.class);
59-
_resolver = new SearchAcrossLineageResolver(_entityClient, _entityRegistry);
61+
_viewService = mock(ViewService.class);
62+
_resolver = new SearchAcrossLineageResolver(_entityClient, _entityRegistry, _viewService);
6063
}
6164

6265
@Test
6366
public void testAllEntitiesInitialization() {
6467
InputStream inputStream = ClassLoader.getSystemResourceAsStream("entity-registry.yml");
6568
EntityRegistry entityRegistry = new ConfigEntityRegistry(inputStream);
6669
SearchAcrossLineageResolver resolver =
67-
new SearchAcrossLineageResolver(_entityClient, entityRegistry);
70+
new SearchAcrossLineageResolver(_entityClient, entityRegistry, _viewService);
6871
assertTrue(resolver._allEntities.contains("dataset"));
6972
assertTrue(resolver._allEntities.contains("dataFlow"));
7073
// Test for case sensitivity
@@ -115,7 +118,7 @@ public void testSearchAcrossLineage() throws Exception {
115118
eq(QUERY),
116119
eq(null),
117120
any(),
118-
eq(null),
121+
eq(Collections.emptyList()),
119122
eq(START),
120123
eq(COUNT)))
121124
.thenReturn(lineageSearchResult);

datahub-web-react/src/app/entity/dataProcessInstance/profile/DataProcessInstanceSummary.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ const InfoItemContainer = styled.div<{ justifyContent }>`
2424
const InfoItemContent = styled.div`
2525
padding-top: 8px;
2626
width: 100px;
27+
overflow-wrap: break-word;
2728
`;
2829

2930
const propertyTableColumns = [

datahub-web-react/src/app/entity/mlModel/profile/MLModelSummary.tsx

+1-3
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,7 @@ const InfoItemContainer = styled.div<{ justifyContent }>`
2626
const InfoItemContent = styled.div`
2727
padding-top: 8px;
2828
width: 100px;
29-
display: flex;
30-
flex-wrap: wrap;
31-
gap: 5px;
29+
overflow-wrap: break-word;
3230
`;
3331

3432
const JobLink = styled(Link)`

datahub-web-react/src/app/ingest/secret/SecretsList.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ export const SecretsList = () => {
174174
);
175175
setTimeout(() => {
176176
refetch();
177-
}, 2000);
177+
}, 3000);
178178
})
179179
.catch((e) => {
180180
message.destroy();

datahub-web-react/src/app/searchV2/SearchBar.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import { useAppConfig, useIsShowSeparateSiblingsEnabled } from '../useAppConfig'
3131

3232
const StyledAutoComplete = styled(AutoComplete)<{ $isShowNavBarRedesign?: boolean }>`
3333
width: 100%;
34-
max-width: ${(props) => (props.$isShowNavBarRedesign ? '423px' : '540px')};
34+
max-width: ${(props) => (props.$isShowNavBarRedesign ? '632px' : '540px')};
3535
`;
3636

3737
const SkeletonContainer = styled.div`
@@ -466,7 +466,7 @@ export const SearchBar = ({
466466
maxHeight: 1000,
467467
overflowY: 'visible',
468468
position: (fixAutoComplete && 'fixed') || 'relative',
469-
...(isShowNavBarRedesign ? { minWidth: '435px' } : {}),
469+
...(isShowNavBarRedesign ? { minWidth: '648px' } : {}),
470470
}}
471471
onDropdownVisibleChange={(isOpen) => {
472472
if (!isOpen) {

datahub-web-react/src/app/searchV2/SearchHeader.tsx

+25-8
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const getStyles = ($isShowNavBarRedesign?: boolean) => {
2727
padding: 0,
2828
display: 'flex',
2929
justifyContent: 'center',
30-
width: $isShowNavBarRedesign ? '439px' : '620px',
30+
width: $isShowNavBarRedesign ? '648px' : '620px',
3131
minWidth: '400px',
3232
},
3333
};
@@ -48,17 +48,25 @@ const Header = styled(Layout)<{ $isNavBarCollapsed?: boolean; $isShowNavBarRedes
4848
background-color: transparent;
4949
height: ${(props) => (props.$isShowNavBarRedesign ? '56px' : '72px')};
5050
display: flex;
51-
${(props) => {
52-
if (!props.$isShowNavBarRedesign) return '';
53-
return `padding-left: ${props.$isNavBarCollapsed ? '68px;' : '270px'};`;
54-
}}
5551
${(props) =>
5652
props.$isShowNavBarRedesign &&
5753
`
5854
margin-top: 8px;
5955
gap: 16px;
6056
flex-direction: row;
61-
transition: padding 250ms ease-in-out;
57+
58+
// preventing of NavBar's overlapping
59+
position: relative;
60+
padding-left: ${props.$isNavBarCollapsed ? '224px' : '540px'};
61+
left: ${props.$isNavBarCollapsed ? '-112px' : '-270px'};
62+
transition: none;
63+
@media only screen and (min-width: 1280px) {
64+
padding-left: 540px;
65+
left: -270px;
66+
}
67+
@media only screen and (max-width: 1200px) {
68+
transition: padding 250ms ease-in-out;
69+
}
6270
`}
6371
${(props) => props.$isShowNavBarRedesign && !props.$isNavBarCollapsed && 'justify-content: space-between;'}
6472
align-items: center;
@@ -76,10 +84,10 @@ const SearchBarContainer = styled.div<{ $isShowNavBarRedesign?: boolean }>`
7684
display: flex;
7785
flex: 1;
7886
align-items: center;
87+
justify-content: center;
7988
${(props) =>
8089
!props.$isShowNavBarRedesign &&
8190
`
82-
justify-content: center;
8391
margin-left: 80px;
8492
margin-top: 6px;
8593
`}
@@ -106,6 +114,11 @@ const StyledButton = styled(Button)`
106114
}
107115
`;
108116

117+
const NavBarTogglerWrapper = styled.div`
118+
position: fixed;
119+
left: 68px;
120+
`;
121+
109122
type Props = {
110123
initialQuery: string;
111124
placeholderText: string;
@@ -140,7 +153,11 @@ export const SearchHeader = ({
140153
<HeaderBackground $isShowNavBarRedesign={isShowNavBarRedesign} />
141154
<Wrapper $isShowNavBarRedesign={isShowNavBarRedesign}>
142155
<Header $isShowNavBarRedesign={isShowNavBarRedesign} $isNavBarCollapsed={isCollapsed}>
143-
{isShowNavBarRedesign && isCollapsed && <NavBarToggler />}
156+
{isShowNavBarRedesign && isCollapsed && (
157+
<NavBarTogglerWrapper>
158+
<NavBarToggler />
159+
</NavBarTogglerWrapper>
160+
)}
144161
<SearchBarContainer $isShowNavBarRedesign={isShowNavBarRedesign}>
145162
<SearchBar
146163
isLoading={isUserInitializing || !appConfig.loaded}

datahub-web-react/src/app/searchV2/autoComplete/AutoCompleteEntity.tsx

+1-4
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,11 @@ export default function AutoCompleteEntity({ query, entity, siblings, hasParentT
8080
.filter(Boolean) ?? [];
8181

8282
const parentContainers = genericEntityProps?.parentContainers?.containers || [];
83-
// Need to reverse parentContainers since it returns direct parent first.
84-
const orderedParentContainers = [...parentContainers].reverse();
8583

8684
const subtype = genericEntityProps?.subTypes?.typeNames?.[0];
8785

8886
// Parent entities are either a) containers or b) entity-type specific parents (glossary nodes, domains, etc)
89-
const parentEntities =
90-
(orderedParentContainers?.length && orderedParentContainers) || getParentEntities(entity) || [];
87+
const parentEntities = (parentContainers?.length && parentContainers) || getParentEntities(entity) || [];
9188

9289
const showPlatforms = !!platforms.length;
9390
const showPlatformDivider = !!platforms.length && !!parentContainers.length;

datahub-web-react/src/graphql/fragments.graphql

+4
Original file line numberDiff line numberDiff line change
@@ -1151,6 +1151,10 @@ fragment nonRecursiveMLModelGroupFields on MLModelGroup {
11511151
trainingJobs
11521152
downstreamJobs
11531153
}
1154+
customProperties {
1155+
key
1156+
value
1157+
}
11541158
}
11551159
browsePathV2 {
11561160
...browsePathV2Fields

0 commit comments

Comments
 (0)