Skip to content

Commit 6a165a8

Browse files
refactor(search): refactor field type detection (#11395)
1 parent c2977d8 commit 6a165a8

File tree

47 files changed

+277
-223
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+277
-223
lines changed

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

+9-41
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,19 @@
66
import com.datahub.authentication.Authentication;
77
import com.fasterxml.jackson.core.StreamReadConstraints;
88
import com.fasterxml.jackson.databind.ObjectMapper;
9-
import com.google.common.collect.ImmutableSet;
109
import com.linkedin.common.urn.UrnUtils;
1110
import com.linkedin.data.template.StringArray;
1211
import com.linkedin.datahub.graphql.QueryContext;
1312
import com.linkedin.datahub.graphql.exception.ValidationException;
1413
import com.linkedin.datahub.graphql.generated.AndFilterInput;
1514
import com.linkedin.datahub.graphql.generated.FacetFilterInput;
1615
import com.linkedin.datahub.graphql.resolvers.search.SearchUtils;
17-
import com.linkedin.metadata.aspect.AspectRetriever;
1816
import com.linkedin.metadata.query.filter.Condition;
1917
import com.linkedin.metadata.query.filter.ConjunctiveCriterion;
2018
import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray;
2119
import com.linkedin.metadata.query.filter.Criterion;
2220
import com.linkedin.metadata.query.filter.CriterionArray;
2321
import com.linkedin.metadata.query.filter.Filter;
24-
import com.linkedin.metadata.search.utils.ESUtils;
2522
import com.linkedin.metadata.service.ViewService;
2623
import com.linkedin.view.DataHubViewInfo;
2724
import graphql.schema.DataFetchingEnvironment;
@@ -39,8 +36,6 @@
3936

4037
public class ResolverUtils {
4138

42-
private static final Set<String> KEYWORD_EXCLUDED_FILTERS =
43-
ImmutableSet.of("runId", "_entityType");
4439
private static final ObjectMapper MAPPER = new ObjectMapper();
4540

4641
static {
@@ -111,11 +106,10 @@ public static Map<String, String> buildFacetFilters(
111106
return facetFilters;
112107
}
113108

114-
public static List<Criterion> criterionListFromAndFilter(
115-
List<FacetFilterInput> andFilters, @Nullable AspectRetriever aspectRetriever) {
109+
public static List<Criterion> criterionListFromAndFilter(List<FacetFilterInput> andFilters) {
116110
return andFilters != null && !andFilters.isEmpty()
117111
? andFilters.stream()
118-
.map(filter -> criterionFromFilter(filter, aspectRetriever))
112+
.map(filter -> criterionFromFilter(filter))
119113
.collect(Collectors.toList())
120114
: Collections.emptyList();
121115
}
@@ -124,24 +118,21 @@ public static List<Criterion> criterionListFromAndFilter(
124118
// conjunctive criterion
125119
// arrays, rather than just one for the AND case.
126120
public static ConjunctiveCriterionArray buildConjunctiveCriterionArrayWithOr(
127-
@Nonnull List<AndFilterInput> orFilters, @Nullable AspectRetriever aspectRetriever) {
121+
@Nonnull List<AndFilterInput> orFilters) {
128122
return new ConjunctiveCriterionArray(
129123
orFilters.stream()
130124
.map(
131125
orFilter -> {
132126
CriterionArray andCriterionForOr =
133-
new CriterionArray(
134-
criterionListFromAndFilter(orFilter.getAnd(), aspectRetriever));
127+
new CriterionArray(criterionListFromAndFilter(orFilter.getAnd()));
135128
return new ConjunctiveCriterion().setAnd(andCriterionForOr);
136129
})
137130
.collect(Collectors.toList()));
138131
}
139132

140133
@Nullable
141134
public static Filter buildFilter(
142-
@Nullable List<FacetFilterInput> andFilters,
143-
@Nullable List<AndFilterInput> orFilters,
144-
@Nullable AspectRetriever aspectRetriever) {
135+
@Nullable List<FacetFilterInput> andFilters, @Nullable List<AndFilterInput> orFilters) {
145136
if ((andFilters == null || andFilters.isEmpty())
146137
&& (orFilters == null || orFilters.isEmpty())) {
147138
return null;
@@ -150,34 +141,21 @@ public static Filter buildFilter(
150141
// Or filters are the new default. We will check them first.
151142
// If we have OR filters, we need to build a series of CriterionArrays
152143
if (orFilters != null && !orFilters.isEmpty()) {
153-
return new Filter().setOr(buildConjunctiveCriterionArrayWithOr(orFilters, aspectRetriever));
144+
return new Filter().setOr(buildConjunctiveCriterionArrayWithOr(orFilters));
154145
}
155146

156147
// If or filters are not set, someone may be using the legacy and filters
157-
final List<Criterion> andCriterions = criterionListFromAndFilter(andFilters, aspectRetriever);
148+
final List<Criterion> andCriterions = criterionListFromAndFilter(andFilters);
158149
return new Filter()
159150
.setOr(
160151
new ConjunctiveCriterionArray(
161152
new ConjunctiveCriterion().setAnd(new CriterionArray(andCriterions))));
162153
}
163154

164-
public static Criterion criterionFromFilter(
165-
final FacetFilterInput filter, @Nullable AspectRetriever aspectRetriever) {
166-
return criterionFromFilter(filter, false, aspectRetriever);
167-
}
168-
169155
// Translates a FacetFilterInput (graphql input class) into Criterion (our internal model)
170-
public static Criterion criterionFromFilter(
171-
final FacetFilterInput filter,
172-
final Boolean skipKeywordSuffix,
173-
@Nullable AspectRetriever aspectRetriever) {
156+
public static Criterion criterionFromFilter(final FacetFilterInput filter) {
174157
Criterion result = new Criterion();
175-
176-
if (skipKeywordSuffix) {
177-
result.setField(filter.getField());
178-
} else {
179-
result.setField(getFilterField(filter.getField(), skipKeywordSuffix, aspectRetriever));
180-
}
158+
result.setField(filter.getField());
181159

182160
// `value` is deprecated in place of `values`- this is to support old query patterns. If values
183161
// is provided,
@@ -210,16 +188,6 @@ public static Criterion criterionFromFilter(
210188
return result;
211189
}
212190

213-
private static String getFilterField(
214-
final String originalField,
215-
final boolean skipKeywordSuffix,
216-
@Nullable AspectRetriever aspectRetriever) {
217-
if (KEYWORD_EXCLUDED_FILTERS.contains(originalField)) {
218-
return originalField;
219-
}
220-
return ESUtils.toKeywordField(originalField, skipKeywordSuffix, aspectRetriever);
221-
}
222-
223191
public static Filter viewFilter(
224192
OperationContext opContext, ViewService viewService, String viewUrn) {
225193
if (viewUrn == null) {

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/assertion/AssertionRunEventResolver.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.linkedin.datahub.graphql.generated.AssertionRunStatus;
1313
import com.linkedin.datahub.graphql.generated.FacetFilterInput;
1414
import com.linkedin.datahub.graphql.generated.FilterInput;
15+
import com.linkedin.datahub.graphql.resolvers.ResolverUtils;
1516
import com.linkedin.datahub.graphql.types.dataset.mappers.AssertionRunEventMapper;
1617
import com.linkedin.entity.client.EntityClient;
1718
import com.linkedin.metadata.Constants;
@@ -147,7 +148,7 @@ public static Filter buildFilter(
147148
.setAnd(
148149
new CriterionArray(
149150
facetFilters.stream()
150-
.map(filter -> criterionFromFilter(filter, true, aspectRetriever))
151+
.map(ResolverUtils::criterionFromFilter)
151152
.collect(Collectors.toList())))));
152153
}
153154
}

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/auth/ListAccessTokensResolver.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,7 @@ public CompletableFuture<ListAccessTokenResult> get(DataFetchingEnvironment envi
7171
.withSearchFlags(flags -> flags.setFulltext(true)),
7272
Constants.ACCESS_TOKEN_ENTITY_NAME,
7373
"",
74-
buildFilter(
75-
filters,
76-
Collections.emptyList(),
77-
context.getOperationContext().getAspectRetriever()),
74+
buildFilter(filters, Collections.emptyList()),
7875
sortCriteria,
7976
start,
8077
count);

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/chart/BrowseV2Resolver.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,7 @@ public CompletableFuture<BrowseResultsV2> get(DataFetchingEnvironment environmen
7474
? BROWSE_PATH_V2_DELIMITER
7575
+ String.join(BROWSE_PATH_V2_DELIMITER, input.getPath())
7676
: "";
77-
final Filter inputFilter =
78-
ResolverUtils.buildFilter(
79-
null, input.getOrFilters(), context.getOperationContext().getAspectRetriever());
77+
final Filter inputFilter = ResolverUtils.buildFilter(null, input.getOrFilters());
8078

8179
BrowseResultV2 browseResults =
8280
_entityClient.browseV2(

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/dataproduct/ListDataProductAssetsResolver.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -151,11 +151,7 @@ public CompletableFuture<SearchResults> get(DataFetchingEnvironment environment)
151151
filters.removeIf(f -> f.getField().equals(OUTPUT_PORTS_FILTER_FIELD));
152152
}
153153
// add urns from the aspect to our filters
154-
final Filter baseFilter =
155-
ResolverUtils.buildFilter(
156-
filters,
157-
input.getOrFilters(),
158-
context.getOperationContext().getAspectRetriever());
154+
final Filter baseFilter = ResolverUtils.buildFilter(filters, input.getOrFilters());
159155
final Filter finalFilter =
160156
buildFilterWithUrns(
161157
context.getDataHubAppConfig(), new HashSet<>(urnsToFilterOn), baseFilter);

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/domain/DomainEntitiesResolver.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,7 @@ public CompletableFuture<SearchResults> get(final DataFetchingEnvironment enviro
7979
.getFilters()
8080
.forEach(
8181
filter -> {
82-
criteria.add(
83-
criterionFromFilter(
84-
filter, true, context.getOperationContext().getAspectRetriever()));
82+
criteria.add(criterionFromFilter(filter));
8583
});
8684
}
8785

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/form/CreateDynamicFormAssignmentResolver.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,7 @@ public CompletableFuture<Boolean> get(final DataFetchingEnvironment environment)
3333
final CreateDynamicFormAssignmentInput input =
3434
bindArgument(environment.getArgument("input"), CreateDynamicFormAssignmentInput.class);
3535
final Urn formUrn = UrnUtils.getUrn(input.getFormUrn());
36-
final DynamicFormAssignment formAssignment =
37-
FormUtils.mapDynamicFormAssignment(
38-
input, context.getOperationContext().getAspectRetriever());
36+
final DynamicFormAssignment formAssignment = FormUtils.mapDynamicFormAssignment(input);
3937

4038
return GraphQLConcurrencyUtils.supplyAsync(
4139
() -> {

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/ingest/source/ListIngestionSourcesResolver.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,7 @@ public CompletableFuture<ListIngestionSourcesResult> get(
6868
.withSearchFlags(flags -> flags.setFulltext(true)),
6969
Constants.INGESTION_SOURCE_ENTITY_NAME,
7070
query,
71-
buildFilter(
72-
filters,
73-
Collections.emptyList(),
74-
context.getOperationContext().getAspectRetriever()),
71+
buildFilter(filters, Collections.emptyList()),
7572
null,
7673
start,
7774
count);

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/load/TimeSeriesAspectResolver.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
import com.linkedin.datahub.graphql.generated.Entity;
1010
import com.linkedin.datahub.graphql.generated.FilterInput;
1111
import com.linkedin.datahub.graphql.generated.TimeSeriesAspect;
12+
import com.linkedin.datahub.graphql.resolvers.ResolverUtils;
1213
import com.linkedin.entity.client.EntityClient;
1314
import com.linkedin.metadata.Constants;
14-
import com.linkedin.metadata.aspect.AspectRetriever;
1515
import com.linkedin.metadata.aspect.EnvelopedAspect;
1616
import com.linkedin.metadata.authorization.PoliciesConfig;
1717
import com.linkedin.metadata.query.filter.ConjunctiveCriterion;
@@ -120,7 +120,7 @@ public CompletableFuture<List<TimeSeriesAspect>> get(DataFetchingEnvironment env
120120
maybeStartTimeMillis,
121121
maybeEndTimeMillis,
122122
maybeLimit,
123-
buildFilters(maybeFilters, context.getOperationContext().getAspectRetriever()),
123+
buildFilters(maybeFilters),
124124
maybeSort);
125125

126126
// Step 2: Bind profiles into GraphQL strong types.
@@ -135,8 +135,7 @@ public CompletableFuture<List<TimeSeriesAspect>> get(DataFetchingEnvironment env
135135
"get");
136136
}
137137

138-
private Filter buildFilters(
139-
@Nullable FilterInput maybeFilters, @Nullable AspectRetriever aspectRetriever) {
138+
private Filter buildFilters(@Nullable FilterInput maybeFilters) {
140139
if (maybeFilters == null) {
141140
return null;
142141
}
@@ -147,7 +146,7 @@ private Filter buildFilters(
147146
.setAnd(
148147
new CriterionArray(
149148
maybeFilters.getAnd().stream()
150-
.map(filter -> criterionFromFilter(filter, true, aspectRetriever))
149+
.map(ResolverUtils::criterionFromFilter)
151150
.collect(Collectors.toList())))));
152151
}
153152
}

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/mutate/util/FormUtils.java

+2-7
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import com.linkedin.form.FormPromptType;
1919
import com.linkedin.form.FormType;
2020
import com.linkedin.form.StructuredPropertyParams;
21-
import com.linkedin.metadata.aspect.AspectRetriever;
2221
import com.linkedin.metadata.query.filter.Condition;
2322
import com.linkedin.metadata.query.filter.ConjunctiveCriterion;
2423
import com.linkedin.metadata.query.filter.ConjunctiveCriterionArray;
@@ -31,7 +30,6 @@
3130
import java.util.UUID;
3231
import java.util.stream.Collectors;
3332
import javax.annotation.Nonnull;
34-
import javax.annotation.Nullable;
3533

3634
public class FormUtils {
3735

@@ -61,16 +59,13 @@ public static PrimitivePropertyValueArray getStructuredPropertyValuesFromInput(
6159
/** Map a GraphQL CreateDynamicFormAssignmentInput to the GMS DynamicFormAssignment aspect */
6260
@Nonnull
6361
public static DynamicFormAssignment mapDynamicFormAssignment(
64-
@Nonnull final CreateDynamicFormAssignmentInput input,
65-
@Nullable AspectRetriever aspectRetriever) {
62+
@Nonnull final CreateDynamicFormAssignmentInput input) {
6663
Objects.requireNonNull(input, "input must not be null");
6764

6865
final DynamicFormAssignment result = new DynamicFormAssignment();
6966
final Filter filter =
7067
new Filter()
71-
.setOr(
72-
ResolverUtils.buildConjunctiveCriterionArrayWithOr(
73-
input.getOrFilters(), aspectRetriever));
68+
.setOr(ResolverUtils.buildConjunctiveCriterionArrayWithOr(input.getOrFilters()));
7469
result.setFilter(filter);
7570
return result;
7671
}

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/ownership/ListOwnershipTypesResolver.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,7 @@ public CompletableFuture<ListOwnershipTypesResult> get(DataFetchingEnvironment e
6363
context.getOperationContext().withSearchFlags(flags -> flags.setFulltext(true)),
6464
Constants.OWNERSHIP_TYPE_ENTITY_NAME,
6565
query,
66-
buildFilter(
67-
filters,
68-
Collections.emptyList(),
69-
context.getOperationContext().getAspectRetriever()),
66+
buildFilter(filters, Collections.emptyList()),
7067
Collections.singletonList(DEFAULT_SORT_CRITERION),
7168
start,
7269
count);

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/policy/ListPoliciesResolver.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,7 @@ public CompletableFuture<ListPoliciesResult> get(final DataFetchingEnvironment e
5959
log.debug(
6060
"User {} listing policies with filters {}", context.getActorUrn(), filters.toString());
6161

62-
final Filter filter =
63-
ResolverUtils.buildFilter(
64-
facetFilters,
65-
Collections.emptyList(),
66-
context.getOperationContext().getAspectRetriever());
62+
final Filter filter = ResolverUtils.buildFilter(facetFilters, Collections.emptyList());
6763

6864
return _policyFetcher
6965
.fetchPolicies(context.getOperationContext(), start, query, count, filter)

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/query/ListQueriesResolver.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import com.linkedin.datahub.graphql.generated.ListQueriesResult;
1616
import com.linkedin.datahub.graphql.generated.QueryEntity;
1717
import com.linkedin.entity.client.EntityClient;
18-
import com.linkedin.metadata.aspect.AspectRetriever;
1918
import com.linkedin.metadata.query.filter.Filter;
2019
import com.linkedin.metadata.query.filter.SortCriterion;
2120
import com.linkedin.metadata.query.filter.SortOrder;
@@ -74,7 +73,7 @@ public CompletableFuture<ListQueriesResult> get(final DataFetchingEnvironment en
7473
flags -> flags.setFulltext(true).setSkipHighlighting(true)),
7574
QUERY_ENTITY_NAME,
7675
query,
77-
buildFilters(input, context.getOperationContext().getAspectRetriever()),
76+
buildFilters(input),
7877
sortCriteria,
7978
start,
8079
count);
@@ -111,8 +110,7 @@ private List<QueryEntity> mapUnresolvedQueries(final List<Urn> queryUrns) {
111110
}
112111

113112
@Nullable
114-
private Filter buildFilters(
115-
@Nonnull final ListQueriesInput input, @Nullable AspectRetriever aspectRetriever) {
113+
private Filter buildFilters(@Nonnull final ListQueriesInput input) {
116114
final AndFilterInput criteria = new AndFilterInput();
117115
List<FacetFilterInput> andConditions = new ArrayList<>();
118116

@@ -139,6 +137,6 @@ private Filter buildFilters(
139137
}
140138

141139
criteria.setAnd(andConditions);
142-
return buildFilter(Collections.emptyList(), ImmutableList.of(criteria), aspectRetriever);
140+
return buildFilter(Collections.emptyList(), ImmutableList.of(criteria));
143141
}
144142
}

datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/resolvers/recommendation/ListRecommendationsResolver.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import com.linkedin.datahub.graphql.generated.RecommendationRenderType;
1818
import com.linkedin.datahub.graphql.generated.RecommendationRequestContext;
1919
import com.linkedin.datahub.graphql.generated.SearchParams;
20+
import com.linkedin.datahub.graphql.resolvers.ResolverUtils;
2021
import com.linkedin.datahub.graphql.types.common.mappers.UrnToEntityMapper;
2122
import com.linkedin.datahub.graphql.types.entitytype.EntityTypeMapper;
2223
import com.linkedin.metadata.query.filter.CriterionArray;
@@ -105,9 +106,7 @@ private com.linkedin.metadata.recommendation.RecommendationRequestContext mapReq
105106
searchRequestContext.setFilters(
106107
new CriterionArray(
107108
requestContext.getSearchRequestContext().getFilters().stream()
108-
.map(
109-
facetField ->
110-
criterionFromFilter(facetField, opContext.getAspectRetriever()))
109+
.map(ResolverUtils::criterionFromFilter)
111110
.collect(Collectors.toList())));
112111
}
113112
mappedRequestContext.setSearchRequestContext(searchRequestContext);

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

+1-3
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,7 @@ public CompletableFuture<AggregateResults> get(DataFetchingEnvironment environme
6464
UrnUtils.getUrn(input.getViewUrn()))
6565
: null;
6666

67-
final Filter inputFilter =
68-
ResolverUtils.buildFilter(
69-
null, input.getOrFilters(), context.getOperationContext().getAspectRetriever());
67+
final Filter inputFilter = ResolverUtils.buildFilter(null, input.getOrFilters());
7068

7169
final SearchFlags searchFlags = mapInputFlags(context, input.getSearchFlags());
7270

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

+1-5
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,7 @@ public CompletableFuture<AutoCompleteResults> get(DataFetchingEnvironment enviro
5151
throw new ValidationException("'query' parameter can not be null or empty");
5252
}
5353

54-
final Filter filter =
55-
ResolverUtils.buildFilter(
56-
input.getFilters(),
57-
input.getOrFilters(),
58-
context.getOperationContext().getRetrieverContext().orElseThrow().getAspectRetriever());
54+
final Filter filter = ResolverUtils.buildFilter(input.getFilters(), input.getOrFilters());
5955
final int limit = input.getLimit() != null ? input.getLimit() : DEFAULT_LIMIT;
6056
return GraphQLConcurrencyUtils.supplyAsync(
6157
() -> {

0 commit comments

Comments
 (0)