Skip to content

Commit fc03a1c

Browse files
fix(search): respect the search flags term bucket size (#10130)
1 parent 5195d3a commit fc03a1c

File tree

3 files changed

+39
-15
lines changed

3 files changed

+39
-15
lines changed

metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/request/AggregationQueryBuilder.java

+14-7
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.linkedin.metadata.search.utils.ESUtils;
2121
import com.linkedin.metadata.utils.SearchUtil;
2222
import com.linkedin.util.Pair;
23+
import io.datahubproject.metadata.context.OperationContext;
2324
import io.opentelemetry.extension.annotations.WithSpan;
2425
import java.util.ArrayList;
2526
import java.util.Arrays;
@@ -73,15 +74,16 @@ public AggregationQueryBuilder(
7374
}
7475

7576
/** Get the set of default aggregations, across all facets. */
76-
public List<AggregationBuilder> getAggregations() {
77-
return getAggregations(null);
77+
public List<AggregationBuilder> getAggregations(@Nonnull OperationContext opContext) {
78+
return getAggregations(opContext, null);
7879
}
7980

8081
/**
8182
* Get aggregations for a search request for the given facets provided, and if none are provided,
8283
* then get aggregations for all.
8384
*/
84-
public List<AggregationBuilder> getAggregations(@Nullable List<String> facets) {
85+
public List<AggregationBuilder> getAggregations(
86+
@Nonnull OperationContext opContext, @Nullable List<String> facets) {
8587
final Set<String> facetsToAggregate;
8688
if (facets != null) {
8789
facetsToAggregate =
@@ -90,7 +92,7 @@ public List<AggregationBuilder> getAggregations(@Nullable List<String> facets) {
9092
facetsToAggregate = defaultFacetFields;
9193
}
9294
return facetsToAggregate.stream()
93-
.map(this::facetToAggregationBuilder)
95+
.map(f -> facetToAggregationBuilder(opContext, f))
9496
.collect(Collectors.toList());
9597
}
9698

@@ -129,9 +131,14 @@ private boolean isValidAggregate(final String inputFacet) {
129131
return isValid;
130132
}
131133

132-
private AggregationBuilder facetToAggregationBuilder(final String inputFacet) {
134+
private AggregationBuilder facetToAggregationBuilder(
135+
@Nonnull OperationContext opContext, final String inputFacet) {
133136
List<String> facets = List.of(inputFacet.split(AGGREGATION_SEPARATOR_CHAR));
134137
AggregationBuilder lastAggBuilder = null;
138+
int maxTermBuckets =
139+
Math.min(
140+
opContext.getSearchContext().getSearchFlags().getMaxAggValues(),
141+
configs.getMaxTermBucketSize());
135142
for (int i = facets.size() - 1; i >= 0; i--) {
136143
String facet = facets.get(i);
137144
if (facet.startsWith(STRUCTURED_PROPERTY_MAPPING_FIELD_PREFIX)) {
@@ -163,11 +170,11 @@ private AggregationBuilder facetToAggregationBuilder(final String inputFacet) {
163170
facet.equalsIgnoreCase(INDEX_VIRTUAL_FIELD)
164171
? AggregationBuilders.terms(inputFacet)
165172
.field(getAggregationField(ES_INDEX_FIELD))
166-
.size(configs.getMaxTermBucketSize())
173+
.size(maxTermBuckets)
167174
.minDocCount(0)
168175
: AggregationBuilders.terms(inputFacet)
169176
.field(getAggregationField(facet))
170-
.size(configs.getMaxTermBucketSize());
177+
.size(maxTermBuckets);
171178
}
172179
if (lastAggBuilder != null) {
173180
aggBuilder = aggBuilder.subAggregation(lastAggBuilder);

metadata-io/src/main/java/com/linkedin/metadata/search/elasticsearch/query/request/SearchRequestHandler.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,9 @@ public SearchRequest getSearchRequest(
219219
.must(getQuery(input, Boolean.TRUE.equals(searchFlags.isFulltext())))
220220
.filter(filterQuery));
221221
if (Boolean.FALSE.equals(searchFlags.isSkipAggregates())) {
222-
aggregationQueryBuilder.getAggregations(facets).forEach(searchSourceBuilder::aggregation);
222+
aggregationQueryBuilder
223+
.getAggregations(opContext, facets)
224+
.forEach(searchSourceBuilder::aggregation);
223225
}
224226
if (Boolean.FALSE.equals(searchFlags.isSkipHighlighting())) {
225227
searchSourceBuilder.highlighter(highlights);
@@ -276,7 +278,9 @@ public SearchRequest getSearchRequest(
276278
.must(getQuery(input, Boolean.TRUE.equals(searchFlags.isFulltext())))
277279
.filter(filterQuery));
278280
if (Boolean.FALSE.equals(searchFlags.isSkipAggregates())) {
279-
aggregationQueryBuilder.getAggregations(facets).forEach(searchSourceBuilder::aggregation);
281+
aggregationQueryBuilder
282+
.getAggregations(opContext, facets)
283+
.forEach(searchSourceBuilder::aggregation);
280284
}
281285
if (Boolean.FALSE.equals(searchFlags.isSkipHighlighting())) {
282286
searchSourceBuilder.highlighter(highlights);

metadata-io/src/test/java/com/linkedin/metadata/search/query/request/AggregationQueryBuilderTest.java

+19-6
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import com.linkedin.metadata.models.registry.EntityRegistry;
1616
import com.linkedin.metadata.search.elasticsearch.query.request.AggregationQueryBuilder;
1717
import com.linkedin.r2.RemoteInvocationException;
18+
import io.datahubproject.test.metadata.context.TestOperationContexts;
1819
import java.net.URISyntaxException;
1920
import java.util.Collections;
2021
import java.util.List;
@@ -67,7 +68,8 @@ public void testGetDefaultAggregationsHasFields() {
6768
ImmutableMap.of(mock(EntitySpec.class), ImmutableList.of(annotation)),
6869
aspectRetriever);
6970

70-
List<AggregationBuilder> aggs = builder.getAggregations();
71+
List<AggregationBuilder> aggs =
72+
builder.getAggregations(TestOperationContexts.systemContextNoSearchAuthorization());
7173

7274
Assert.assertTrue(aggs.stream().anyMatch(agg -> agg.getName().equals("hasTest")));
7375
}
@@ -101,7 +103,8 @@ public void testGetDefaultAggregationsFields() {
101103
ImmutableMap.of(mock(EntitySpec.class), ImmutableList.of(annotation)),
102104
aspectRetriever);
103105

104-
List<AggregationBuilder> aggs = builder.getAggregations();
106+
List<AggregationBuilder> aggs =
107+
builder.getAggregations(TestOperationContexts.systemContextNoSearchAuthorization());
105108

106109
Assert.assertTrue(aggs.stream().anyMatch(agg -> agg.getName().equals("test")));
107110
}
@@ -153,13 +156,18 @@ public void testGetSpecificAggregationsHasFields() {
153156

154157
// Case 1: Ask for fields that should exist.
155158
List<AggregationBuilder> aggs =
156-
builder.getAggregations(ImmutableList.of("test1", "test2", "hasTest1"));
159+
builder.getAggregations(
160+
TestOperationContexts.systemContextNoSearchAuthorization(),
161+
ImmutableList.of("test1", "test2", "hasTest1"));
157162
Assert.assertEquals(aggs.size(), 3);
158163
Set<String> facets = aggs.stream().map(AggregationBuilder::getName).collect(Collectors.toSet());
159164
Assert.assertEquals(ImmutableSet.of("test1", "test2", "hasTest1"), facets);
160165

161166
// Case 2: Ask for fields that should NOT exist.
162-
aggs = builder.getAggregations(ImmutableList.of("hasTest2"));
167+
aggs =
168+
builder.getAggregations(
169+
TestOperationContexts.systemContextNoSearchAuthorization(),
170+
ImmutableList.of("hasTest2"));
163171
Assert.assertEquals(aggs.size(), 0);
164172
}
165173

@@ -173,7 +181,9 @@ public void testAggregateOverStructuredProperty() {
173181
config, ImmutableMap.of(mock(EntitySpec.class), ImmutableList.of()), aspectRetriever);
174182

175183
List<AggregationBuilder> aggs =
176-
builder.getAggregations(List.of("structuredProperties.ab.fgh.ten"));
184+
builder.getAggregations(
185+
TestOperationContexts.systemContextNoSearchAuthorization(),
186+
List.of("structuredProperties.ab.fgh.ten"));
177187
Assert.assertEquals(aggs.size(), 1);
178188
AggregationBuilder aggBuilder = aggs.get(0);
179189
Assert.assertTrue(aggBuilder instanceof TermsAggregationBuilder);
@@ -184,6 +194,7 @@ public void testAggregateOverStructuredProperty() {
184194
// Two structured properties
185195
aggs =
186196
builder.getAggregations(
197+
TestOperationContexts.systemContextNoSearchAuthorization(),
187198
List.of("structuredProperties.ab.fgh.ten", "structuredProperties.hello"));
188199
Assert.assertEquals(aggs.size(), 2);
189200
Assert.assertEquals(
@@ -241,6 +252,7 @@ public void testAggregateOverFieldsAndStructProp() {
241252
// Aggregate over fields and structured properties
242253
List<AggregationBuilder> aggs =
243254
builder.getAggregations(
255+
TestOperationContexts.systemContextNoSearchAuthorization(),
244256
ImmutableList.of(
245257
"test1",
246258
"test2",
@@ -291,7 +303,8 @@ public void testMissingAggregation() {
291303
ImmutableMap.of(mock(EntitySpec.class), ImmutableList.of(annotation)),
292304
aspectRetriever);
293305

294-
List<AggregationBuilder> aggs = builder.getAggregations();
306+
List<AggregationBuilder> aggs =
307+
builder.getAggregations(TestOperationContexts.systemContextNoSearchAuthorization());
295308

296309
Assert.assertTrue(aggs.stream().anyMatch(agg -> agg.getName().equals("hasTest")));
297310
Assert.assertTrue(

0 commit comments

Comments
 (0)