Skip to content

Commit 77ebc1c

Browse files
committed
Consolidate ConnectorContext bindings into a generic module
This reduces code duplication - a lot - and also frees the plugin writers from guessing which objects are actually needed by the plugin. The answer this module gives is: all of them, don't worry about it. The biggest issue is with testing, because while the `TestingConnectorContext` does implement all methods (with stubbed implementations), there are some tests that may want to customize that. Because `TestingConnectorContext` is `final`, it's not easily extensible, so there's a temptation to implement `ConnectorContext` directly. With this change this will no longer work (well) because such a test will have to implement all of the methods instead of just one or two.
1 parent ef2845e commit 77ebc1c

File tree

27 files changed

+109
-174
lines changed

27 files changed

+109
-174
lines changed

lib/trino-hdfs/src/main/java/io/trino/filesystem/hdfs/HdfsFileSystemManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@
1818
import io.airlift.bootstrap.Bootstrap;
1919
import io.airlift.bootstrap.LifeCycleManager;
2020
import io.airlift.configuration.ConfigPropertyMetadata;
21-
import io.opentelemetry.api.OpenTelemetry;
2221
import io.trino.filesystem.TrinoFileSystemFactory;
2322
import io.trino.hdfs.HdfsModule;
2423
import io.trino.hdfs.authentication.HdfsAuthenticationModule;
2524
import io.trino.hdfs.azure.HiveAzureModule;
2625
import io.trino.hdfs.cos.HiveCosModule;
2726
import io.trino.hdfs.gcs.HiveGcsModule;
2827
import io.trino.hdfs.s3.HiveS3Module;
28+
import io.trino.plugin.base.ConnectorContextModule;
2929
import io.trino.plugin.base.jmx.ConnectorObjectNameGeneratorModule;
3030
import io.trino.plugin.base.jmx.MBeanServerModule;
3131
import io.trino.spi.catalog.CatalogName;
@@ -62,8 +62,8 @@ public HdfsFileSystemManager(
6262
modules.add(new HdfsModule());
6363
modules.add(new HdfsAuthenticationModule());
6464
modules.add(new HiveCosModule());
65+
modules.add(new ConnectorContextModule(context));
6566
modules.add(binder -> {
66-
binder.bind(OpenTelemetry.class).toInstance(context.getOpenTelemetry());
6767
binder.bind(CatalogName.class).toInstance(new CatalogName(catalogName));
6868
});
6969

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* Licensed under the Apache License, Version 2.0 (the "License");
3+
* you may not use this file except in compliance with the License.
4+
* You may obtain a copy of the License at
5+
*
6+
* http://www.apache.org/licenses/LICENSE-2.0
7+
*
8+
* Unless required by applicable law or agreed to in writing, software
9+
* distributed under the License is distributed on an "AS IS" BASIS,
10+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
* See the License for the specific language governing permissions and
12+
* limitations under the License.
13+
*/
14+
package io.trino.plugin.base;
15+
16+
import com.google.inject.Binder;
17+
import com.google.inject.Module;
18+
import io.opentelemetry.api.OpenTelemetry;
19+
import io.opentelemetry.api.trace.Tracer;
20+
import io.trino.spi.Node;
21+
import io.trino.spi.NodeManager;
22+
import io.trino.spi.NodeVersion;
23+
import io.trino.spi.PageIndexerFactory;
24+
import io.trino.spi.PageSorter;
25+
import io.trino.spi.VersionEmbedder;
26+
import io.trino.spi.connector.ConnectorContext;
27+
import io.trino.spi.connector.MetadataProvider;
28+
import io.trino.spi.type.TypeManager;
29+
30+
import static java.util.Objects.requireNonNull;
31+
32+
public class ConnectorContextModule
33+
implements Module
34+
{
35+
private final ConnectorContext context;
36+
37+
public ConnectorContextModule(ConnectorContext context)
38+
{
39+
this.context = requireNonNull(context, "context is null");
40+
}
41+
42+
@Override
43+
public void configure(Binder binder)
44+
{
45+
binder.bind(OpenTelemetry.class).toInstance(context.getOpenTelemetry());
46+
binder.bind(Tracer.class).toInstance(context.getTracer());
47+
binder.bind(Node.class).toInstance(context.getCurrentNode());
48+
binder.bind(NodeVersion.class).toInstance(new NodeVersion(context.getCurrentNode().getVersion()));
49+
binder.bind(NodeManager.class).toInstance(context.getNodeManager());
50+
binder.bind(VersionEmbedder.class).toInstance(context.getVersionEmbedder());
51+
binder.bind(TypeManager.class).toInstance(context.getTypeManager());
52+
binder.bind(MetadataProvider.class).toInstance(context.getMetadataProvider());
53+
binder.bind(PageSorter.class).toInstance(context.getPageSorter());
54+
binder.bind(PageIndexerFactory.class).toInstance(context.getPageIndexerFactory());
55+
}
56+
}

plugin/trino-ai-functions/src/main/java/io/trino/plugin/ai/functions/AiConnectorFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
import com.google.inject.Injector;
1717
import io.airlift.bootstrap.Bootstrap;
18-
import io.opentelemetry.api.trace.Tracer;
18+
import io.trino.plugin.base.ConnectorContextModule;
1919
import io.trino.spi.catalog.CatalogName;
2020
import io.trino.spi.connector.Connector;
2121
import io.trino.spi.connector.ConnectorContext;
@@ -42,8 +42,8 @@ public Connector create(String catalogName, Map<String, String> config, Connecto
4242
Bootstrap app = new Bootstrap(
4343
"io.trino.bootstrap.catalog." + catalogName,
4444
new AiModule(),
45+
new ConnectorContextModule(context),
4546
binder -> {
46-
binder.bind(Tracer.class).toInstance(context.getTracer());
4747
binder.bind(CatalogName.class).toInstance(new CatalogName(catalogName));
4848
});
4949

plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcConnectorFactory.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,11 @@
1616
import com.google.inject.Injector;
1717
import com.google.inject.Module;
1818
import io.airlift.bootstrap.Bootstrap;
19-
import io.opentelemetry.api.OpenTelemetry;
20-
import io.trino.spi.Node;
21-
import io.trino.spi.VersionEmbedder;
19+
import io.trino.plugin.base.ConnectorContextModule;
2220
import io.trino.spi.catalog.CatalogName;
2321
import io.trino.spi.connector.Connector;
2422
import io.trino.spi.connector.ConnectorContext;
2523
import io.trino.spi.connector.ConnectorFactory;
26-
import io.trino.spi.type.TypeManager;
2724

2825
import java.util.Map;
2926
import java.util.function.Supplier;
@@ -60,10 +57,7 @@ public Connector create(String catalogName, Map<String, String> requiredConfig,
6057

6158
Bootstrap app = new Bootstrap(
6259
"io.trino.bootstrap.catalog." + catalogName,
63-
binder -> binder.bind(TypeManager.class).toInstance(context.getTypeManager()),
64-
binder -> binder.bind(Node.class).toInstance(context.getCurrentNode()),
65-
binder -> binder.bind(VersionEmbedder.class).toInstance(context.getVersionEmbedder()),
66-
binder -> binder.bind(OpenTelemetry.class).toInstance(context.getOpenTelemetry()),
60+
new ConnectorContextModule(context),
6761
binder -> binder.bind(CatalogName.class).toInstance(new CatalogName(catalogName)),
6862
new JdbcModule(),
6963
module.get());

plugin/trino-bigquery/src/main/java/io/trino/plugin/bigquery/BigQueryConnectorFactory.java

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,13 @@
1616
import com.google.inject.Injector;
1717
import io.airlift.bootstrap.Bootstrap;
1818
import io.airlift.json.JsonModule;
19-
import io.opentelemetry.api.OpenTelemetry;
20-
import io.opentelemetry.api.trace.Tracer;
19+
import io.trino.plugin.base.ConnectorContextModule;
2120
import io.trino.plugin.base.jmx.ConnectorObjectNameGeneratorModule;
2221
import io.trino.plugin.base.jmx.MBeanServerModule;
23-
import io.trino.spi.Node;
24-
import io.trino.spi.NodeManager;
2522
import io.trino.spi.catalog.CatalogName;
2623
import io.trino.spi.connector.Connector;
2724
import io.trino.spi.connector.ConnectorContext;
2825
import io.trino.spi.connector.ConnectorFactory;
29-
import io.trino.spi.type.TypeManager;
3026
import org.weakref.jmx.guice.MBeanModule;
3127

3228
import java.util.Map;
@@ -57,12 +53,8 @@ public Connector create(String catalogName, Map<String, String> config, Connecto
5753
new MBeanServerModule(),
5854
new MBeanModule(),
5955
new ConnectorObjectNameGeneratorModule("io.trino.plugin.bigquery", "trino.plugin.bigquery"),
56+
new ConnectorContextModule(context),
6057
binder -> {
61-
binder.bind(TypeManager.class).toInstance(context.getTypeManager());
62-
binder.bind(Node.class).toInstance(context.getCurrentNode());
63-
binder.bind(NodeManager.class).toInstance(context.getNodeManager());
64-
binder.bind(OpenTelemetry.class).toInstance(context.getOpenTelemetry());
65-
binder.bind(Tracer.class).toInstance(context.getTracer());
6658
binder.bind(CatalogName.class).toInstance(new CatalogName(catalogName));
6759
});
6860

plugin/trino-cassandra/src/main/java/io/trino/plugin/cassandra/CassandraConnectorFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import com.google.inject.Injector;
1717
import io.airlift.bootstrap.Bootstrap;
1818
import io.airlift.json.JsonModule;
19-
import io.opentelemetry.api.OpenTelemetry;
19+
import io.trino.plugin.base.ConnectorContextModule;
2020
import io.trino.plugin.base.jmx.MBeanServerModule;
2121
import io.trino.spi.connector.Connector;
2222
import io.trino.spi.connector.ConnectorContext;
@@ -45,7 +45,7 @@ public Connector create(String catalogName, Map<String, String> config, Connecto
4545

4646
Bootstrap app = new Bootstrap(
4747
"io.trino.bootstrap.catalog." + catalogName,
48-
binder -> binder.bind(OpenTelemetry.class).toInstance(context.getOpenTelemetry()),
48+
new ConnectorContextModule(context),
4949
new MBeanModule(),
5050
new JsonModule(),
5151
new CassandraClientModule(context.getTypeManager()),

plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/DeltaLakeConnectorFactory.java

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,9 @@
2020
import io.airlift.bootstrap.Bootstrap;
2121
import io.airlift.bootstrap.LifeCycleManager;
2222
import io.airlift.json.JsonModule;
23-
import io.opentelemetry.api.OpenTelemetry;
24-
import io.opentelemetry.api.trace.Tracer;
2523
import io.trino.filesystem.manager.FileSystemModule;
2624
import io.trino.plugin.base.CatalogNameModule;
25+
import io.trino.plugin.base.ConnectorContextModule;
2726
import io.trino.plugin.base.classloader.ClassLoaderSafeConnectorAccessControl;
2827
import io.trino.plugin.base.classloader.ClassLoaderSafeConnectorPageSinkProvider;
2928
import io.trino.plugin.base.classloader.ClassLoaderSafeConnectorPageSourceProvider;
@@ -34,10 +33,6 @@
3433
import io.trino.plugin.base.session.SessionPropertiesProvider;
3534
import io.trino.plugin.deltalake.metastore.DeltaLakeMetastoreModule;
3635
import io.trino.plugin.hive.HiveConfig;
37-
import io.trino.spi.Node;
38-
import io.trino.spi.NodeManager;
39-
import io.trino.spi.NodeVersion;
40-
import io.trino.spi.PageIndexerFactory;
4136
import io.trino.spi.catalog.CatalogName;
4237
import io.trino.spi.classloader.ThreadContextClassLoader;
4338
import io.trino.spi.connector.Connector;
@@ -52,7 +47,6 @@
5247
import io.trino.spi.function.FunctionProvider;
5348
import io.trino.spi.function.table.ConnectorTableFunction;
5449
import io.trino.spi.procedure.Procedure;
55-
import io.trino.spi.type.TypeManager;
5650
import org.weakref.jmx.guice.MBeanModule;
5751

5852
import java.util.Map;
@@ -102,14 +96,8 @@ public static Connector createConnector(
10296
new DeltaLakeSecurityModule(),
10397
new DeltaLakeSynchronizerModule(),
10498
new FileSystemModule(catalogName, context, false),
99+
new ConnectorContextModule(context),
105100
binder -> {
106-
binder.bind(OpenTelemetry.class).toInstance(context.getOpenTelemetry());
107-
binder.bind(Tracer.class).toInstance(context.getTracer());
108-
binder.bind(NodeVersion.class).toInstance(new NodeVersion(context.getCurrentNode().getVersion()));
109-
binder.bind(Node.class).toInstance(context.getCurrentNode());
110-
binder.bind(NodeManager.class).toInstance(context.getNodeManager());
111-
binder.bind(TypeManager.class).toInstance(context.getTypeManager());
112-
binder.bind(PageIndexerFactory.class).toInstance(context.getPageIndexerFactory());
113101
binder.bind(CatalogName.class).toInstance(new CatalogName(catalogName));
114102
},
115103
module);

plugin/trino-delta-lake/src/test/java/io/trino/plugin/deltalake/TestDeltaLakeMetadata.java

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import com.google.inject.Scopes;
2323
import io.airlift.bootstrap.Bootstrap;
2424
import io.airlift.json.JsonModule;
25-
import io.opentelemetry.api.trace.Tracer;
2625
import io.trino.filesystem.TrinoFileSystemFactory;
2726
import io.trino.filesystem.cache.CachingHostAddressProvider;
2827
import io.trino.filesystem.cache.DefaultCachingHostAddressProvider;
@@ -32,21 +31,17 @@
3231
import io.trino.metastore.Database;
3332
import io.trino.metastore.HiveMetastoreFactory;
3433
import io.trino.metastore.RawHiveMetastoreFactory;
34+
import io.trino.plugin.base.ConnectorContextModule;
3535
import io.trino.plugin.deltalake.metastore.DeltaLakeMetastore;
3636
import io.trino.plugin.deltalake.metastore.DeltaLakeMetastoreModule;
3737
import io.trino.plugin.deltalake.metastore.HiveMetastoreBackedDeltaLakeMetastore;
3838
import io.trino.plugin.deltalake.transactionlog.MetadataEntry;
3939
import io.trino.plugin.deltalake.transactionlog.ProtocolEntry;
40-
import io.trino.spi.Node;
41-
import io.trino.spi.NodeManager;
42-
import io.trino.spi.NodeVersion;
43-
import io.trino.spi.PageIndexerFactory;
4440
import io.trino.spi.TrinoException;
4541
import io.trino.spi.catalog.CatalogName;
4642
import io.trino.spi.connector.Assignment;
4743
import io.trino.spi.connector.ColumnHandle;
4844
import io.trino.spi.connector.ColumnMetadata;
49-
import io.trino.spi.connector.ConnectorContext;
5045
import io.trino.spi.connector.ConnectorTableHandle;
5146
import io.trino.spi.connector.ConnectorTableLayout;
5247
import io.trino.spi.connector.ConnectorTableMetadata;
@@ -63,7 +58,6 @@
6358
import io.trino.spi.type.DoubleType;
6459
import io.trino.spi.type.RowType;
6560
import io.trino.spi.type.Type;
66-
import io.trino.spi.type.TypeManager;
6761
import io.trino.spi.type.VarcharType;
6862
import io.trino.testing.TestingConnectorContext;
6963
import io.trino.tests.BogusType;
@@ -189,18 +183,13 @@ public void setUp()
189183
.put("hive.metastore.catalog.dir", temporaryCatalogDirectory.getPath())
190184
.buildOrThrow();
191185

186+
TestingConnectorContext context = new TestingConnectorContext();
192187
Bootstrap app = new Bootstrap(
193188
// connector dependencies
194189
new JsonModule(),
190+
new ConnectorContextModule(context),
195191
binder -> {
196-
ConnectorContext context = new TestingConnectorContext();
197-
binder.bind(NodeVersion.class).toInstance(new NodeVersion(context.getCurrentNode().getVersion()));
198-
binder.bind(Node.class).toInstance(context.getCurrentNode());
199192
binder.bind(CatalogName.class).toInstance(new CatalogName("test"));
200-
binder.bind(TypeManager.class).toInstance(context.getTypeManager());
201-
binder.bind(NodeManager.class).toInstance(context.getNodeManager());
202-
binder.bind(PageIndexerFactory.class).toInstance(context.getPageIndexerFactory());
203-
binder.bind(Tracer.class).toInstance(context.getTracer());
204193
},
205194
// connector modules
206195
new DeltaLakeSecurityModule(),

plugin/trino-delta-lake/src/test/java/io/trino/plugin/deltalake/metastore/glue/TestDeltaLakeGlueMetastore.java

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,31 +22,26 @@
2222
import io.airlift.bootstrap.Bootstrap;
2323
import io.airlift.bootstrap.LifeCycleManager;
2424
import io.airlift.json.JsonModule;
25-
import io.opentelemetry.api.OpenTelemetry;
26-
import io.opentelemetry.api.trace.Tracer;
2725
import io.trino.filesystem.manager.FileSystemModule;
2826
import io.trino.metastore.Column;
2927
import io.trino.metastore.Database;
3028
import io.trino.metastore.HiveMetastore;
3129
import io.trino.metastore.HiveMetastoreFactory;
3230
import io.trino.metastore.PrincipalPrivileges;
3331
import io.trino.metastore.Table;
32+
import io.trino.plugin.base.ConnectorContextModule;
3433
import io.trino.plugin.base.session.SessionPropertiesProvider;
3534
import io.trino.plugin.deltalake.DeltaLakeMetadata;
3635
import io.trino.plugin.deltalake.DeltaLakeMetadataFactory;
3736
import io.trino.plugin.deltalake.DeltaLakeModule;
3837
import io.trino.plugin.deltalake.DeltaLakeSecurityModule;
3938
import io.trino.plugin.deltalake.metastore.DeltaLakeMetastoreModule;
40-
import io.trino.spi.Node;
41-
import io.trino.spi.NodeVersion;
42-
import io.trino.spi.PageIndexerFactory;
4339
import io.trino.spi.TrinoException;
4440
import io.trino.spi.catalog.CatalogName;
4541
import io.trino.spi.connector.ConnectorContext;
4642
import io.trino.spi.connector.RelationColumnsMetadata;
4743
import io.trino.spi.connector.SchemaTableName;
4844
import io.trino.spi.connector.SchemaTablePrefix;
49-
import io.trino.spi.type.TypeManager;
5045
import io.trino.testing.TestingConnectorContext;
5146
import io.trino.testing.TestingConnectorSession;
5247
import org.junit.jupiter.api.AfterAll;
@@ -118,14 +113,9 @@ public void setUp()
118113
Bootstrap app = new Bootstrap(
119114
// connector dependencies
120115
new JsonModule(),
116+
new ConnectorContextModule(context),
121117
binder -> {
122118
binder.bind(CatalogName.class).toInstance(new CatalogName("test"));
123-
binder.bind(TypeManager.class).toInstance(context.getTypeManager());
124-
binder.bind(Node.class).toInstance(context.getCurrentNode());
125-
binder.bind(PageIndexerFactory.class).toInstance(context.getPageIndexerFactory());
126-
binder.bind(NodeVersion.class).toInstance(new NodeVersion("test_version"));
127-
binder.bind(OpenTelemetry.class).toInstance(context.getOpenTelemetry());
128-
binder.bind(Tracer.class).toInstance(context.getTracer());
129119
},
130120
// connector modules
131121
new DeltaLakeMetastoreModule(),

plugin/trino-elasticsearch/src/main/java/io/trino/plugin/elasticsearch/ElasticsearchConnectorFactory.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,14 @@
1616
import com.google.inject.Injector;
1717
import io.airlift.bootstrap.Bootstrap;
1818
import io.airlift.json.JsonModule;
19+
import io.trino.plugin.base.ConnectorContextModule;
1920
import io.trino.plugin.base.TypeDeserializerModule;
2021
import io.trino.plugin.base.jmx.ConnectorObjectNameGeneratorModule;
2122
import io.trino.plugin.base.jmx.MBeanServerModule;
22-
import io.trino.spi.Node;
2323
import io.trino.spi.catalog.CatalogName;
2424
import io.trino.spi.connector.Connector;
2525
import io.trino.spi.connector.ConnectorContext;
2626
import io.trino.spi.connector.ConnectorFactory;
27-
import io.trino.spi.type.TypeManager;
2827
import org.weakref.jmx.guice.MBeanModule;
2928

3029
import java.util.Map;
@@ -58,10 +57,9 @@ public Connector create(String catalogName, Map<String, String> config, Connecto
5857
new JsonModule(),
5958
new TypeDeserializerModule(),
6059
new ElasticsearchConnectorModule(),
60+
new ConnectorContextModule(context),
6161
binder -> {
62-
binder.bind(Node.class).toInstance(context.getCurrentNode());
6362
binder.bind(CatalogName.class).toInstance(new CatalogName(catalogName));
64-
binder.bind(TypeManager.class).toInstance(context.getTypeManager());
6563
});
6664

6765
Injector injector = app

0 commit comments

Comments
 (0)