Skip to content

Commit accc254

Browse files
committed
fix(graphql): add data process instance entity type (#4865)
1 parent 92f013e commit accc254

File tree

5 files changed

+110
-18
lines changed

5 files changed

+110
-18
lines changed

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

+5-1
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,7 @@
346346
import com.linkedin.datahub.graphql.types.datajob.DataJobType;
347347
import com.linkedin.datahub.graphql.types.dataplatform.DataPlatformType;
348348
import com.linkedin.datahub.graphql.types.dataplatforminstance.DataPlatformInstanceType;
349+
import com.linkedin.datahub.graphql.types.dataprocessinst.DataProcessInstanceType;
349350
import com.linkedin.datahub.graphql.types.dataprocessinst.mappers.DataProcessInstanceRunEventMapper;
350351
import com.linkedin.datahub.graphql.types.dataproduct.DataProductType;
351352
import com.linkedin.datahub.graphql.types.dataset.DatasetType;
@@ -530,6 +531,7 @@ public class GmsGraphQLEngine {
530531
private final FormType formType;
531532
private final IncidentType incidentType;
532533
private final RestrictedType restrictedType;
534+
private final DataProcessInstanceType dataProcessInstanceType;
533535

534536
private final int graphQLQueryComplexityLimit;
535537
private final int graphQLQueryDepthLimit;
@@ -649,6 +651,7 @@ public GmsGraphQLEngine(final GmsGraphQLEngineArgs args) {
649651
this.formType = new FormType(entityClient);
650652
this.incidentType = new IncidentType(entityClient);
651653
this.restrictedType = new RestrictedType(entityClient, restrictedService);
654+
this.dataProcessInstanceType = new DataProcessInstanceType(entityClient);
652655

653656
this.graphQLQueryComplexityLimit = args.graphQLQueryComplexityLimit;
654657
this.graphQLQueryDepthLimit = args.graphQLQueryDepthLimit;
@@ -699,7 +702,8 @@ public GmsGraphQLEngine(final GmsGraphQLEngineArgs args) {
699702
formType,
700703
incidentType,
701704
restrictedType,
702-
businessAttributeType));
705+
businessAttributeType,
706+
dataProcessInstanceType));
703707
this.loadableTypes = new ArrayList<>(entityTypes);
704708
// Extend loadable types with types from the plugins
705709
// This allows us to offer search and browse capabilities out of the box for

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

+5
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,11 @@ public Entity apply(@Nullable QueryContext context, Urn input) {
225225
((BusinessAttribute) partialEntity).setUrn(input.toString());
226226
((BusinessAttribute) partialEntity).setType(EntityType.BUSINESS_ATTRIBUTE);
227227
}
228+
if (input.getEntityType().equals(DATA_PROCESS_INSTANCE_ENTITY_NAME)) {
229+
partialEntity = new DataProcessInstance();
230+
((DataProcessInstance) partialEntity).setUrn(input.toString());
231+
((DataProcessInstance) partialEntity).setType(EntityType.DATA_PROCESS_INSTANCE);
232+
}
228233
return partialEntity;
229234
}
230235
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package com.linkedin.datahub.graphql.types.dataprocessinst;
2+
3+
import static com.linkedin.datahub.graphql.authorization.AuthorizationUtils.canView;
4+
import static com.linkedin.metadata.Constants.*;
5+
6+
import com.google.common.collect.ImmutableSet;
7+
import com.linkedin.common.urn.Urn;
8+
import com.linkedin.common.urn.UrnUtils;
9+
import com.linkedin.datahub.graphql.QueryContext;
10+
import com.linkedin.datahub.graphql.generated.DataProcessInstance;
11+
import com.linkedin.datahub.graphql.generated.Entity;
12+
import com.linkedin.datahub.graphql.generated.EntityType;
13+
import com.linkedin.datahub.graphql.types.dataprocessinst.mappers.DataProcessInstanceMapper;
14+
import com.linkedin.entity.EntityResponse;
15+
import com.linkedin.entity.client.EntityClient;
16+
import graphql.execution.DataFetcherResult;
17+
import java.util.ArrayList;
18+
import java.util.List;
19+
import java.util.Map;
20+
import java.util.Set;
21+
import java.util.function.Function;
22+
import java.util.stream.Collectors;
23+
import javax.annotation.Nonnull;
24+
25+
public class DataProcessInstanceType
26+
implements com.linkedin.datahub.graphql.types.EntityType<DataProcessInstance, String> {
27+
28+
private static final Set<String> ASPECTS_TO_RESOLVE =
29+
ImmutableSet.of(
30+
DATA_PROCESS_INSTANCE_KEY_ASPECT_NAME,
31+
DATA_PROCESS_INSTANCE_INPUT_ASPECT_NAME,
32+
DATA_PROCESS_INSTANCE_OUTPUT_ASPECT_NAME,
33+
DATA_PROCESS_INSTANCE_RELATIONSHIPS_ASPECT_NAME,
34+
STATUS_ASPECT_NAME,
35+
TEST_RESULTS_ASPECT_NAME,
36+
LINEAGE_FEATURES_ASPECT_NAME);
37+
38+
private static final Set<String> FACET_FIELDS = ImmutableSet.of("origin", "platform");
39+
private static final String ENTITY_NAME = "dataProcessInstance";
40+
41+
private final EntityClient entityClient;
42+
43+
public DataProcessInstanceType(final EntityClient entityClient) {
44+
this.entityClient = entityClient;
45+
}
46+
47+
@Override
48+
public Class<DataProcessInstance> objectClass() {
49+
return DataProcessInstance.class;
50+
}
51+
52+
@Override
53+
public EntityType type() {
54+
return EntityType.DATA_PROCESS_INSTANCE;
55+
}
56+
57+
@Override
58+
public Function<Entity, String> getKeyProvider() {
59+
return Entity::getUrn;
60+
}
61+
62+
@Override
63+
public List<DataFetcherResult<DataProcessInstance>> batchLoad(
64+
@Nonnull final List<String> urnStrs, @Nonnull final QueryContext context) {
65+
try {
66+
final List<Urn> urns = urnStrs.stream().map(UrnUtils::getUrn).collect(Collectors.toList());
67+
68+
final Map<Urn, EntityResponse> dataProcessInstanceMap =
69+
entityClient.batchGetV2(
70+
context.getOperationContext(),
71+
DATA_PROCESS_INSTANCE_ENTITY_NAME,
72+
urns.stream()
73+
.filter(urn -> canView(context.getOperationContext(), urn))
74+
.collect(Collectors.toSet()),
75+
ASPECTS_TO_RESOLVE);
76+
77+
final List<EntityResponse> gmsResults = new ArrayList<>(urnStrs.size());
78+
for (Urn urn : urns) {
79+
gmsResults.add(dataProcessInstanceMap.getOrDefault(urn, null));
80+
}
81+
return gmsResults.stream()
82+
.map(
83+
gmsDataProcessInstance ->
84+
gmsDataProcessInstance == null
85+
? null
86+
: DataFetcherResult.<DataProcessInstance>newResult()
87+
.data(DataProcessInstanceMapper.map(context, gmsDataProcessInstance))
88+
.build())
89+
.collect(Collectors.toList());
90+
} catch (Exception e) {
91+
throw new RuntimeException("Failed to batch load Datasets", e);
92+
}
93+
}
94+
}

li-utils/src/main/java/com/linkedin/metadata/Constants.java

+3
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,9 @@ public class Constants {
421421
"dataProcessInstanceRunEvent";
422422
public static final String DATA_PROCESS_INSTANCE_RELATIONSHIPS_ASPECT_NAME =
423423
"dataProcessInstanceRelationships";
424+
public static final String DATA_PROCESS_INSTANCE_INPUT_ASPECT_NAME = "dataProcessInstanceInput";
425+
public static final String DATA_PROCESS_INSTANCE_OUTPUT_ASPECT_NAME = "dataProcessInstanceOutput";
426+
public static final String DATA_PROCESS_INSTANCE_KEY_ASPECT_NAME = "dataProcessInstanceKey";
424427

425428
// Business Attribute
426429
public static final String BUSINESS_ATTRIBUTE_KEY_ASPECT_NAME = "businessAttributeKey";

metadata-auth/auth-api/src/main/java/com/datahub/authorization/AuthUtil.java

+3-17
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,6 @@
11
package com.datahub.authorization;
22

3-
import static com.linkedin.metadata.Constants.CHART_ENTITY_NAME;
4-
import static com.linkedin.metadata.Constants.DASHBOARD_ENTITY_NAME;
5-
import static com.linkedin.metadata.Constants.DATASET_ENTITY_NAME;
6-
import static com.linkedin.metadata.Constants.DATA_FLOW_ENTITY_NAME;
7-
import static com.linkedin.metadata.Constants.DATA_JOB_ENTITY_NAME;
8-
import static com.linkedin.metadata.Constants.DATA_PRODUCT_ENTITY_NAME;
9-
import static com.linkedin.metadata.Constants.DOMAIN_ENTITY_NAME;
10-
import static com.linkedin.metadata.Constants.GLOSSARY_NODE_ENTITY_NAME;
11-
import static com.linkedin.metadata.Constants.GLOSSARY_TERM_ENTITY_NAME;
12-
import static com.linkedin.metadata.Constants.ML_FEATURE_ENTITY_NAME;
13-
import static com.linkedin.metadata.Constants.ML_FEATURE_TABLE_ENTITY_NAME;
14-
import static com.linkedin.metadata.Constants.ML_MODEL_ENTITY_NAME;
15-
import static com.linkedin.metadata.Constants.ML_MODEL_GROUP_ENTITY_NAME;
16-
import static com.linkedin.metadata.Constants.ML_PRIMARY_KEY_ENTITY_NAME;
17-
import static com.linkedin.metadata.Constants.NOTEBOOK_ENTITY_NAME;
18-
import static com.linkedin.metadata.Constants.REST_API_AUTHORIZATION_ENABLED_ENV;
3+
import static com.linkedin.metadata.Constants.*;
194
import static com.linkedin.metadata.authorization.ApiGroup.ENTITY;
205
import static com.linkedin.metadata.authorization.ApiOperation.CREATE;
216
import static com.linkedin.metadata.authorization.ApiOperation.DELETE;
@@ -89,7 +74,8 @@ public class AuthUtil {
8974
GLOSSARY_NODE_ENTITY_NAME,
9075
DOMAIN_ENTITY_NAME,
9176
DATA_PRODUCT_ENTITY_NAME,
92-
NOTEBOOK_ENTITY_NAME);
77+
NOTEBOOK_ENTITY_NAME,
78+
DATA_PROCESS_INSTANCE_ENTITY_NAME);
9379

9480
/** OpenAPI/Rest.li Methods */
9581
public static List<Pair<MetadataChangeProposal, Integer>> isAPIAuthorized(

0 commit comments

Comments
 (0)