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

Reply via email to