This is an automated email from the ASF dual-hosted git repository. junhao pushed a commit to branch denote in repository https://gitbox.apache.org/repos/asf/paimon-trino.git
commit 71d464bdbc9617c160e864b053a8eb77ab0ee071 Author: yejunhao <[email protected]> AuthorDate: Fri Apr 12 09:45:19 2024 +0800 Remove timeWithTimeZone test, fix error of upperCase error(column name aCa will fail to select). --- .../trino/InternalPaimonConnectorFactory.java | 110 +++++++++++++++++++++ .../paimon/trino/TrinoPageSourceProvider.java | 2 +- .../org/apache/paimon/trino/TrinoTableHandle.java | 10 +- .../org/apache/paimon/trino/TrinoTypeUtils.java | 21 +++- .../apache/paimon/trino/catalog/TrinoCatalog.java | 7 +- .../org/apache/paimon/trino/TestTrinoITCase.java | 4 +- 6 files changed, 142 insertions(+), 12 deletions(-) diff --git a/paimon-trino-common/src/main/java/org/apache/paimon/trino/InternalPaimonConnectorFactory.java b/paimon-trino-common/src/main/java/org/apache/paimon/trino/InternalPaimonConnectorFactory.java new file mode 100644 index 0000000..304ce28 --- /dev/null +++ b/paimon-trino-common/src/main/java/org/apache/paimon/trino/InternalPaimonConnectorFactory.java @@ -0,0 +1,110 @@ +/* + * + * * Licensed to the Apache Software Foundation (ASF) under one + * * or more contributor license agreements. See the NOTICE file + * * distributed with this work for additional information + * * regarding copyright ownership. The ASF licenses this file + * * to you under the Apache License, Version 2.0 (the + * * "License"); you may not use this file except in compliance + * * with the License. You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * + */ + +package org.apache.paimon.trino; + +import com.google.inject.Injector; +import com.google.inject.Module; +import io.airlift.bootstrap.Bootstrap; +import io.airlift.json.JsonModule; +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.trace.Tracer; +import io.trino.filesystem.TrinoFileSystemFactory; +import io.trino.filesystem.manager.FileSystemModule; +import io.trino.hdfs.HdfsModule; +import io.trino.hdfs.authentication.HdfsAuthenticationModule; +import io.trino.plugin.hive.NodeVersion; +import io.trino.plugin.hive.orc.OrcReaderConfig; +import io.trino.spi.classloader.ThreadContextClassLoader; +import io.trino.spi.connector.Connector; +import io.trino.spi.connector.ConnectorContext; +import io.trino.spi.type.TypeManager; + +import java.util.Map; +import java.util.Optional; + +/** Internal factory to create connector. */ +public class InternalPaimonConnectorFactory { + + private InternalPaimonConnectorFactory() {} + + public static Connector createConnector( + Map<String, String> config, + ConnectorContext context, + Optional<TrinoFileSystemFactory> fileSystemFactory, + Module module) { + ClassLoader classLoader = InternalPaimonConnectorFactory.class.getClassLoader(); + try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) { + Bootstrap app = + new Bootstrap( + new JsonModule(), + new TrinoModule(config), + new HdfsModule(), + new HdfsAuthenticationModule(), + // bind the trino file system module + fileSystemFactory + .map( + factory -> + (Module) + binder -> + binder.bind( + TrinoFileSystemFactory + .class) + .toInstance(factory)) + .orElseGet(FileSystemModule::new), + binder -> { + binder.bind(NodeVersion.class) + .toInstance( + new NodeVersion( + context.getNodeManager() + .getCurrentNode() + .getVersion())); + binder.bind(TypeManager.class).toInstance(context.getTypeManager()); + binder.bind(OpenTelemetry.class) + .toInstance(context.getOpenTelemetry()); + binder.bind(Tracer.class).toInstance(context.getTracer()); + binder.bind(OrcReaderConfig.class) + .toInstance(new OrcReaderConfig()); + }, + module); + + Injector injector = + app.doNotInitializeLogging() + .setRequiredConfigurationProperties(Map.of()) + .setOptionalConfigurationProperties(config) + .initialize(); + + TrinoMetadata trinoMetadata = injector.getInstance(TrinoMetadataFactory.class).create(); + TrinoSplitManager trinoSplitManager = injector.getInstance(TrinoSplitManager.class); + TrinoPageSourceProvider trinoPageSourceProvider = + injector.getInstance(TrinoPageSourceProvider.class); + TrinoSessionProperties trinoSessionProperties = + injector.getInstance(TrinoSessionProperties.class); + TrinoTableOptions trinoTableOptions = injector.getInstance(TrinoTableOptions.class); + + return new TrinoConnector( + trinoMetadata, + trinoSplitManager, + trinoPageSourceProvider, + trinoTableOptions, + trinoSessionProperties); + } + } +} diff --git a/paimon-trino-common/src/main/java/org/apache/paimon/trino/TrinoPageSourceProvider.java b/paimon-trino-common/src/main/java/org/apache/paimon/trino/TrinoPageSourceProvider.java index 5510128..e2244b5 100644 --- a/paimon-trino-common/src/main/java/org/apache/paimon/trino/TrinoPageSourceProvider.java +++ b/paimon-trino-common/src/main/java/org/apache/paimon/trino/TrinoPageSourceProvider.java @@ -121,7 +121,7 @@ public class TrinoPageSourceProvider implements ConnectorPageSourceProvider { List<ColumnHandle> columns, OptionalLong limit) { RowType rowType = table.rowType(); - List<String> fieldNames = FieldNameUtils.fieldNames(rowType); + List<String> fieldNames = rowType.getFieldNames(); List<String> projectedFields = columns.stream() .map(TrinoColumnHandle.class::cast) diff --git a/paimon-trino-common/src/main/java/org/apache/paimon/trino/TrinoTableHandle.java b/paimon-trino-common/src/main/java/org/apache/paimon/trino/TrinoTableHandle.java index 30c03af..bc5d025 100644 --- a/paimon-trino-common/src/main/java/org/apache/paimon/trino/TrinoTableHandle.java +++ b/paimon-trino-common/src/main/java/org/apache/paimon/trino/TrinoTableHandle.java @@ -164,13 +164,15 @@ public class TrinoTableHandle implements ConnectorTableHandle { public TrinoColumnHandle columnHandle(TrinoCatalog catalog, String field) { Table paimonTable = table(catalog); - List<String> fieldNames = FieldNameUtils.fieldNames(paimonTable.rowType()); - int index = fieldNames.indexOf(field); + List<String> lowerCaseFieldNames = FieldNameUtils.fieldNames(paimonTable.rowType()); + List<String> originFieldNames = paimonTable.rowType().getFieldNames(); + int index = lowerCaseFieldNames.indexOf(field); if (index == -1) { throw new RuntimeException( - String.format("Cannot find field %s in schema %s", field, fieldNames)); + String.format("Cannot find field %s in schema %s", field, lowerCaseFieldNames)); } - return TrinoColumnHandle.of(field, paimonTable.rowType().getTypeAt(index)); + return TrinoColumnHandle.of( + originFieldNames.get(index), paimonTable.rowType().getTypeAt(index)); } public TrinoTableHandle copy(TupleDomain<TrinoColumnHandle> filter) { diff --git a/paimon-trino-common/src/main/java/org/apache/paimon/trino/TrinoTypeUtils.java b/paimon-trino-common/src/main/java/org/apache/paimon/trino/TrinoTypeUtils.java index 5c7f8d8..da2ddf7 100644 --- a/paimon-trino-common/src/main/java/org/apache/paimon/trino/TrinoTypeUtils.java +++ b/paimon-trino-common/src/main/java/org/apache/paimon/trino/TrinoTypeUtils.java @@ -153,12 +153,29 @@ public class TrinoTypeUtils { @Override public Type visit(TimestampType timestampType) { int precision = timestampType.getPrecision(); - return io.trino.spi.type.TimestampType.createTimestampType(precision); + if (precision <= 3) { + return io.trino.spi.type.TimestampType.TIMESTAMP_MILLIS; + } else if (precision <= 6) { + return io.trino.spi.type.TimestampType.TIMESTAMP_MICROS; + } else if (precision <= 9) { + return io.trino.spi.type.TimestampType.TIMESTAMP_NANOS; + } else { + return io.trino.spi.type.TimestampType.TIMESTAMP_PICOS; + } } @Override public Type visit(LocalZonedTimestampType localZonedTimestampType) { - return TimestampWithTimeZoneType.TIMESTAMP_TZ_MILLIS; + int precision = localZonedTimestampType.getPrecision(); + if (precision <= 3) { + return TimestampWithTimeZoneType.TIMESTAMP_TZ_MILLIS; + } else if (precision <= 6) { + return TimestampWithTimeZoneType.TIMESTAMP_TZ_MICROS; + } else if (precision <= 9) { + return TimestampWithTimeZoneType.TIMESTAMP_TZ_NANOS; + } else { + return TimestampWithTimeZoneType.TIMESTAMP_TZ_PICOS; + } } @Override diff --git a/paimon-trino-common/src/main/java/org/apache/paimon/trino/catalog/TrinoCatalog.java b/paimon-trino-common/src/main/java/org/apache/paimon/trino/catalog/TrinoCatalog.java index c956830..e02abb4 100644 --- a/paimon-trino-common/src/main/java/org/apache/paimon/trino/catalog/TrinoCatalog.java +++ b/paimon-trino-common/src/main/java/org/apache/paimon/trino/catalog/TrinoCatalog.java @@ -23,7 +23,8 @@ package org.apache.paimon.trino.catalog; import org.apache.paimon.catalog.Catalog; import org.apache.paimon.catalog.CatalogContext; import org.apache.paimon.catalog.CatalogFactory; -import org.apache.paimon.catalog.CatalogLock; +import org.apache.paimon.catalog.CatalogLockContext; +import org.apache.paimon.catalog.CatalogLockFactory; import org.apache.paimon.catalog.Identifier; import org.apache.paimon.metastore.MetastoreClient; import org.apache.paimon.options.Options; @@ -95,7 +96,7 @@ public class TrinoCatalog implements Catalog { } @Override - public Optional<CatalogLock.LockFactory> lockFactory() { + public Optional<CatalogLockFactory> lockFactory() { return current.lockFactory(); } @@ -173,7 +174,7 @@ public class TrinoCatalog implements Catalog { } @Override - public Optional<CatalogLock.LockContext> lockContext() { + public Optional<CatalogLockContext> lockContext() { return current.lockContext(); } diff --git a/paimon-trino-common/src/test/java/org/apache/paimon/trino/TestTrinoITCase.java b/paimon-trino-common/src/test/java/org/apache/paimon/trino/TestTrinoITCase.java index 78fb313..c9ae2f1 100644 --- a/paimon-trino-common/src/test/java/org/apache/paimon/trino/TestTrinoITCase.java +++ b/paimon-trino-common/src/test/java/org/apache/paimon/trino/TestTrinoITCase.java @@ -727,11 +727,11 @@ public abstract class TestTrinoITCase extends AbstractTestQueryFramework { assertThat( sql( "SELECT boolean, tinyint, smallint,int,bigint,float,double,char,varchar, date,timestamp_0, " - + "timestamp_3, timestamp_6, timestamp_tz, decimal, to_hex(varbinary), array, map, row FROM paimon.default.t99")) + + "timestamp_3, timestamp_6, decimal, to_hex(varbinary), array, map, row FROM paimon.default.t99")) .isEqualTo( "[[true, 1, 1, 1, 1, 1.0, 1.0, char1, varchar1, 1970-01-01, " + "2023-09-12T07:54:48, 2023-09-12T07:54:48.001, 2023-09-12T07:54:48.001001, " - + "2023-09-12T07:54:48.002Z[UTC], 0.10000, 010203, [1, 1, 1], {1=1}, [1, 1]]]"); + + "0.10000, 010203, [1, 1, 1], {1=1}, [1, 1]]]"); } @Test
