This is an automated email from the ASF dual-hosted git repository. yuqi4733 pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/gravitino.git
commit 6e0b6e43e1a2ba946e086f488d580d72efc3e044 Author: Yuhui <[email protected]> AuthorDate: Wed Feb 11 10:40:15 2026 +0800 [#9894] feat (trino-connector): Add the version segment module to support Trino 440-445 (#9895) Add the version segment module for 440-445 to support Trino 440 through Trino 445 Fix: #9894 NO UT and IT --------- Co-authored-by: Qi Yu <[email protected]> Co-authored-by: roryqi <[email protected]> --- gradle.properties | 4 + .../docker-script/docker-compose.yaml | 10 +-- .../docker-script/init/trino/init.sh | 2 +- integration-test-common/docker-script/launch.sh | 16 ++-- integration-test-common/docker-script/shutdown.sh | 1 + settings.gradle.kts | 1 + trino-connector/integration-test/build.gradle.kts | 3 +- .../trino-connector-435-439/build.gradle.kts | 25 +++--- .../build.gradle.kts | 26 ++++--- .../trino/connector/GravitinoConnector440.java | 55 +++++++++++++ .../connector/GravitinoConnectorFactory440.java | 52 +++++++++++++ .../trino/connector/GravitinoMetadata440.java | 90 ++++++++++++++++++++++ .../GravitinoNodePartitioningProvider440.java | 30 ++++++++ .../trino/connector/GravitinoPlugin440.java | 38 +++++++++ .../trino/connector/GravitinoSplitManager440.java | 66 ++++++++++++++++ .../connector/GravitinoSystemConnector440.java | 87 +++++++++++++++++++++ .../META-INF/services/io.trino.spi.Plugin | 13 +--- .../src/test/java/TestGravitinoConnector440.java | 59 ++++++++++++++ .../trino/connector/GravitinoDynamicFilter.java | 5 +- .../trino/connector/GravitinoSplitManager.java | 2 +- .../trino/connector/GravitinoMockServer.java | 5 +- 21 files changed, 540 insertions(+), 50 deletions(-) diff --git a/gradle.properties b/gradle.properties index 45123f6aa7..27f84ce04e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,6 +24,10 @@ org.gradle.jvmargs=-Xmx4g org.gradle.java.installations.auto-download=true org.gradle.java.installations.auto-detect=true +# Increase network timeout for toolchain downloads (in milliseconds) +systemProp.org.gradle.internal.http.connectionTimeout=300000 +systemProp.org.gradle.internal.http.socketTimeout=300000 + # version that is going to be updated automatically by releases version = 1.2.0-SNAPSHOT diff --git a/integration-test-common/docker-script/docker-compose.yaml b/integration-test-common/docker-script/docker-compose.yaml index 2641e53992..e37eda30a8 100644 --- a/integration-test-common/docker-script/docker-compose.yaml +++ b/integration-test-common/docker-script/docker-compose.yaml @@ -19,7 +19,7 @@ services: hive: - image: apache/gravitino-ci:hive-0.1.13 + image: apache/gravitino-ci:hive-0.1.20 networks: - trino-net container_name: trino-ci-hive @@ -79,7 +79,7 @@ services: retries: 5 trino: - image: trinodb/trino:${TRINO_VERSION:-435} + image: trinodb/trino:${TRINO_VERSION:-440} networks: - trino-net container_name: trino-ci-trino @@ -94,7 +94,7 @@ services: entrypoint: /bin/bash /tmp/trino/init.sh volumes: - ./init/trino:/tmp/trino - - ${GRAVITINO_TRINO_CONNECTOR_DIR:-../../trino-connector/trino-connector-435-439/build/libs}:/usr/lib/trino/plugin/gravitino + - ${GRAVITINO_TRINO_CONNECTOR_DIR:-../../trino-connector/trino-connector-440-445/build/libs}:/usr/lib/trino/plugin/gravitino extra_hosts: - "host.docker.internal:host-gateway" healthcheck: @@ -113,7 +113,7 @@ services: condition: service_healthy trino-worker: - image: trinodb/trino:${TRINO_VERSION:-435} + image: trinodb/trino:${TRINO_VERSION:-440} networks: - trino-net deploy: @@ -128,7 +128,7 @@ services: entrypoint: /bin/bash /tmp/trino/init.sh volumes: - ./init/trino:/tmp/trino - - ${GRAVITINO_TRINO_CONNECTOR_DIR:-../../trino-connector/trino-connector-435-439/build/libs}:/usr/lib/trino/plugin/gravitino + - ${GRAVITINO_TRINO_CONNECTOR_DIR:-../../trino-connector/trino-connector-440-445/build/libs}:/usr/lib/trino/plugin/gravitino extra_hosts: - "host.docker.internal:host-gateway" depends_on: diff --git a/integration-test-common/docker-script/init/trino/init.sh b/integration-test-common/docker-script/init/trino/init.sh index 051d56ee6c..077c6f77d0 100644 --- a/integration-test-common/docker-script/init/trino/init.sh +++ b/integration-test-common/docker-script/init/trino/init.sh @@ -60,7 +60,7 @@ fi # Container start up if [[ "${TRINO_ROLE}" == "coordinator" ]]; then - nohup /usr/lib/trino/bin/run-trino > /tmp/trino.out 2>&1 & + nohup /usr/lib/trino/bin/run-trino 2>&1 | tee /tmp/trino.log & counter=0 while [ $counter -le 300 ]; do diff --git a/integration-test-common/docker-script/launch.sh b/integration-test-common/docker-script/launch.sh index 8705d8c02a..1cc340de29 100755 --- a/integration-test-common/docker-script/launch.sh +++ b/integration-test-common/docker-script/launch.sh @@ -36,14 +36,20 @@ cd ${playground_dir} LOG_DIR=../build/trino-ci-container-log rm -fr $LOG_DIR mkdir -p $LOG_DIR - -docker compose up -d - LOG_PATH=$LOG_DIR/trino-ci-docker-compose.log - echo "The docker compose log is: $LOG_PATH" -nohup docker compose logs -f -t > $LOG_PATH & +docker compose up -d + +# Stream logs directly to the log file (no console output). +nohup docker compose logs -f -t | tee -a "$LOG_PATH" & +LOG_FOLLOW_PID=$! +cleanup_log_follow() { + if [ -n "$LOG_FOLLOW_PID" ] && kill -0 "$LOG_FOLLOW_PID" 2>/dev/null; then + kill "$LOG_FOLLOW_PID" >/dev/null 2>&1 + fi +} +trap cleanup_log_follow EXIT max_attempts=300 attempts=0 diff --git a/integration-test-common/docker-script/shutdown.sh b/integration-test-common/docker-script/shutdown.sh index 90288834ff..191e7a3204 100755 --- a/integration-test-common/docker-script/shutdown.sh +++ b/integration-test-common/docker-script/shutdown.sh @@ -24,6 +24,7 @@ LOG_DIR=../build/trino-ci-container-log if [ -d $LOG_DIR ]; then docker cp trino-ci-hive:/usr/local/hadoop/logs $LOG_DIR/hdfs docker cp trino-ci-hive:/tmp/root $LOG_DIR/hive + docker cp trino-ci-trino:/tmp/trino.log $LOG_DIR/trino.log fi export GRAVITINO_TRINO_CONNECTOR_DIR=/dev/null diff --git a/settings.gradle.kts b/settings.gradle.kts index bd9ce95d9f..a6a4f62d35 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -70,6 +70,7 @@ include("authorizations:authorization-ranger", "authorizations:authorization-com include( "trino-connector:trino-connector", "trino-connector:trino-connector-435-439", + "trino-connector:trino-connector-440-445", "trino-connector:integration-test" ) include("spark-connector:spark-common") diff --git a/trino-connector/integration-test/build.gradle.kts b/trino-connector/integration-test/build.gradle.kts index 3c85c80d5d..6b5988bc67 100644 --- a/trino-connector/integration-test/build.gradle.kts +++ b/trino-connector/integration-test/build.gradle.kts @@ -71,7 +71,8 @@ dependencies { } tasks.register("setupDependencies") { - dependsOn(":trino-connector:trino-connector:jar") + dependsOn(":trino-connector:trino-connector-435-439:jar") + dependsOn(":trino-connector:trino-connector-440-445:jar") dependsOn(":catalogs:catalog-lakehouse-iceberg:jar", ":catalogs:catalog-lakehouse-iceberg:runtimeJars") dependsOn(":catalogs:catalog-jdbc-mysql:jar", ":catalogs:catalog-jdbc-mysql:runtimeJars") dependsOn(":catalogs:catalog-jdbc-postgresql:jar", ":catalogs:catalog-jdbc-postgresql:runtimeJars") diff --git a/trino-connector/trino-connector-435-439/build.gradle.kts b/trino-connector/trino-connector-435-439/build.gradle.kts index a9602647f8..befe0343a7 100644 --- a/trino-connector/trino-connector-435-439/build.gradle.kts +++ b/trino-connector/trino-connector-435-439/build.gradle.kts @@ -27,18 +27,21 @@ plugins { `maven-publish` } -val supportedTrinoVersion = 435 -val minSupportedTrinoVersionProperty = providers.gradleProperty("minSupportedTrinoVersion").map { it.trim().toInt() } -val trinoVersionProvider = - providers.gradleProperty("trinoVersion").map { it.trim().toInt() }.orElse(minSupportedTrinoVersionProperty) - -val resolvedTrinoVersion = trinoVersionProvider.get() -check(resolvedTrinoVersion >= supportedTrinoVersion) { - "Failed to build the module ${project.path} of trinoVersion=$resolvedTrinoVersion. " + - "This module requires trinoVersion >= $supportedTrinoVersion. " + - "Please set '-PtrinoVersion' in the command or set config the 'minSupportedTrinoVersion' of gradle.properties." +// This module supports Trino versions 435-439 +val minTrinoVersion = 435 +val maxTrinoVersion = 439 + +val trinoVersion = providers.gradleProperty("trinoVersion") + .map { it.trim().toInt() } + .orElse(minTrinoVersion) + .get() + +// Validate version range +check(trinoVersion in minTrinoVersion..maxTrinoVersion) { + "Module ${project.path} supports Trino versions $minTrinoVersion-$maxTrinoVersion, " + + "but trinoVersion=$trinoVersion was specified. " + + "Please set '-PtrinoVersion=$minTrinoVersion' (or any version in the supported range)." } -val trinoVersion = resolvedTrinoVersion java { toolchain.languageVersion.set(JavaLanguageVersion.of(24)) diff --git a/trino-connector/trino-connector-435-439/build.gradle.kts b/trino-connector/trino-connector-440-445/build.gradle.kts similarity index 86% copy from trino-connector/trino-connector-435-439/build.gradle.kts copy to trino-connector/trino-connector-440-445/build.gradle.kts index a9602647f8..b922a8ff64 100644 --- a/trino-connector/trino-connector-435-439/build.gradle.kts +++ b/trino-connector/trino-connector-440-445/build.gradle.kts @@ -27,18 +27,21 @@ plugins { `maven-publish` } -val supportedTrinoVersion = 435 -val minSupportedTrinoVersionProperty = providers.gradleProperty("minSupportedTrinoVersion").map { it.trim().toInt() } -val trinoVersionProvider = - providers.gradleProperty("trinoVersion").map { it.trim().toInt() }.orElse(minSupportedTrinoVersionProperty) - -val resolvedTrinoVersion = trinoVersionProvider.get() -check(resolvedTrinoVersion >= supportedTrinoVersion) { - "Failed to build the module ${project.path} of trinoVersion=$resolvedTrinoVersion. " + - "This module requires trinoVersion >= $supportedTrinoVersion. " + - "Please set '-PtrinoVersion' in the command or set config the 'minSupportedTrinoVersion' of gradle.properties." +// This module supports Trino versions 440-445 +val minTrinoVersion = 440 +val maxTrinoVersion = 445 + +val trinoVersion = providers.gradleProperty("trinoVersion") + .map { it.trim().toInt() } + .orElse(minTrinoVersion) + .get() + +// Validate version range +check(trinoVersion in minTrinoVersion..maxTrinoVersion) { + "Module ${project.path} supports Trino versions $minTrinoVersion-$maxTrinoVersion, " + + "but trinoVersion=$trinoVersion was specified. " + + "Please set '-PtrinoVersion=$minTrinoVersion' (or any version in the supported range)." } -val trinoVersion = resolvedTrinoVersion java { toolchain.languageVersion.set(JavaLanguageVersion.of(24)) @@ -52,6 +55,7 @@ dependencies { implementation(libs.commons.collections4) implementation(libs.commons.lang3) implementation("io.trino:trino-jdbc:$trinoVersion") + runtimeOnly("io.opentelemetry.semconv:opentelemetry-semconv:1.23.1-alpha") compileOnly(libs.airlift.resolver) compileOnly("io.trino:trino-spi:$trinoVersion") { exclude("org.apache.logging.log4j") diff --git a/trino-connector/trino-connector-440-445/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnector440.java b/trino-connector/trino-connector-440-445/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnector440.java new file mode 100644 index 0000000000..727a957372 --- /dev/null +++ b/trino-connector/trino-connector-440-445/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnector440.java @@ -0,0 +1,55 @@ +/* + * 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.gravitino.trino.connector; + +import io.trino.spi.connector.ConnectorMetadata; +import io.trino.spi.connector.ConnectorNodePartitioningProvider; +import io.trino.spi.connector.ConnectorSplitManager; +import org.apache.gravitino.trino.connector.catalog.CatalogConnectorContext; +import org.apache.gravitino.trino.connector.catalog.CatalogConnectorMetadata; +import org.apache.gravitino.trino.connector.catalog.CatalogConnectorMetadataAdapter; + +public class GravitinoConnector440 extends GravitinoConnector { + + public GravitinoConnector440(CatalogConnectorContext connectorContext) { + super(connectorContext); + } + + @Override + protected GravitinoMetadata createGravitinoMetadata( + CatalogConnectorMetadata catalogConnectorMetadata, + CatalogConnectorMetadataAdapter metadataAdapter, + ConnectorMetadata internalMetadata) { + return new GravitinoMetadata440(catalogConnectorMetadata, metadataAdapter, internalMetadata); + } + + @Override + public ConnectorSplitManager getSplitManager() { + ConnectorSplitManager splitManager = + catalogConnectorContext.getInternalConnector().getSplitManager(); + return new GravitinoSplitManager440(splitManager); + } + + @Override + public ConnectorNodePartitioningProvider getNodePartitioningProvider() { + ConnectorNodePartitioningProvider nodePartitioningProvider = + catalogConnectorContext.getInternalConnector().getNodePartitioningProvider(); + return new GravitinoNodePartitioningProvider440(nodePartitioningProvider); + } +} diff --git a/trino-connector/trino-connector-440-445/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory440.java b/trino-connector/trino-connector-440-445/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory440.java new file mode 100644 index 0000000000..f167dfad92 --- /dev/null +++ b/trino-connector/trino-connector-440-445/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory440.java @@ -0,0 +1,52 @@ +/* + * 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.gravitino.trino.connector; + +import org.apache.gravitino.client.GravitinoAdminClient; +import org.apache.gravitino.trino.connector.catalog.CatalogConnectorContext; +import org.apache.gravitino.trino.connector.system.GravitinoSystemConnector; +import org.apache.gravitino.trino.connector.system.storedprocedure.GravitinoStoredProcedureFactory; + +public class GravitinoConnectorFactory440 extends GravitinoConnectorFactory { + + public GravitinoConnectorFactory440(GravitinoAdminClient client) { + super(client); + } + + @Override + protected int getMinSupportTrinoSpiVersion() { + return 440; + } + + @Override + protected int getMaxSupportTrinoSpiVersion() { + return 445; + } + + @Override + protected GravitinoConnector createConnector(CatalogConnectorContext connectorContext) { + return new GravitinoConnector440(connectorContext); + } + + @Override + protected GravitinoSystemConnector createSystemConnector( + GravitinoStoredProcedureFactory storedProcedureFactory) { + return new GravitinoSystemConnector440(storedProcedureFactory); + } +} diff --git a/trino-connector/trino-connector-440-445/src/main/java/org/apache/gravitino/trino/connector/GravitinoMetadata440.java b/trino-connector/trino-connector-440-445/src/main/java/org/apache/gravitino/trino/connector/GravitinoMetadata440.java new file mode 100644 index 0000000000..afcf61bd60 --- /dev/null +++ b/trino-connector/trino-connector-440-445/src/main/java/org/apache/gravitino/trino/connector/GravitinoMetadata440.java @@ -0,0 +1,90 @@ +/* + * 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.gravitino.trino.connector; + +import io.airlift.slice.Slice; +import io.trino.spi.connector.ColumnMetadata; +import io.trino.spi.connector.ConnectorInsertTableHandle; +import io.trino.spi.connector.ConnectorMergeTableHandle; +import io.trino.spi.connector.ConnectorOutputMetadata; +import io.trino.spi.connector.ConnectorSession; +import io.trino.spi.connector.ConnectorTableHandle; +import io.trino.spi.connector.RetryMode; +import io.trino.spi.connector.SchemaTableName; +import io.trino.spi.statistics.ComputedStatistics; +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import org.apache.gravitino.trino.connector.catalog.CatalogConnectorMetadata; +import org.apache.gravitino.trino.connector.catalog.CatalogConnectorMetadataAdapter; +import org.apache.gravitino.trino.connector.metadata.GravitinoColumn; + +public class GravitinoMetadata440 extends GravitinoMetadata { + + public GravitinoMetadata440( + CatalogConnectorMetadata catalogConnectorMetadata, + CatalogConnectorMetadataAdapter metadataAdapter, + io.trino.spi.connector.ConnectorMetadata internalMetadata) { + super(catalogConnectorMetadata, metadataAdapter, internalMetadata); + } + + @Override + public void addColumn( + ConnectorSession session, ConnectorTableHandle tableHandle, ColumnMetadata column) { + GravitinoColumn gravitinoColumn = metadataAdapter.createColumn(column); + catalogConnectorMetadata.addColumn(getTableName(tableHandle), gravitinoColumn); + } + + @Override + public Optional<ConnectorOutputMetadata> finishInsert( + ConnectorSession session, + ConnectorInsertTableHandle insertHandle, + List<ConnectorTableHandle> sourceTableHandles, + Collection<Slice> fragments, + Collection<ComputedStatistics> computedStatistics) { + return internalMetadata.finishInsert( + session, + GravitinoHandle.unWrap(insertHandle), + sourceTableHandles.stream().map(GravitinoHandle::unWrap).collect(Collectors.toList()), + fragments, + computedStatistics); + } + + @Override + public ConnectorMergeTableHandle beginMerge( + ConnectorSession session, ConnectorTableHandle tableHandle, RetryMode retryMode) { + ConnectorMergeTableHandle connectorMergeTableHandle = + internalMetadata.beginMerge(session, GravitinoHandle.unWrap(tableHandle), retryMode); + SchemaTableName tableName = getTableName(tableHandle); + + return new GravitinoMergeTableHandle( + tableName.getSchemaName(), tableName.getTableName(), connectorMergeTableHandle); + } + + @Override + public void finishMerge( + ConnectorSession session, + ConnectorMergeTableHandle mergeTableHandle, + Collection<Slice> fragments, + Collection<ComputedStatistics> computedStatistics) { + internalMetadata.finishMerge( + session, GravitinoHandle.unWrap(mergeTableHandle), fragments, computedStatistics); + } +} diff --git a/trino-connector/trino-connector-440-445/src/main/java/org/apache/gravitino/trino/connector/GravitinoNodePartitioningProvider440.java b/trino-connector/trino-connector-440-445/src/main/java/org/apache/gravitino/trino/connector/GravitinoNodePartitioningProvider440.java new file mode 100644 index 0000000000..142cec1e40 --- /dev/null +++ b/trino-connector/trino-connector-440-445/src/main/java/org/apache/gravitino/trino/connector/GravitinoNodePartitioningProvider440.java @@ -0,0 +1,30 @@ +/* + * 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.gravitino.trino.connector; + +import io.trino.spi.connector.ConnectorNodePartitioningProvider; + +/** Trino NodePartitioningProvider implementation with the new split bucket function signature. */ +public class GravitinoNodePartitioningProvider440 extends GravitinoNodePartitioningProvider { + + public GravitinoNodePartitioningProvider440( + ConnectorNodePartitioningProvider nodePartitioningProvider) { + super(nodePartitioningProvider); + } +} diff --git a/trino-connector/trino-connector-440-445/src/main/java/org/apache/gravitino/trino/connector/GravitinoPlugin440.java b/trino-connector/trino-connector-440-445/src/main/java/org/apache/gravitino/trino/connector/GravitinoPlugin440.java new file mode 100644 index 0000000000..1e2918ecb7 --- /dev/null +++ b/trino-connector/trino-connector-440-445/src/main/java/org/apache/gravitino/trino/connector/GravitinoPlugin440.java @@ -0,0 +1,38 @@ +/* + * 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.gravitino.trino.connector; + +import org.apache.gravitino.client.GravitinoAdminClient; + +/** Trino plugin endpoint, using java spi mechanism */ +public class GravitinoPlugin440 extends GravitinoPlugin { + + public GravitinoPlugin440() { + super(); + } + + public GravitinoPlugin440(GravitinoAdminClient client) { + super(client); + } + + @Override + protected GravitinoConnectorFactory createConnectorFactory(GravitinoAdminClient client) { + return new GravitinoConnectorFactory440(client); + } +} diff --git a/trino-connector/trino-connector-440-445/src/main/java/org/apache/gravitino/trino/connector/GravitinoSplitManager440.java b/trino-connector/trino-connector-440-445/src/main/java/org/apache/gravitino/trino/connector/GravitinoSplitManager440.java new file mode 100644 index 0000000000..9170c85ce1 --- /dev/null +++ b/trino-connector/trino-connector-440-445/src/main/java/org/apache/gravitino/trino/connector/GravitinoSplitManager440.java @@ -0,0 +1,66 @@ +/* + * 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.gravitino.trino.connector; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.trino.spi.connector.ConnectorSplit; +import io.trino.spi.connector.ConnectorSplitManager; +import io.trino.spi.connector.ConnectorSplitSource; + +public class GravitinoSplitManager440 extends GravitinoSplitManager { + + public GravitinoSplitManager440(ConnectorSplitManager internalSplitManager) { + super(internalSplitManager); + } + + @Override + protected ConnectorSplitSource createSplitSource(ConnectorSplitSource splits) { + return new GravitinoSplitSource440(splits); + } + + static class GravitinoSplitSource440 extends GravitinoSplitSource { + + GravitinoSplitSource440(ConnectorSplitSource connectorSplitSource) { + super(connectorSplitSource); + } + + @Override + protected ConnectorSplit createSplit(ConnectorSplit split) { + return new GravitinoSplit440(split); + } + } + + public static class GravitinoSplit440 extends GravitinoSplit { + + @JsonCreator + public GravitinoSplit440(@JsonProperty(HANDLE_STRING) String handleString) { + super(handleString); + } + + public GravitinoSplit440(ConnectorSplit split) { + super(split); + } + + @Override + public Object getInfo() { + return getInternalHandle().getInfo(); + } + } +} diff --git a/trino-connector/trino-connector-440-445/src/main/java/org/apache/gravitino/trino/connector/GravitinoSystemConnector440.java b/trino-connector/trino-connector-440-445/src/main/java/org/apache/gravitino/trino/connector/GravitinoSystemConnector440.java new file mode 100644 index 0000000000..de902bd958 --- /dev/null +++ b/trino-connector/trino-connector-440-445/src/main/java/org/apache/gravitino/trino/connector/GravitinoSystemConnector440.java @@ -0,0 +1,87 @@ +/* + * 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.gravitino.trino.connector; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.trino.spi.Page; +import io.trino.spi.connector.ConnectorPageSource; +import io.trino.spi.connector.ConnectorPageSourceProvider; +import io.trino.spi.connector.ConnectorSplit; +import io.trino.spi.connector.ConnectorSplitManager; +import io.trino.spi.connector.SchemaTableName; +import org.apache.gravitino.trino.connector.system.GravitinoSystemConnector; +import org.apache.gravitino.trino.connector.system.storedprocedure.GravitinoStoredProcedureFactory; + +public class GravitinoSystemConnector440 extends GravitinoSystemConnector { + + public GravitinoSystemConnector440( + GravitinoStoredProcedureFactory gravitinoStoredProcedureFactory) { + super(gravitinoStoredProcedureFactory); + } + + @Override + protected ConnectorSplitManager createSplitManager() { + return new GravitinoSplitManager440(); + } + + @Override + protected ConnectorPageSourceProvider createPageSourceProvider() { + return new DatasourceProvider440(); + } + + static class DatasourceProvider440 extends DatasourceProvider { + + @Override + protected ConnectorPageSource createPageSource(Page page) { + return new SystemTablePageSource440(page); + } + } + + static class GravitinoSplitManager440 extends SplitManager { + + protected ConnectorSplit createSplit(SchemaTableName tableName) { + return new Split440(tableName); + } + } + + static class SystemTablePageSource440 extends SystemTablePageSource { + + public SystemTablePageSource440(Page page) { + super(page); + } + + public Page getNextPage() { + return nextPage(); + } + } + + public static class Split440 extends Split { + + @JsonCreator + public Split440(@JsonProperty("tableName") SchemaTableName tableName) { + super(tableName); + } + + @Override + public Object getInfo() { + return this; + } + } +} diff --git a/integration-test-common/docker-script/shutdown.sh b/trino-connector/trino-connector-440-445/src/main/resources/META-INF/services/io.trino.spi.Plugin old mode 100755 new mode 100644 similarity index 73% copy from integration-test-common/docker-script/shutdown.sh copy to trino-connector/trino-connector-440-445/src/main/resources/META-INF/services/io.trino.spi.Plugin index 90288834ff..07cffe209f --- a/integration-test-common/docker-script/shutdown.sh +++ b/trino-connector/trino-connector-440-445/src/main/resources/META-INF/services/io.trino.spi.Plugin @@ -1,4 +1,3 @@ -#!/bin/bash # # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file @@ -16,15 +15,5 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. - # -cd "$(dirname "$0")" - -LOG_DIR=../build/trino-ci-container-log -if [ -d $LOG_DIR ]; then - docker cp trino-ci-hive:/usr/local/hadoop/logs $LOG_DIR/hdfs - docker cp trino-ci-hive:/tmp/root $LOG_DIR/hive -fi - -export GRAVITINO_TRINO_CONNECTOR_DIR=/dev/null -docker compose down +org.apache.gravitino.trino.connector.GravitinoPlugin440 \ No newline at end of file diff --git a/trino-connector/trino-connector-440-445/src/test/java/TestGravitinoConnector440.java b/trino-connector/trino-connector-440-445/src/test/java/TestGravitinoConnector440.java new file mode 100644 index 0000000000..4f60b9e5ba --- /dev/null +++ b/trino-connector/trino-connector-440-445/src/test/java/TestGravitinoConnector440.java @@ -0,0 +1,59 @@ +/* + * 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. + */ + +import static io.trino.testing.TestingSession.testSessionBuilder; + +import io.trino.Session; +import io.trino.testing.DistributedQueryRunner; +import org.apache.gravitino.client.GravitinoAdminClient; +import org.apache.gravitino.trino.connector.GravitinoPlugin; +import org.apache.gravitino.trino.connector.GravitinoPlugin440; +import org.apache.gravitino.trino.connector.TestGravitinoConnector; +import org.apache.gravitino.trino.connector.TestGravitinoConnectorWithMetalakeCatalogName; +import org.junit.jupiter.api.Nested; + +public class TestGravitinoConnector440 { + @Nested + class SingleMetalake extends TestGravitinoConnector { + @Override + protected GravitinoPlugin createGravitinoPlugin(GravitinoAdminClient client) { + return new GravitinoPlugin440(client); + } + + @Override + protected DistributedQueryRunner createTrinoQueryRunner() throws Exception { + Session session = testSessionBuilder().setCatalog("gravitino").build(); + return DistributedQueryRunner.builder(session).setNodeCount(1).build(); + } + } + + @Nested + class MultiMetalake extends TestGravitinoConnectorWithMetalakeCatalogName { + @Override + protected GravitinoPlugin createGravitinoPlugin(GravitinoAdminClient client) { + return new GravitinoPlugin440(client); + } + + @Override + protected DistributedQueryRunner createTrinoQueryRunner() throws Exception { + Session session = testSessionBuilder().setCatalog("gravitino").build(); + return DistributedQueryRunner.builder(session).setNodeCount(1).build(); + } + } +} diff --git a/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoDynamicFilter.java b/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoDynamicFilter.java index 31c182e334..bfc4f430e1 100644 --- a/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoDynamicFilter.java +++ b/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoDynamicFilter.java @@ -23,6 +23,7 @@ import io.trino.spi.connector.DynamicFilter; import io.trino.spi.predicate.TupleDomain; import java.util.Set; import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; /** The GravitinoDynamicFilter is used to warp DynamicFilter */ class GravitinoDynamicFilter implements DynamicFilter { @@ -34,7 +35,9 @@ class GravitinoDynamicFilter implements DynamicFilter { @Override public Set<ColumnHandle> getColumnsCovered() { - return delegate.getColumnsCovered(); + return delegate.getColumnsCovered().stream() + .map(GravitinoHandle::unWrap) + .collect(Collectors.toSet()); } @Override diff --git a/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoSplitManager.java b/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoSplitManager.java index d3bdb1ecf0..b169f7b73d 100644 --- a/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoSplitManager.java +++ b/trino-connector/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoSplitManager.java @@ -55,7 +55,7 @@ public class GravitinoSplitManager implements ConnectorSplitManager { session, GravitinoHandle.unWrap(connectorTableHandle), new GravitinoDynamicFilter(dynamicFilter), - constraint); + new GravitinoConstraint(constraint)); return createSplitSource(splits); } diff --git a/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/GravitinoMockServer.java b/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/GravitinoMockServer.java index d8f5e0d35b..e578f7e23d 100644 --- a/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/GravitinoMockServer.java +++ b/trino-connector/trino-connector/src/test/java/org/apache/gravitino/trino/connector/GravitinoMockServer.java @@ -621,7 +621,8 @@ public class GravitinoMockServer implements AutoCloseable { } private void addColumn( - ConnectorMetadata metadata, ConnectorTableHandle tableHandle, ColumnMetadata columnMetadata) { + ConnectorMetadata metadata, ConnectorTableHandle tableHandle, ColumnMetadata columnMetadata) + throws TrinoException { if (trinoVersion < SPI_VERSION_SUPPORT_ADD_COLUMN_WITH_POSITION) { try { metadata @@ -634,7 +635,7 @@ public class GravitinoMockServer implements AutoCloseable { .invoke(metadata, null, tableHandle, columnMetadata); } catch (ReflectiveOperationException e) { if (e.getCause() instanceof TrinoException) { - throw new RuntimeException(e.getCause().getMessage(), e); + throw (TrinoException) e.getCause(); } throw new RuntimeException("Failed to invoke legacy addColumn by reflection", e); }
