From 238e35f218e23beca9dd8563b32c695d1df7db83 Mon Sep 17 00:00:00 2001 From: PHILO-HE Date: Wed, 14 Dec 2022 20:36:29 +0800 Subject: [PATCH] Support date type in SubstraitToVeloxPlan and hash function (#96) --- velox/functions/sparksql/Hash.cpp | 5 +++++ velox/substrait/SubstraitToVeloxPlan.cpp | 11 +++++++++++ velox/substrait/SubstraitToVeloxPlanValidator.cpp | 5 ----- velox/substrait/TypeUtils.h | 7 +++++++ 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/velox/functions/sparksql/Hash.cpp b/velox/functions/sparksql/Hash.cpp index 1110675fac18..e2b0ee04af09 100644 --- a/velox/functions/sparksql/Hash.cpp +++ b/velox/functions/sparksql/Hash.cpp @@ -106,6 +106,10 @@ uint32_t hashDouble(double input, uint32_t seed) { input == -0. ? 0 : *reinterpret_cast(&input), seed); } +uint32_t hashDate(Date input, uint32_t seed) { + return hashInt32(input.days(), seed); +} + class HashFunction final : public exec::VectorFunction { bool isDefaultNullBehavior() const final { return false; @@ -154,6 +158,7 @@ class HashFunction final : public exec::VectorFunction { CASE(VARBINARY, hashBytes, StringView); CASE(REAL, hashFloat, float); CASE(DOUBLE, hashDouble, double); + CASE(DATE, hashDate, int32_t); #undef CASE default: VELOX_NYI("Unsupported type for HASH(): {}", arg->type()->toString()); diff --git a/velox/substrait/SubstraitToVeloxPlan.cpp b/velox/substrait/SubstraitToVeloxPlan.cpp index c546ec51b506..5100bd6954af 100644 --- a/velox/substrait/SubstraitToVeloxPlan.cpp +++ b/velox/substrait/SubstraitToVeloxPlan.cpp @@ -1615,6 +1615,13 @@ void SubstraitVeloxPlanConverter::setFilterMap( setColInfoMap( functionName, colIdxVal, val, reverse, colInfoMap); break; + case TypeKind::DATE: + if (substraitLit) { + val = variant(Date(substraitLit.value().date())); + } + setColInfoMap( + functionName, colIdxVal, val, reverse, colInfoMap); + break; default: VELOX_NYI( "Subfield filters creation not supported for input type '{}'", @@ -1892,6 +1899,10 @@ connector::hive::SubfieldFilters SubstraitVeloxPlanConverter::mapToFilters( constructSubfieldFilters( colIdx, inputNameList[colIdx], colInfoMap[colIdx], filters); break; + case TypeKind::DATE: + constructSubfieldFilters( + colIdx, inputNameList[colIdx], colInfoMap[colIdx], filters); + break; default: VELOX_NYI( "Subfield filters creation not supported for input type '{}'", diff --git a/velox/substrait/SubstraitToVeloxPlanValidator.cpp b/velox/substrait/SubstraitToVeloxPlanValidator.cpp index ec108f0050d4..ed3d30bd8bfc 100644 --- a/velox/substrait/SubstraitToVeloxPlanValidator.cpp +++ b/velox/substrait/SubstraitToVeloxPlanValidator.cpp @@ -336,13 +336,8 @@ bool SubstraitToVeloxPlanValidator::validate( return false; } - // In velox, the supported hash type in projectNode is - // BOOLEAN, TINYINT, SMALLINT, INTEGER, BIGINT, VARCHAR, VARBINARY - // REAL, DOUBLE. Hash.cpp (L148 - L156) for (auto i = 0; i < types.size(); i++) { switch (types[i]->kind()) { - case TypeKind::DATE: - return false; case TypeKind::ARRAY: return false; default:; diff --git a/velox/substrait/TypeUtils.h b/velox/substrait/TypeUtils.h index 26499a5b85de..d5f9e7303fbc 100644 --- a/velox/substrait/TypeUtils.h +++ b/velox/substrait/TypeUtils.h @@ -60,6 +60,13 @@ struct RangeTraits { using NativeType = std::string; }; +template <> +struct RangeTraits { + using RangeType = common::BigintRange; + using MultiRangeType = common::BigintMultiRange; + using NativeType = int32_t; +}; + #endif /* RANGETRAITS_H */ } // namespace facebook::velox::substrait