diff --git a/presto-native-execution/presto_cpp/main/connectors/HivePrestoToVeloxConnector.cpp b/presto-native-execution/presto_cpp/main/connectors/HivePrestoToVeloxConnector.cpp index 29b570602dc82..5c9c1acc1e935 100644 --- a/presto-native-execution/presto_cpp/main/connectors/HivePrestoToVeloxConnector.cpp +++ b/presto-native-execution/presto_cpp/main/connectors/HivePrestoToVeloxConnector.cpp @@ -226,81 +226,6 @@ velox::connector::hive::HiveBucketConversion toVeloxBucketConversion( return veloxBucketConversion; } -std::unique_ptr toHiveTableHandle( - const protocol::TupleDomain& domainPredicate, - const std::shared_ptr& remainingPredicate, - bool isPushdownFilterEnabled, - const std::string& tableName, - const protocol::List& dataColumns, - const protocol::TableHandle& tableHandle, - const protocol::Map& tableParameters, - const VeloxExprConverter& exprConverter, - const TypeParser& typeParser) { - common::SubfieldFilters subfieldFilters; - auto domains = domainPredicate.domains; - for (const auto& domain : *domains) { - auto filter = domain.second; - subfieldFilters[common::Subfield(domain.first)] = - toFilter(domain.second, exprConverter, typeParser); - } - - auto remainingFilter = exprConverter.toVeloxExpr(remainingPredicate); - if (auto constant = std::dynamic_pointer_cast( - remainingFilter)) { - bool value = constant->value().value(); - VELOX_CHECK(value, "Unexpected always-false remaining predicate"); - - // Use null for always-true filter. - remainingFilter = nullptr; - } - - RowTypePtr finalDataColumns; - if (!dataColumns.empty()) { - std::vector names; - std::vector types; - velox::type::fbhive::HiveTypeParser hiveTypeParser; - names.reserve(dataColumns.size()); - types.reserve(dataColumns.size()); - for (auto& column : dataColumns) { - std::string name = column.name; - folly::toLowerAscii(name); - names.emplace_back(std::move(name)); - auto parsedType = hiveTypeParser.parse(column.type); - // The type from the metastore may have upper case letters - // in field names, convert them all to lower case to be - // compatible with Presto. - types.push_back(VELOX_DYNAMIC_TYPE_DISPATCH( - fieldNamesToLowerCase, parsedType->kind(), parsedType)); - } - finalDataColumns = ROW(std::move(names), std::move(types)); - } - - if (tableParameters.empty()) { - return std::make_unique( - tableHandle.connectorId, - tableName, - isPushdownFilterEnabled, - std::move(subfieldFilters), - remainingFilter, - finalDataColumns); - } - - std::unordered_map finalTableParameters = {}; - finalTableParameters.reserve(tableParameters.size()); - for (const auto& [key, value] : tableParameters) { - finalTableParameters[key] = value; - } - - return std::make_unique( - tableHandle.connectorId, - tableName, - isPushdownFilterEnabled, - std::move(subfieldFilters), - remainingFilter, - finalDataColumns, - finalTableParameters); -} - } // namespace connector::hive::HiveColumnHandle::ColumnType toHiveColumnType( diff --git a/presto-native-execution/presto_cpp/main/connectors/PrestoToVeloxConnectorUtils.cpp b/presto-native-execution/presto_cpp/main/connectors/PrestoToVeloxConnectorUtils.cpp index 3845fa4ce7ad9..d03a214ed368f 100644 --- a/presto-native-execution/presto_cpp/main/connectors/PrestoToVeloxConnectorUtils.cpp +++ b/presto-native-execution/presto_cpp/main/connectors/PrestoToVeloxConnectorUtils.cpp @@ -15,6 +15,9 @@ #include "presto_cpp/main/connectors/PrestoToVeloxConnectorUtils.h" #include +#include "presto_cpp/main/types/TypeParser.h" +#include "velox/connectors/hive/TableHandle.h" +#include "velox/type/fbhive/HiveTypeParser.h" namespace facebook::presto { @@ -757,4 +760,75 @@ dwio::common::FileFormat toVeloxFileFormat( "Unsupported file format: {} {}", format.inputFormat, format.serDe); } +std::unique_ptr toHiveTableHandle( + const protocol::TupleDomain& domainPredicate, + const std::shared_ptr& remainingPredicate, + bool isPushdownFilterEnabled, + const std::string& tableName, + const protocol::List& dataColumns, + const protocol::TableHandle& tableHandle, + const protocol::Map& tableParameters, + const VeloxExprConverter& exprConverter, + const TypeParser& typeParser) { + common::SubfieldFilters subfieldFilters; + auto domains = domainPredicate.domains; + for (const auto& domain : *domains) { + auto filter = domain.second; + subfieldFilters[common::Subfield(domain.first)] = + toFilter(domain.second, exprConverter, typeParser); + } + + auto remainingFilter = exprConverter.toVeloxExpr(remainingPredicate); + if (auto constant = std::dynamic_pointer_cast( + remainingFilter)) { + bool value = constant->value().value(); + VELOX_CHECK(value, "Unexpected always-false remaining predicate"); + + remainingFilter = nullptr; + } + + RowTypePtr finalDataColumns; + if (!dataColumns.empty()) { + std::vector names; + std::vector types; + velox::type::fbhive::HiveTypeParser hiveTypeParser; + names.reserve(dataColumns.size()); + types.reserve(dataColumns.size()); + for (auto& column : dataColumns) { + std::string name = column.name; + folly::toLowerAscii(name); + names.emplace_back(std::move(name)); + auto parsedType = hiveTypeParser.parse(column.type); + types.push_back(VELOX_DYNAMIC_TYPE_DISPATCH( + fieldNamesToLowerCase, parsedType->kind(), parsedType)); + } + finalDataColumns = ROW(std::move(names), std::move(types)); + } + + if (tableParameters.empty()) { + return std::make_unique( + tableHandle.connectorId, + tableName, + isPushdownFilterEnabled, + std::move(subfieldFilters), + remainingFilter, + finalDataColumns); + } + + std::unordered_map finalTableParameters = {}; + finalTableParameters.reserve(tableParameters.size()); + for (const auto& [key, value] : tableParameters) { + finalTableParameters[key] = value; + } + + return std::make_unique( + tableHandle.connectorId, + tableName, + isPushdownFilterEnabled, + std::move(subfieldFilters), + remainingFilter, + finalDataColumns, + finalTableParameters); +} + } // namespace facebook::presto diff --git a/presto-native-execution/presto_cpp/main/connectors/PrestoToVeloxConnectorUtils.h b/presto-native-execution/presto_cpp/main/connectors/PrestoToVeloxConnectorUtils.h index 29adcc7c339f3..eb0085f2373ec 100644 --- a/presto-native-execution/presto_cpp/main/connectors/PrestoToVeloxConnectorUtils.h +++ b/presto-native-execution/presto_cpp/main/connectors/PrestoToVeloxConnectorUtils.h @@ -16,6 +16,7 @@ #include "presto_cpp/main/types/PrestoToVeloxExpr.h" #include "presto_cpp/presto_protocol/connector/hive/presto_protocol_hive.h" #include "presto_cpp/presto_protocol/core/presto_protocol_core.h" +#include "velox/connectors/Connector.h" #include "velox/dwio/common/Options.h" #include "velox/type/Filter.h" #include "velox/type/Type.h" @@ -48,4 +49,15 @@ velox::common::CompressionKind toFileCompressionKind( velox::dwio::common::FileFormat toVeloxFileFormat( const presto::protocol::hive::StorageFormat& format); +std::unique_ptr toHiveTableHandle( + const protocol::TupleDomain& domainPredicate, + const std::shared_ptr& remainingPredicate, + bool isPushdownFilterEnabled, + const std::string& tableName, + const protocol::List& dataColumns, + const protocol::TableHandle& tableHandle, + const protocol::Map& tableParameters, + const VeloxExprConverter& exprConverter, + const TypeParser& typeParser); + } // namespace facebook::presto