Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(ui): Adding Search Bar to all List Views (groups, users, domains, policies, ingestion) #4919

Merged
merged 10 commits into from
May 16, 2022
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.linkedin.datahub.graphql.resolvers.domain;

import com.linkedin.common.UrnArray;
import com.linkedin.common.urn.Urn;
import com.linkedin.datahub.graphql.QueryContext;
import com.linkedin.datahub.graphql.authorization.AuthorizationUtils;
Expand All @@ -11,13 +10,15 @@
import com.linkedin.datahub.graphql.generated.ListDomainsResult;
import com.linkedin.entity.client.EntityClient;
import com.linkedin.metadata.Constants;
import com.linkedin.metadata.query.ListResult;
import com.linkedin.metadata.search.SearchEntity;
import com.linkedin.metadata.search.SearchResult;
import graphql.schema.DataFetcher;
import graphql.schema.DataFetchingEnvironment;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;

import static com.linkedin.datahub.graphql.resolvers.ResolverUtils.*;

Expand All @@ -29,6 +30,7 @@ public class ListDomainsResolver implements DataFetcher<CompletableFuture<ListDo

private static final Integer DEFAULT_START = 0;
private static final Integer DEFAULT_COUNT = 20;
private static final String DEFAULT_QUERY = "";

private final EntityClient _entityClient;

Expand All @@ -47,22 +49,26 @@ public CompletableFuture<ListDomainsResult> get(final DataFetchingEnvironment en
final ListDomainsInput input = bindArgument(environment.getArgument("input"), ListDomainsInput.class);
final Integer start = input.getStart() == null ? DEFAULT_START : input.getStart();
final Integer count = input.getCount() == null ? DEFAULT_COUNT : input.getCount();
final String query = input.getQuery() == null ? DEFAULT_QUERY : input.getQuery();

try {
// First, get all group Urns.
final ListResult gmsResult = _entityClient.list(
final SearchResult gmsResult = _entityClient.search(
Constants.DOMAIN_ENTITY_NAME,
query,
Collections.emptyMap(),
start,
count,
context.getAuthentication());

// Now that we have entities we can bind this to a result.
final ListDomainsResult result = new ListDomainsResult();
result.setStart(gmsResult.getStart());
result.setCount(gmsResult.getCount());
result.setTotal(gmsResult.getTotal());
result.setDomains(mapUnresolvedDomains(gmsResult.getEntities()));
result.setStart(gmsResult.getFrom());
result.setCount(gmsResult.getPageSize());
result.setTotal(gmsResult.getNumEntities());
result.setDomains(mapUnresolvedDomains(gmsResult.getEntities().stream()
.map(SearchEntity::getEntity)
.collect(Collectors.toList())));
return result;
} catch (Exception e) {
throw new RuntimeException("Failed to list domains", e);
Expand All @@ -73,7 +79,7 @@ public CompletableFuture<ListDomainsResult> get(final DataFetchingEnvironment en
}

// This method maps urns returned from the list endpoint into Partial Domain objects which will be resolved be a separate Batch resolver.
private List<Domain> mapUnresolvedDomains(final UrnArray entityUrns) {
private List<Domain> mapUnresolvedDomains(final List<Urn> entityUrns) {
final List<Domain> results = new ArrayList<>();
for (final Urn urn : entityUrns) {
final Domain unresolvedDomain = new Domain();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
import com.linkedin.datahub.graphql.types.corpgroup.mappers.CorpGroupMapper;
import com.linkedin.entity.EntityResponse;
import com.linkedin.entity.client.EntityClient;
import com.linkedin.metadata.query.ListResult;
import com.linkedin.metadata.search.SearchEntity;
import com.linkedin.metadata.search.SearchResult;
import graphql.schema.DataFetcher;
import graphql.schema.DataFetchingEnvironment;
import java.util.Collection;
Expand All @@ -29,6 +30,7 @@ public class ListGroupsResolver implements DataFetcher<CompletableFuture<ListGro

private static final Integer DEFAULT_START = 0;
private static final Integer DEFAULT_COUNT = 20;
private static final String DEFAULT_QUERY = "";

private final EntityClient _entityClient;

Expand All @@ -45,22 +47,25 @@ public CompletableFuture<ListGroupsResult> get(final DataFetchingEnvironment env
final ListGroupsInput input = bindArgument(environment.getArgument("input"), ListGroupsInput.class);
final Integer start = input.getStart() == null ? DEFAULT_START : input.getStart();
final Integer count = input.getCount() == null ? DEFAULT_COUNT : input.getCount();
final String query = input.getQuery() == null ? DEFAULT_QUERY : input.getQuery();

return CompletableFuture.supplyAsync(() -> {
try {
// First, get all group Urns.
final ListResult gmsResult =
_entityClient.list(CORP_GROUP_ENTITY_NAME, Collections.emptyMap(), start, count, context.getAuthentication());
final SearchResult gmsResult =
_entityClient.search(CORP_GROUP_ENTITY_NAME, query, Collections.emptyMap(), start, count, context.getAuthentication());

// Then, get hydrate all groups.
final Map<Urn, EntityResponse> entities = _entityClient.batchGetV2(CORP_GROUP_ENTITY_NAME,
new HashSet<>(gmsResult.getEntities()), null, context.getAuthentication());
new HashSet<>(gmsResult.getEntities().stream()
.map(SearchEntity::getEntity)
.collect(Collectors.toList())), null, context.getAuthentication());

// Now that we have entities we can bind this to a result.
final ListGroupsResult result = new ListGroupsResult();
result.setStart(gmsResult.getStart());
result.setCount(gmsResult.getCount());
result.setTotal(gmsResult.getTotal());
result.setStart(gmsResult.getFrom());
result.setCount(gmsResult.getPageSize());
result.setTotal(gmsResult.getNumEntities());
result.setGroups(mapEntities(entities.values()));
return result;
} catch (Exception e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@
import com.linkedin.entity.EnvelopedAspectMap;
import com.linkedin.entity.client.EntityClient;
import com.linkedin.metadata.Constants;
import com.linkedin.metadata.query.ListResult;
import com.linkedin.metadata.search.SearchEntity;
import com.linkedin.metadata.search.SearchResult;
import com.linkedin.secret.DataHubSecretValue;
import graphql.schema.DataFetcher;
import graphql.schema.DataFetchingEnvironment;
Expand All @@ -25,6 +26,7 @@
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;

import static com.linkedin.datahub.graphql.resolvers.ResolverUtils.*;
Expand All @@ -38,6 +40,7 @@ public class ListSecretsResolver implements DataFetcher<CompletableFuture<ListSe

private static final Integer DEFAULT_START = 0;
private static final Integer DEFAULT_COUNT = 20;
private static final String DEFAULT_QUERY = "";

private final EntityClient _entityClient;

Expand All @@ -54,24 +57,28 @@ public CompletableFuture<ListSecretsResult> get(final DataFetchingEnvironment en
final ListSecretsInput input = bindArgument(environment.getArgument("input"), ListSecretsInput.class);
final Integer start = input.getStart() == null ? DEFAULT_START : input.getStart();
final Integer count = input.getCount() == null ? DEFAULT_COUNT : input.getCount();
final String query = input.getQuery() == null ? DEFAULT_QUERY : input.getQuery();

return CompletableFuture.supplyAsync(() -> {
try {
// First, get all secrets
final ListResult gmsResult = _entityClient.list(Constants.SECRETS_ENTITY_NAME, Collections.emptyMap(), start, count, context.getAuthentication());
final SearchResult
gmsResult = _entityClient.search(Constants.SECRETS_ENTITY_NAME, query, Collections.emptyMap(), start, count, context.getAuthentication());

// Then, resolve all secrets
final Map<Urn, EntityResponse> entities = _entityClient.batchGetV2(
Constants.SECRETS_ENTITY_NAME,
new HashSet<>(gmsResult.getEntities()),
new HashSet<>(gmsResult.getEntities().stream()
.map(SearchEntity::getEntity)
.collect(Collectors.toList())),
ImmutableSet.of(Constants.SECRET_VALUE_ASPECT_NAME),
context.getAuthentication());

// Now that we have entities we can bind this to a result.
final ListSecretsResult result = new ListSecretsResult();
result.setStart(gmsResult.getStart());
result.setCount(gmsResult.getCount());
result.setTotal(gmsResult.getTotal());
result.setStart(gmsResult.getFrom());
result.setCount(gmsResult.getPageSize());
result.setTotal(gmsResult.getNumEntities());
result.setSecrets(mapEntities(entities.values()));
return result;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,15 @@
import com.linkedin.entity.EntityResponse;
import com.linkedin.entity.client.EntityClient;
import com.linkedin.metadata.Constants;
import com.linkedin.metadata.query.ListResult;
import com.linkedin.metadata.search.SearchEntity;
import com.linkedin.metadata.search.SearchResult;
import graphql.schema.DataFetcher;
import graphql.schema.DataFetchingEnvironment;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;

import static com.linkedin.datahub.graphql.resolvers.ResolverUtils.*;

Expand All @@ -28,6 +30,7 @@ public class ListIngestionSourcesResolver implements DataFetcher<CompletableFutu

private static final Integer DEFAULT_START = 0;
private static final Integer DEFAULT_COUNT = 20;
private static final String DEFAULT_QUERY = "";

private final EntityClient _entityClient;

Expand All @@ -44,12 +47,14 @@ public CompletableFuture<ListIngestionSourcesResult> get(final DataFetchingEnvir
final ListIngestionSourcesInput input = bindArgument(environment.getArgument("input"), ListIngestionSourcesInput.class);
final Integer start = input.getStart() == null ? DEFAULT_START : input.getStart();
final Integer count = input.getCount() == null ? DEFAULT_COUNT : input.getCount();
final String query = input.getQuery() == null ? DEFAULT_QUERY : input.getQuery();

return CompletableFuture.supplyAsync(() -> {
try {
// First, get all ingestion sources Urns.
final ListResult gmsResult = _entityClient.list(
final SearchResult gmsResult = _entityClient.search(
Constants.INGESTION_SOURCE_ENTITY_NAME,
query,
Collections.emptyMap(),
start,
count,
Expand All @@ -58,15 +63,17 @@ public CompletableFuture<ListIngestionSourcesResult> get(final DataFetchingEnvir
// Then, resolve all ingestion sources
final Map<Urn, EntityResponse> entities = _entityClient.batchGetV2(
Constants.INGESTION_SOURCE_ENTITY_NAME,
new HashSet<>(gmsResult.getEntities()),
new HashSet<>(gmsResult.getEntities().stream()
.map(SearchEntity::getEntity)
.collect(Collectors.toList())),
ImmutableSet.of(Constants.INGESTION_INFO_ASPECT_NAME),
context.getAuthentication());

// Now that we have entities we can bind this to a result.
final ListIngestionSourcesResult result = new ListIngestionSourcesResult();
result.setStart(gmsResult.getStart());
result.setCount(gmsResult.getCount());
result.setTotal(gmsResult.getTotal());
result.setStart(gmsResult.getFrom());
result.setCount(gmsResult.getPageSize());
result.setTotal(gmsResult.getNumEntities());
result.setIngestionSources(IngestionResolverUtils.mapIngestionSources(entities.values()));
return result;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public class ListPoliciesResolver implements DataFetcher<CompletableFuture<ListP

private static final Integer DEFAULT_START = 0;
private static final Integer DEFAULT_COUNT = 20;
private static final String DEFAULT_QUERY = "";

private final PolicyFetcher _policyFetcher;

Expand All @@ -37,12 +38,13 @@ public CompletableFuture<ListPoliciesResult> get(final DataFetchingEnvironment e
final ListPoliciesInput input = bindArgument(environment.getArgument("input"), ListPoliciesInput.class);
final Integer start = input.getStart() == null ? DEFAULT_START : input.getStart();
final Integer count = input.getCount() == null ? DEFAULT_COUNT : input.getCount();
final String query = input.getQuery() == null ? DEFAULT_QUERY : input.getQuery();

return CompletableFuture.supplyAsync(() -> {
try {
// First, get all policy Urns.
final PolicyFetcher.PolicyFetchResult policyFetchResult =
_policyFetcher.fetchPolicies(start, count, context.getAuthentication());
_policyFetcher.fetchPolicies(start, count, query, context.getAuthentication());

// Now that we have entities we can bind this to a result.
final ListPoliciesResult result = new ListPoliciesResult();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
import com.linkedin.datahub.graphql.types.corpuser.mappers.CorpUserMapper;
import com.linkedin.entity.EntityResponse;
import com.linkedin.entity.client.EntityClient;
import com.linkedin.metadata.query.ListResult;
import com.linkedin.metadata.search.SearchEntity;
import com.linkedin.metadata.search.SearchResult;
import graphql.schema.DataFetcher;
import graphql.schema.DataFetchingEnvironment;
import java.util.Collection;
Expand All @@ -29,6 +30,7 @@ public class ListUsersResolver implements DataFetcher<CompletableFuture<ListUser

private static final Integer DEFAULT_START = 0;
private static final Integer DEFAULT_COUNT = 20;
private static final String DEFAULT_QUERY = "";

private final EntityClient _entityClient;

Expand All @@ -45,22 +47,26 @@ public CompletableFuture<ListUsersResult> get(final DataFetchingEnvironment envi
final ListUsersInput input = bindArgument(environment.getArgument("input"), ListUsersInput.class);
final Integer start = input.getStart() == null ? DEFAULT_START : input.getStart();
final Integer count = input.getCount() == null ? DEFAULT_COUNT : input.getCount();
final String query = input.getQuery() == null ? DEFAULT_QUERY : input.getQuery();

return CompletableFuture.supplyAsync(() -> {
try {
// First, get all policy Urns.
final ListResult gmsResult =
_entityClient.list(CORP_USER_ENTITY_NAME, Collections.emptyMap(), start, count, context.getAuthentication());
final SearchResult gmsResult =
_entityClient.search(CORP_USER_ENTITY_NAME, query, Collections.emptyMap(), start, count, context.getAuthentication());

// Then, get hydrate all users.
final Map<Urn, EntityResponse> entities = _entityClient.batchGetV2(CORP_USER_ENTITY_NAME,
new HashSet<>(gmsResult.getEntities()), null, context.getAuthentication());
new HashSet<>(gmsResult.getEntities().stream()
.map(SearchEntity::getEntity)
.collect(Collectors.toList())
), null, context.getAuthentication());

// Now that we have entities we can bind this to a result.
final ListUsersResult result = new ListUsersResult();
result.setStart(gmsResult.getStart());
result.setCount(gmsResult.getCount());
result.setTotal(gmsResult.getTotal());
result.setStart(gmsResult.getFrom());
result.setCount(gmsResult.getPageSize());
result.setTotal(gmsResult.getNumEntities());
result.setUsers(mapEntities(entities.values()));
return result;
} catch (Exception e) {
Expand Down
20 changes: 20 additions & 0 deletions datahub-graphql-core/src/main/resources/entity.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -6336,6 +6336,11 @@ input ListPoliciesInput {
The maximum number of Policies to be returned in the result set
"""
count: Int

"""
Optional search query
"""
query: String
}

"""
Expand Down Expand Up @@ -6416,6 +6421,11 @@ input ListUsersInput {
The maximum number of Policies to be returned in the result set
"""
count: Int

"""
Optional search query
"""
query: String
}

"""
Expand Down Expand Up @@ -6456,6 +6466,11 @@ input ListGroupsInput {
The maximum number of Policies to be returned in the result set
"""
count: Int

"""
Optional search query
"""
query: String
}

type EntityCountResults {
Expand Down Expand Up @@ -7577,6 +7592,11 @@ input ListDomainsInput {
The maximum number of Domains to be returned in the result set
"""
count: Int

"""
Optional search query
"""
query: String
}

"""
Expand Down
10 changes: 10 additions & 0 deletions datahub-graphql-core/src/main/resources/ingestion.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,11 @@ input ListSecretsInput {
The number of results to be returned
"""
count: Int

"""
An optional search query
"""
query: String
}

"""
Expand Down Expand Up @@ -354,6 +359,11 @@ input ListIngestionSourcesInput {
The number of results to be returned
"""
count: Int

"""
An optional search query
"""
query: String
}

"""
Expand Down
Loading