Skip to content

Commit 69fdaf3

Browse files
committed
feat(models,ui): Support query nodes in lineage
1 parent 0328f85 commit 69fdaf3

File tree

7 files changed

+62
-6
lines changed

7 files changed

+62
-6
lines changed

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

+20-1
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
import com.linkedin.datahub.graphql.generated.ParentDomainsResult;
9191
import com.linkedin.datahub.graphql.generated.PolicyMatchCriterionValue;
9292
import com.linkedin.datahub.graphql.generated.QueryEntity;
93+
import com.linkedin.datahub.graphql.generated.QueryProperties;
9394
import com.linkedin.datahub.graphql.generated.QuerySubject;
9495
import com.linkedin.datahub.graphql.generated.QuickFilter;
9596
import com.linkedin.datahub.graphql.generated.RecommendationContent;
@@ -2583,9 +2584,27 @@ private void configureQueryEntityResolvers(final RuntimeWiring.Builder builder)
25832584
builder
25842585
.type(
25852586
"QueryEntity",
2587+
typeWiring ->
2588+
typeWiring
2589+
.dataFetcher(
2590+
"relationships", new EntityRelationshipsResultResolver(graphClient))
2591+
.dataFetcher(
2592+
"platform",
2593+
new LoadableTypeResolver<>(
2594+
dataPlatformType,
2595+
(env) -> {
2596+
final QueryEntity query = env.getSource();
2597+
return query.getPlatform() != null
2598+
? query.getPlatform().getUrn()
2599+
: null;
2600+
})))
2601+
.type(
2602+
"QueryProperties",
25862603
typeWiring ->
25872604
typeWiring.dataFetcher(
2588-
"relationships", new EntityRelationshipsResultResolver(graphClient)))
2605+
"origin",
2606+
new EntityTypeResolver(
2607+
entityTypes, (env) -> ((QueryProperties) env.getSource()).getOrigin())))
25892608
.type(
25902609
"ListQueriesResult",
25912610
typeWiring ->

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/types/common/mappers/FineGrainedLineagesMapper.java

+6
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ public List<com.linkedin.datahub.graphql.generated.FineGrainedLineage> apply(
4545
.map(FineGrainedLineagesMapper::mapDatasetSchemaField)
4646
.collect(Collectors.toList()));
4747
}
48+
if (fineGrainedLineage.hasQuery()) {
49+
resultEntry.setQuery(fineGrainedLineage.getQuery().toString());
50+
}
51+
if (fineGrainedLineage.hasTransformOperation()) {
52+
resultEntry.setTransformOperation(fineGrainedLineage.getTransformOperation());
53+
}
4854
result.add(resultEntry);
4955
}
5056
return result;

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/types/query/QueryMapper.java

+19
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,20 @@
22

33
import static com.linkedin.metadata.Constants.*;
44

5+
import com.linkedin.common.DataPlatformInstance;
56
import com.linkedin.common.urn.Urn;
67
import com.linkedin.data.DataMap;
78
import com.linkedin.data.template.GetMode;
89
import com.linkedin.datahub.graphql.generated.AuditStamp;
10+
import com.linkedin.datahub.graphql.generated.DataPlatform;
911
import com.linkedin.datahub.graphql.generated.Dataset;
1012
import com.linkedin.datahub.graphql.generated.EntityType;
1113
import com.linkedin.datahub.graphql.generated.QueryEntity;
1214
import com.linkedin.datahub.graphql.generated.QueryLanguage;
1315
import com.linkedin.datahub.graphql.generated.QuerySource;
1416
import com.linkedin.datahub.graphql.generated.QueryStatement;
1517
import com.linkedin.datahub.graphql.generated.QuerySubject;
18+
import com.linkedin.datahub.graphql.types.common.mappers.UrnToEntityMapper;
1619
import com.linkedin.datahub.graphql.types.common.mappers.util.MappingHelper;
1720
import com.linkedin.datahub.graphql.types.mappers.ModelMapper;
1821
import com.linkedin.entity.EntityResponse;
@@ -22,7 +25,9 @@
2225
import java.util.List;
2326
import java.util.stream.Collectors;
2427
import javax.annotation.Nonnull;
28+
import lombok.extern.slf4j.Slf4j;
2529

30+
@Slf4j
2631
public class QueryMapper implements ModelMapper<EntityResponse, QueryEntity> {
2732

2833
public static final QueryMapper INSTANCE = new QueryMapper();
@@ -41,9 +46,20 @@ public QueryEntity apply(@Nonnull final EntityResponse entityResponse) {
4146
MappingHelper<QueryEntity> mappingHelper = new MappingHelper<>(aspectMap, result);
4247
mappingHelper.mapToResult(QUERY_PROPERTIES_ASPECT_NAME, this::mapQueryProperties);
4348
mappingHelper.mapToResult(QUERY_SUBJECTS_ASPECT_NAME, this::mapQuerySubjects);
49+
mappingHelper.mapToResult(DATA_PLATFORM_INSTANCE_ASPECT_NAME, this::mapPlatform);
4450
return mappingHelper.getResult();
4551
}
4652

53+
private void mapPlatform(@Nonnull QueryEntity query, @Nonnull DataMap dataMap) {
54+
DataPlatformInstance aspect = new DataPlatformInstance(dataMap);
55+
if (aspect.hasPlatform()) {
56+
final DataPlatform platform = new DataPlatform();
57+
platform.setUrn(aspect.getPlatform().toString());
58+
platform.setType(EntityType.DATA_PLATFORM);
59+
query.setPlatform(platform);
60+
}
61+
}
62+
4763
private void mapQueryProperties(@Nonnull QueryEntity query, @Nonnull DataMap dataMap) {
4864
QueryProperties queryProperties = new QueryProperties(dataMap);
4965
com.linkedin.datahub.graphql.generated.QueryProperties res =
@@ -57,6 +73,9 @@ private void mapQueryProperties(@Nonnull QueryEntity query, @Nonnull DataMap dat
5773
QueryLanguage.valueOf(queryProperties.getStatement().getLanguage().toString())));
5874
res.setName(queryProperties.getName(GetMode.NULL));
5975
res.setDescription(queryProperties.getDescription(GetMode.NULL));
76+
if (queryProperties.hasOrigin() && queryProperties.getOrigin() != null) {
77+
res.setOrigin(UrnToEntityMapper.map(queryProperties.getOrigin()));
78+
}
6079

6180
AuditStamp created = new AuditStamp();
6281
created.setTime(queryProperties.getCreated().getTime());

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ fragment lineageNodeProperties on EntityWithRelationships {
5555
urn
5656
path
5757
}
58+
query
59+
transformOperation
5860
}
5961
}
6062
health {
@@ -562,4 +564,4 @@ query getSearchAcrossLineageCounts(
562564
...facetFields
563565
}
564566
}
565-
}
567+
}

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

+7-1
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ query getQuery($urn: String!) {
1111
fragment query on QueryEntity {
1212
urn
1313
properties {
14-
description
1514
name
15+
description
1616
source
1717
statement {
1818
value
@@ -26,6 +26,12 @@ fragment query on QueryEntity {
2626
time
2727
actor
2828
}
29+
origin {
30+
...searchResultFields
31+
}
32+
}
33+
platform {
34+
...platformFields
2935
}
3036
subjects {
3137
dataset {

metadata-models/src/main/pegasus/com/linkedin/query/QueryProperties.pdl

+4-2
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,9 @@ record QueryProperties {
7676
lastModified: AuditStamp
7777

7878
/**
79-
* The urn of the DataPlatform where the Query was executed.
79+
* The origin of the Query.
80+
* This is the source of the Query (e.g. a View, Stored Procedure, dbt Model, etc.) that the Query was created from.
8081
*/
81-
dataPlatform: optional Urn
82+
origin: optional Urn
83+
8284
}

metadata-models/src/main/resources/entity-registry.yml

+3-1
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,8 @@ entities:
488488
- queryProperties
489489
- querySubjects
490490
- status
491+
- dataPlatformInstance
492+
- subTypes
491493
- name: dataProduct
492494
category: core
493495
keyAspect: dataProductKey
@@ -562,4 +564,4 @@ plugins:
562564
- UPSERT
563565
supportedEntityAspectNames:
564566
- entityName: '*'
565-
aspectName: structuredProperties
567+
aspectName: structuredProperties

0 commit comments

Comments
 (0)