Skip to content

Commit 2e00d1d

Browse files
Patrick Zhailucy66hw
authored andcommitted
Add TermsAggregation implementation for grpc
Signed-off-by: Patrick Zhai <pzhai@uber.com>
1 parent 7993871 commit 2e00d1d

53 files changed

Lines changed: 1662 additions & 358 deletions

File tree

Some content is hidden

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

.idea/vcs.xml

Lines changed: 15 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.mcp.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"mcpServers": {
3+
"code-mcp": {
4+
"command": "aifx",
5+
"args": [
6+
"mcp",
7+
"run",
8+
"code-mcp"
9+
]
10+
}
11+
}
12+
}

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
1313
- [Workload Management] Enhance Scroll API support for autotagging ([#20151](https://github.com/opensearch-project/OpenSearch/pull/20151))
1414
- Add indices to search request slowlog ([#20588](https://github.com/opensearch-project/OpenSearch/pull/20588))
1515
- Add gRPC support for Min and Max metric aggregations ([#20676](https://github.com/opensearch-project/OpenSearch/pull/20676))
16+
- Add gRPC support for Term aggregations ([#20970](https://github.com/opensearch-project/OpenSearch/pull/20970))
1617

1718
### Changed
1819
- Move Randomness from server to libs/common ([#20570](https://github.com/opensearch-project/OpenSearch/pull/20570))

build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,11 @@ allprojects {
8787
group = 'org.opensearch'
8888
version = VersionProperties.getOpenSearch()
8989
description = "OpenSearch subproject ${project.path}"
90+
91+
// Add local Maven repository for protobuf development
92+
repositories {
93+
mavenLocal()
94+
}
9095
}
9196

9297
configure(allprojects - project(':distribution:archives:integ-test-zip')) {

modules/transport-grpc/spi/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ base {
1515
}
1616

1717
dependencies {
18-
implementation project(":server")
19-
implementation "org.opensearch:protobufs:${versions.opensearchprotobufs}"
18+
api project(":server")
19+
api "org.opensearch:protobufs:${versions.opensearchprotobufs}"
2020
implementation "io.grpc:grpc-api:${versions.grpc}"
2121
testImplementation project(":test:framework")
2222
testImplementation "io.grpc:grpc-services:${versions.grpc}"

modules/transport-grpc/spi/src/main/java/org/opensearch/transport/grpc/spi/AggregateProtoConverter.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@
1717
* SPI interface for converting OpenSearch InternalAggregation objects to Protocol Buffer Aggregate messages.
1818
* Follows the same pattern as {@link AggregationBuilderProtoConverter} for request-side conversions.
1919
*
20-
* <p>The registry handles metadata centrally. Converters should delegate to existing
21-
* {@code *AggregateProtoUtils} classes for the actual conversion logic.
20+
* <p>Implementations should extend {@code AbstractAggregateProtoConverter} which handles metadata
21+
* centrally via the template method pattern, mirroring how {@code InternalAggregation.toXContent}
22+
* handles metadata then delegates to {@code doXContentBody}.
2223
*/
2324
public interface AggregateProtoConverter {
2425

modules/transport-grpc/src/main/java/org/opensearch/transport/grpc/GrpcPlugin.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -476,10 +476,7 @@ public Collection<Object> createComponents(
476476

477477
// Inject registry into external aggregation converters and register them
478478
if (!aggregationConverters.isEmpty()) {
479-
logger.info(
480-
"Injecting registry and registering {} external AggregationBuilderProtoConverter(s)",
481-
aggregationConverters.size()
482-
);
479+
logger.info("Injecting registry and registering {} external AggregationBuilderProtoConverter(s)", aggregationConverters.size());
483480
for (AggregationBuilderProtoConverter converter : aggregationConverters) {
484481
logger.info(
485482
"Processing external aggregation converter: {} (handles: {})",
@@ -494,7 +491,10 @@ public Collection<Object> createComponents(
494491
// Register the converter
495492
aggregationRegistry.registerConverter(converter);
496493
}
497-
logger.info("Successfully injected registry and registered all {} external aggregation converters", aggregationConverters.size());
494+
logger.info(
495+
"Successfully injected registry and registered all {} external aggregation converters",
496+
aggregationConverters.size()
497+
);
498498

499499
// Update the registry on all converters (including built-in ones) so they can access external converters
500500
aggregationRegistry.updateRegistryOnAllConverters();
@@ -505,10 +505,7 @@ public Collection<Object> createComponents(
505505

506506
// Register external aggregate converters (response-side)
507507
if (!aggregateConverters.isEmpty()) {
508-
logger.info(
509-
"Registering {} external AggregateProtoConverter(s)",
510-
aggregateConverters.size()
511-
);
508+
logger.info("Registering {} external AggregateProtoConverter(s)", aggregateConverters.size());
512509
for (AggregateProtoConverter converter : aggregateConverters) {
513510
logger.info(
514511
"Processing external aggregate converter: {} (handles: {})",

modules/transport-grpc/src/main/java/org/opensearch/transport/grpc/proto/request/search/SearchRequestProtoUtils.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,14 @@ public static org.opensearch.action.search.SearchRequest prepareRequest(
8383
*/
8484
IntConsumer setSize = size -> searchRequest.source().size(size);
8585
// TODO avoid hidden cast to NodeClient here
86-
parseSearchRequest(searchRequest, request, ((NodeClient) client).getNamedWriteableRegistry(), setSize, queryUtils, aggregationRegistry);
86+
parseSearchRequest(
87+
searchRequest,
88+
request,
89+
((NodeClient) client).getNamedWriteableRegistry(),
90+
setSize,
91+
queryUtils,
92+
aggregationRegistry
93+
);
8794
return searchRequest;
8895
}
8996

modules/transport-grpc/src/main/java/org/opensearch/transport/grpc/proto/request/search/SearchSourceBuilderProtoUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,8 @@ private static void parseNonQueryFields(
200200
DerivedField derivedFieldProto = entry.getValue();
201201

202202
// Convert protobuf DerivedField to OpenSearch DerivedField using the REST side pattern
203-
// This uses simple constructor + conditional setters (matches {@link org.opensearch.index.mapper.DerivedFieldMapper.Builder#build()})
203+
// This uses simple constructor + conditional setters (matches {@link
204+
// org.opensearch.index.mapper.DerivedFieldMapper.Builder#build()})
204205
org.opensearch.index.mapper.DerivedField derivedField = DerivedFieldProtoUtils.fromProto(name, derivedFieldProto);
205206

206207
// Add to SearchSourceBuilder - check if any optional fields are set to choose the right method

modules/transport-grpc/src/main/java/org/opensearch/transport/grpc/proto/request/search/aggregation/AggregationBuilderProtoConverterRegistryImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.opensearch.common.inject.Singleton;
1414
import org.opensearch.protobufs.AggregationContainer;
1515
import org.opensearch.search.aggregations.AggregationBuilder;
16+
import org.opensearch.transport.grpc.proto.request.search.aggregation.bucket.terms.TermsAggregationBuilderConverter;
1617
import org.opensearch.transport.grpc.proto.request.search.aggregation.metrics.MaxAggregationBuilderProtoConverter;
1718
import org.opensearch.transport.grpc.proto.request.search.aggregation.metrics.MinAggregationBuilderProtoConverter;
1819
import org.opensearch.transport.grpc.spi.AggregationBuilderProtoConverter;
@@ -44,6 +45,7 @@ protected void registerBuiltInConverters() {
4445
// Register metric aggregation converters
4546
delegate.registerConverter(new MinAggregationBuilderProtoConverter());
4647
delegate.registerConverter(new MaxAggregationBuilderProtoConverter());
48+
delegate.registerConverter(new TermsAggregationBuilderConverter());
4749

4850
// Future: Register bucket aggregation converters here
4951
// Example: delegate.registerConverter(new TermsAggregationBuilderProtoConverter());

0 commit comments

Comments
 (0)