mysterious-lamp-91034
06/03/2022, 8:28 PMmysterious-lamp-91034
06/03/2022, 8:29 PM// metadata-models/src/main/pegasus/com/linkedin/schema/ThriftEnumKey.pdl
namespace com.linkedin.schema
/**
* Key to retrieve Thrift Enum Type.
*/
@Aspect = {
"name": "thriftEnumKey"
}
record ThriftEnumKey {
/**
* Thrift Enum Type name e.g. PageViewEvent, identity.Profile, ams.account_management_tracking
*/
@Searchable = {
"fieldName": "id"
"fieldType": "TEXT_PARTIAL",
"enableAutocomplete": true,
"boostScore": 10.0
}
name: string
}
mysterious-lamp-91034
06/03/2022, 8:29 PM// datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/types/thrift/ThriftEnumType.java
package com.linkedin.datahub.graphql.types.thrift;
import static com.linkedin.metadata.Constants.*;
import com.linkedin.common.urn.Urn;
import com.linkedin.common.urn.UrnUtils;
import com.linkedin.data.template.StringArray;
import com.linkedin.datahub.graphql.QueryContext;
import com.linkedin.datahub.graphql.generated.AutoCompleteResults;
import com.linkedin.datahub.graphql.generated.BrowsePath;
import com.linkedin.datahub.graphql.generated.BrowseResults;
import com.linkedin.datahub.graphql.generated.EntityType;
import com.linkedin.datahub.graphql.generated.FacetFilterInput;
import com.linkedin.datahub.graphql.generated.SearchResults;
import com.linkedin.datahub.graphql.generated.ThriftEnum;
import com.linkedin.datahub.graphql.resolvers.ResolverUtils;
import com.linkedin.datahub.graphql.types.BrowsableEntityType;
import com.linkedin.datahub.graphql.types.SearchableEntityType;
import com.linkedin.datahub.graphql.types.mappers.AutoCompleteResultsMapper;
import com.linkedin.datahub.graphql.types.mappers.BrowsePathsMapper;
import com.linkedin.datahub.graphql.types.mappers.BrowseResultMapper;
import com.linkedin.datahub.graphql.types.mappers.UrnSearchResultsMapper;
import com.linkedin.datahub.graphql.types.pinterest.ThriftEnumUtils;
import com.linkedin.datahub.graphql.types.thrift.mapper.ThriftEnumMapper;
import com.linkedin.entity.EntityResponse;
import com.linkedin.entity.client.EntityClient;
import com.linkedin.metadata.Constants;
import com.linkedin.metadata.browse.BrowseResult;
import com.linkedin.metadata.query.AutoCompleteResult;
import com.linkedin.metadata.search.SearchResult;
import graphql.com.google.common.collect.ImmutableSet;
import graphql.execution.DataFetcherResult;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import static com.linkedin.datahub.graphql.Constants.*;
public class ThriftEnumType implements SearchableEntityType<ThriftEnum>, BrowsableEntityType<ThriftEnum> {
private static final Set<String> ASPECTS_TO_RESOLVE = ImmutableSet.of(
THRIFT_ENUM_KEY_ASPECT_NAME,
THRIFT_ENUM_PROPERTIES_ASPECT_NAME
);
private static final Set<String> FACET_FIELDS = ImmutableSet.of();
private static final String ENTITY_NAME = "thriftEnum";
private final EntityClient _entityClient;
public ThriftEnumType(final EntityClient entityClient) {
_entityClient = entityClient;
}
@Override
public EntityType type() {
return EntityType.THRIFT_ENUM;
}
@Override
public Class<ThriftEnum> objectClass() {
return ThriftEnum.class;
}
@Override
public List<DataFetcherResult<ThriftEnum>> batchLoad(
List<String> urnStrs,
QueryContext context
) {
final List<Urn> urns = urnStrs
.stream()
.map(UrnUtils::getUrn)
.collect(Collectors.toList());
try {
final Map<Urn, EntityResponse> pinterestThriftEnumItemMap = _entityClient.batchGetV2(
Constants.THRIFT_ENUM_ENTITY_NAME,
new HashSet<>(urns),
ASPECTS_TO_RESOLVE,
context.getAuthentication()
);
final List<EntityResponse> gmsResults = new ArrayList<>();
for (Urn urn : urns) {
gmsResults.add(pinterestThriftEnumItemMap.getOrDefault(urn, null));
}
return gmsResults
.stream()
.map(
gmsThriftEnum ->
gmsThriftEnum == null
? null
: DataFetcherResult
.<ThriftEnum>newResult()
.data(ThriftEnumMapper.map(gmsThriftEnum))
.build()
)
.collect(Collectors.toList());
} catch (Exception e) {
throw new RuntimeException(
"Failed to batch load PinterestThriftEnumItems",
e
);
}
}
@Override
public SearchResults search(
@Nonnull String query,
@Nullable List<FacetFilterInput> filters,
int start,
int count,
@Nonnull final QueryContext context
)
throws Exception {
final Map<String, String> facetFilters = ResolverUtils.buildFacetFilters(
filters,
FACET_FIELDS
);
final SearchResult searchResult = _entityClient.search(
ENTITY_NAME,
query,
facetFilters,
start,
count,
context.getAuthentication()
);
return UrnSearchResultsMapper.map(searchResult);
}
@Override
public AutoCompleteResults autoComplete(
@Nonnull String query,
@Nullable String field,
@Nullable List<FacetFilterInput> filters,
int limit,
@Nonnull final QueryContext context
)
throws Exception {
final Map<String, String> facetFilters = ResolverUtils.buildFacetFilters(
filters,
FACET_FIELDS
);
final AutoCompleteResult result = _entityClient.autoComplete(
ENTITY_NAME,
query,
facetFilters,
limit,
context.getAuthentication()
);
return AutoCompleteResultsMapper.map(result);
}
@Override
public BrowseResults browse(@Nonnull List<String> path,
@Nullable List<FacetFilterInput> filters,
int start,
int count,
@Nonnull final QueryContext context) throws Exception {
final Map<String, String> facetFilters = ResolverUtils.buildFacetFilters(filters, FACET_FIELDS);
final String pathStr = path.size() > 0 ? BROWSE_PATH_DELIMITER + String.join(BROWSE_PATH_DELIMITER, path) : "";
final BrowseResult result = _entityClient.browse(
"thriftEnum",
pathStr,
facetFilters,
start,
count,
context.getAuthentication());
return BrowseResultMapper.map(result);
}
@Override
public List<BrowsePath> browsePaths(@Nonnull String urn, @Nonnull final QueryContext context) throws Exception {
final StringArray result = _entityClient.getBrowsePaths(ThriftEnumUtils.getThriftEnumUrn(urn), context.getAuthentication());
return BrowsePathsMapper.map(result);
}
}
mysterious-lamp-91034
06/03/2022, 8:31 PM- name: thriftEnum
keyAspect: thriftEnumKey
aspects:
- thriftEnumProperties
- browsePaths
After ingestion, I checked mysql
mysql> select * from metadata_aspect_v2 where urn = 'urn:li:thriftEnum:com.company.TweetType' and aspect='browsePaths' \G
*************************** 1. row ***************************
urn: urn:li:thriftEnum:com.company.TweetType
aspect: browsePaths
version: 0
metadata: {"paths":["/prod/thrift/com/company/tweettype"]}
systemmetadata: {"registryVersion":"0.0.0.0-dev","runId":"thrift-2022_06_03-20_12_07","registryName":"unknownRegistry","lastObserved":1654287127450}
createdon: 2022-06-03 20:12:07.477000
createdby: urn:li:corpuser:UNKNOWN
createdfor: NULL
In GraphQL
query C {
thriftEnum(urn: "urn:li:thriftEnum:com.company.TweetType"){
urn
type
items {
key
}
}
}
See
{
"data": {
"thriftEnum": {
"urn": "urn:li:thriftEnum:com.company.TweetType",
"type": "THRIFT_ENUM",
"items": [
{
"key": "TWEET"
},
{
"key": "RETWEET"
},
{
"key": "DM"
},
{
"key": "REPLY"
}
]
}
}
}
if I query browse
query B {
browse(input: {type: THRIFT_ENUM, path: ["prod/thrift/com"], count: 10, start:0, filters: null}){
entities {
urn
type
}
groups {
name
}
count
total
}
}
See
{
"data": {
"browse": {
"entities": [],
"groups": [
{
"name": "company"
}
],
"count": 10,
"total": 1
}
}
}
So far, it is all expected.
But if I replace path to "prod/thrift/com/company"
I see error in gms
datahub-gms | 20:26:03.920 [ForkJoinPool.commonPool-worker-36] ERROR c.l.d.g.e.DataHubDataFetcherExceptionHandler:21 - Failed to execute DataFetcher
datahub-gms | java.lang.NullPointerException: null
datahub-gms | at com.linkedin.datahub.graphql.resolvers.load.EntityTypeBatchResolver.lambda$get$0(EntityTypeBatchResolver.java:45)
datahub-gms | at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
datahub-gms | at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1384)
datahub-gms | at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
datahub-gms | at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
datahub-gms | at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
datahub-gms | at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
datahub-gms | at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566)
datahub-gms | at com.linkedin.datahub.graphql.resolvers.load.EntityTypeBatchResolver.get(EntityTypeBatchResolver.java:46)
datahub-gms | at com.linkedin.datahub.graphql.resolvers.load.EntityTypeBatchResolver.get(EntityTypeBatchResolver.java:23)
datahub-gms | at com.linkedin.datahub.graphql.resolvers.AuthenticatedResolver.get(AuthenticatedResolver.java:25)
datahub-gms | at graphql.execution.ExecutionStrategy.fetchField(ExecutionStrategy.java:270)
datahub-gms | at graphql.execution.ExecutionStrategy.resolveFieldWithInfo(ExecutionStrategy.java:203)
datahub-gms | at graphql.execution.AsyncExecutionStrategy.execute(AsyncExecutionStrategy.java:60)
datahub-gms | at graphql.execution.ExecutionStrategy.completeValueForObject(ExecutionStrategy.java:646)
datahub-gms | at graphql.execution.ExecutionStrategy.completeValue(ExecutionStrategy.java:438)
datahub-gms | at graphql.execution.ExecutionStrategy.completeField(ExecutionStrategy.java:390)
datahub-gms | at graphql.execution.ExecutionStrategy.lambda$resolveFieldWithInfo$1(ExecutionStrategy.java:205)
datahub-gms | at java.util.concurrent.CompletableFuture.uniApply(CompletableFuture.java:616)
datahub-gms | at java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:591)
datahub-gms | at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:488)
datahub-gms | at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1609)
datahub-gms | at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1596)
datahub-gms | at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
datahub-gms | at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
datahub-gms | at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
datahub-gms | at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:175)
datahub-gms | 20:26:03.921 [ForkJoinPool.commonPool-worker-43] ERROR c.datahub.graphql.GraphQLController:93 - Errors while executing graphQL query: "query B {\n browse(input: {type: THRIFT_ENUM, path: [\"prod/thrift/com/company\"], count: 10, start:0, filters: null}){\n entities {\n urn\n type \n }\n groups {\n name\n }\n count\n total\n }\n}", result: {errors=[{message=An unknown error occurred., locations=[{line=3, column=5}], path=[browse, entities], extensions={code=500, type=SERVER_ERROR, classification=DataFetchingException}}], data={browse=null}}, errors: [DataHubGraphQLError{path=[browse, entities], code=SERVER_ERROR, locations=[SourceLocation{line=3, column=5}]}]
mysterious-lamp-91034
06/03/2022, 8:38 PMmysterious-lamp-91034
06/03/2022, 8:51 PMearly-lamp-41924
06/03/2022, 8:53 PMearly-lamp-41924
06/03/2022, 8:53 PMearly-lamp-41924
06/03/2022, 8:53 PMearly-lamp-41924
06/03/2022, 8:53 PMmysterious-lamp-91034
06/03/2022, 8:55 PMmysterious-lamp-91034
06/03/2022, 8:55 PMearly-lamp-41924
06/03/2022, 8:56 PMearly-lamp-41924
06/03/2022, 8:56 PMearly-lamp-41924
06/03/2022, 8:56 PMearly-lamp-41924
06/03/2022, 8:56 PMearly-lamp-41924
06/03/2022, 8:56 PMmysterious-lamp-91034
06/03/2022, 8:58 PM/ => empty
/prod => empty
prod => thrift
prod/thrift => com
prod/thrift/com => company
prod/thrift/com/company => NPE
mysterious-lamp-91034
06/03/2022, 8:59 PMmysql> select * from metadata_aspect_v2 where urn = 'urn:li:thriftEnum:com.company.TweetType' and aspect='browsePaths' \G
*************************** 1. row ***************************
urn: urn:li:thriftEnum:com.company.TweetType
aspect: browsePaths
version: 0
metadata: {"paths":["/prod/thrift/com/company/tweettype"]}
systemmetadata: {"registryVersion":"0.0.0.0-dev","runId":"thrift-2022_06_03-20_12_07","registryName":"unknownRegistry","lastObserved":1654287127450}
createdon: 2022-06-03 20:12:07.477000
createdby: urn:li:corpuser:UNKNOWN
createdfor: NULL
early-lamp-41924
06/03/2022, 9:06 PMearly-lamp-41924
06/03/2022, 9:06 PMearly-lamp-41924
06/03/2022, 9:06 PMearly-lamp-41924
06/03/2022, 9:06 PMearly-lamp-41924
06/03/2022, 9:06 PMearly-lamp-41924
06/03/2022, 9:07 PMearly-lamp-41924
06/03/2022, 9:07 PMmysterious-lamp-91034
06/03/2022, 9:08 PMnever used graphql browse beforeIs there other way to browse?
early-lamp-41924
06/03/2022, 9:08 PMearly-lamp-41924
06/03/2022, 9:08 PMearly-lamp-41924
06/03/2022, 9:08 PMearly-lamp-41924
06/03/2022, 9:08 PMearly-lamp-41924
06/03/2022, 9:08 PMmysterious-lamp-91034
06/03/2022, 9:09 PMjust try the above array in pathHow to do it?
early-lamp-41924
06/03/2022, 9:10 PMearly-lamp-41924
06/03/2022, 9:10 PMmysterious-lamp-91034
06/03/2022, 9:10 PMmysterious-lamp-91034
06/03/2022, 9:11 PMmysterious-lamp-91034
06/03/2022, 9:12 PMmysterious-lamp-91034
06/04/2022, 4:33 AMmysterious-lamp-91034
06/06/2022, 4:35 PMmysterious-lamp-91034
06/07/2022, 1:34 AMmysterious-lamp-91034
06/07/2022, 4:28 PMif (input.getEntityType().equals("thriftEnum")) {
partialEntity = new ThriftEnum();
((ThriftEnum) partialEntity).setUrn(input.toString());
((ThriftEnum) partialEntity).setType(EntityType.THRIFT_ENUM);
}
in datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/types/common/mappers/UrnToEntityMapper.java
big-carpet-38439
06/07/2022, 5:32 PM