Skip to content

Commit 373f22e

Browse files
committed
Make QueryBuilderProtoConverter and QueryBuilderProtoConverterRegistry an SPI
Signed-off-by: Karen Xu <[email protected]>
1 parent 8f310f5 commit 373f22e

File tree

14 files changed

+1637
-133
lines changed

14 files changed

+1637
-133
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
77
### Added
88
- Expand fetch phase profiling to support inner hits and top hits aggregation phases ([##18936](https://github.com/opensearch-project/OpenSearch/pull/18936))
99
- Add temporal routing processors for time-based document routing ([#18920](https://github.com/opensearch-project/OpenSearch/issues/18920))
10+
- Publish transport-grpc-spi exposing QueryBuilderProtoConverter and QueryBuilderProtoConverterRegistry ([#18949](https://github.com/opensearch-project/OpenSearch/pull/18949))
1011

1112

1213
### Changed

modules/transport-grpc/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ testClusters {
2121
}
2222

2323
dependencies {
24+
api project('spi')
2425
compileOnly "com.google.code.findbugs:jsr305:3.0.2"
2526
runtimeOnly "com.google.guava:guava:${versions.guava}"
2627
implementation "com.google.errorprone:error_prone_annotations:2.24.1"
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
# transport-grpc-spi
2+
3+
Service Provider Interface (SPI) for the OpenSearch gRPC transport module. This module provides interfaces and utilities that allow external plugins to extend the gRPC transport functionality.
4+
5+
## Overview
6+
7+
The `transport-grpc-spi` module enables plugin developers to:
8+
- Implement custom query converters for gRPC transport
9+
- Extend gRPC protocol buffer handling
10+
- Register custom query types that can be processed via gRPC
11+
12+
## Key Components
13+
14+
### QueryBuilderProtoConverter
15+
16+
Interface for converting protobuf query messages to OpenSearch QueryBuilder objects.
17+
18+
```java
19+
public interface QueryBuilderProtoConverter {
20+
QueryContainer.QueryContainerCase getHandledQueryCase();
21+
QueryBuilder fromProto(QueryContainer queryContainer);
22+
}
23+
```
24+
25+
### QueryBuilderProtoConverterSpiRegistry
26+
27+
Registry that manages and discovers all available query converters. External plugins can register their custom converters through this registry.
28+
29+
## Usage for Plugin Developers
30+
31+
### 1. Add Dependency
32+
33+
Add the SPI dependency to your plugin's `build.gradle`:
34+
35+
```gradle
36+
dependencies {
37+
compileOnly 'org.opensearch.plugin:transport-grpc-spi:${opensearch.version}'
38+
compileOnly 'org.opensearch:protobufs:${protobufs.version}'
39+
}
40+
```
41+
42+
### 2. Implement Custom Query Converter
43+
44+
```java
45+
public class MyCustomQueryConverter implements QueryBuilderProtoConverter {
46+
47+
@Override
48+
public QueryContainer.QueryContainerCase getHandledQueryCase() {
49+
return QueryContainer.QueryContainerCase.MY_CUSTOM_QUERY;
50+
}
51+
52+
@Override
53+
public QueryBuilder fromProto(QueryContainer queryContainer) {
54+
// Convert your custom protobuf query to QueryBuilder
55+
MyCustomQuery customQuery = queryContainer.getMyCustomQuery();
56+
return new MyCustomQueryBuilder(customQuery.getField(), customQuery.getValue());
57+
}
58+
}
59+
```
60+
61+
### 3. Register Your Converter
62+
63+
In your plugin's main class, register the converter:
64+
65+
```java
66+
public class MyPlugin extends Plugin implements ExtensiblePlugin {
67+
68+
@Override
69+
public Collection<Object> createComponents(Client client, ClusterService clusterService,
70+
ThreadPool threadPool, ResourceWatcherService resourceWatcherService,
71+
ScriptService scriptService, NamedXContentRegistry xContentRegistry,
72+
Environment environment, NodeEnvironment nodeEnvironment,
73+
NamedWriteableRegistry namedWriteableRegistry,
74+
IndexNameExpressionResolver indexNameExpressionResolver,
75+
Supplier<RepositoriesService> repositoriesServiceSupplier) {
76+
77+
// Get the registry and register your converter
78+
QueryBuilderProtoConverterSpiRegistry registry =
79+
// Obtain registry from OpenSearch's dependency injection
80+
registry.registerConverter(new MyCustomQueryConverter());
81+
82+
return Collections.emptyList();
83+
}
84+
}
85+
```
86+
87+
## Testing
88+
89+
### Unit Tests
90+
91+
```bash
92+
./gradlew :modules:transport-grpc:spi:test
93+
```
94+
95+
### Testing Your Custom Converter
96+
97+
```java
98+
@Test
99+
public void testCustomQueryConverter() {
100+
MyCustomQueryConverter converter = new MyCustomQueryConverter();
101+
102+
// Create test protobuf query
103+
QueryContainer queryContainer = QueryContainer.newBuilder()
104+
.setMyCustomQuery(MyCustomQuery.newBuilder()
105+
.setField("test_field")
106+
.setValue("test_value")
107+
.build())
108+
.build();
109+
110+
// Convert and verify
111+
QueryBuilder result = converter.fromProto(queryContainer);
112+
assertThat(result, instanceOf(MyCustomQueryBuilder.class));
113+
114+
MyCustomQueryBuilder customQuery = (MyCustomQueryBuilder) result;
115+
assertEquals("test_field", customQuery.fieldName());
116+
assertEquals("test_value", customQuery.value());
117+
}
118+
```
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
*
4+
* The OpenSearch Contributors require contributions made to
5+
* this file be licensed under the Apache-2.0 license or a
6+
* compatible open source license.
7+
*/
8+
9+
apply plugin: 'opensearch.build'
10+
apply plugin: 'opensearch.publish'
11+
12+
base {
13+
group = 'org.opensearch.plugin'
14+
archivesName = 'transport-grpc-spi'
15+
}
16+
17+
dependencies {
18+
api project(":server")
19+
api "org.opensearch:protobufs:0.6.0"
20+
21+
testImplementation project(":test:framework")
22+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1675c5085e1376fd1a107b87f7e325944ab5b4dc

0 commit comments

Comments
 (0)