cpp/velox/substrait/SubstraitToVeloxPlanValidator.h (62 lines of code) (raw):

/* * 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. */ #pragma once #include "SubstraitToVeloxPlan.h" #include "velox/core/QueryCtx.h" using namespace facebook; namespace gluten { /// This class is used to validate whether the computing of /// a Substrait plan is supported in Velox. class SubstraitToVeloxPlanValidator { public: SubstraitToVeloxPlanValidator(memory::MemoryPool* pool) : planConverter_(pool, {}, std::nullopt, true) { const std::unordered_map<std::string, std::string> configs{ {velox::core::QueryConfig::kSparkPartitionId, "0"}, {velox::core::QueryConfig::kSessionTimezone, "GMT"}}; queryCtx_ = velox::core::QueryCtx::create(nullptr, velox::core::QueryConfig(configs)); // An execution context used for function validation. execCtx_ = std::make_unique<velox::core::ExecCtx>(pool, queryCtx_.get()); } /// Used to validate whether the computing of this Plan is supported. bool validate(const ::substrait::Plan& plan); const std::vector<std::string>& getValidateLog() const { return validateLog_; } private: /// Used to validate whether the computing of this Write is supported. bool validate(const ::substrait::WriteRel& writeRel); /// Used to validate whether the computing of this Limit is supported. bool validate(const ::substrait::FetchRel& fetchRel); /// Used to validate whether the computing of this TopN is supported. bool validate(const ::substrait::TopNRel& topNRel); /// Used to validate whether the computing of this Expand is supported. bool validate(const ::substrait::ExpandRel& expandRel); /// Used to validate whether the computing of this Generate is supported. bool validate(const ::substrait::GenerateRel& generateRel); /// Used to validate whether the computing of this Sort is supported. bool validate(const ::substrait::SortRel& sortRel); /// Used to validate whether the computing of this Window is supported. bool validate(const ::substrait::WindowRel& windowRel); /// Used to validate whether the computing of this WindowGroupLimit is supported. bool validate(const ::substrait::WindowGroupLimitRel& windowGroupLimitRel); /// Used to validate whether the computing of this Set is supported. bool validate(const ::substrait::SetRel& setRel); /// Used to validate whether the computing of this Aggregation is supported. bool validate(const ::substrait::AggregateRel& aggRel); /// Used to validate whether the computing of this Project is supported. bool validate(const ::substrait::ProjectRel& projectRel); /// Used to validate whether the computing of this Filter is supported. bool validate(const ::substrait::FilterRel& filterRel); /// Used to validate Join. bool validate(const ::substrait::JoinRel& joinRel); /// Used to validate Cartesian product. bool validate(const ::substrait::CrossRel& crossRel); /// Used to validate whether the computing of this Read is supported. bool validate(const ::substrait::ReadRel& readRel); /// Used to validate whether the computing of this Rel is supported. bool validate(const ::substrait::Rel& rel); /// Used to validate whether the computing of this RelRoot is supported. bool validate(const ::substrait::RelRoot& relRoot); std::shared_ptr<velox::core::QueryCtx> queryCtx_; /// An execution context used for function validation. std::unique_ptr<core::ExecCtx> execCtx_; /// A converter used to convert Substrait plan into Velox's plan node. SubstraitToVeloxPlanConverter planConverter_; /// An expression converter used to convert Substrait representations into /// Velox expressions. SubstraitVeloxExprConverter* exprConverter_ = nullptr; std::vector<std::string> validateLog_; /// Used to get types from advanced extension and validate them, then convert to a Velox type that has arbitrary /// levels of nesting. bool parseVeloxType(const ::substrait::extensions::AdvancedExtension& extension, TypePtr& out); /// Flattens a Velox type with single level of nesting into a std::vector of child types. bool flattenSingleLevel(const TypePtr& type, std::vector<TypePtr>& out); /// Flattens a Velox type with two level of nesting into a dual-nested std::vector of child types. bool flattenDualLevel(const TypePtr& type, std::vector<std::vector<TypePtr>>& out); /// Validate aggregate rel. bool validateAggRelFunctionType(const ::substrait::AggregateRel& substraitAgg); /// Validate the round scalar function. bool validateRound(const ::substrait::Expression::ScalarFunction& scalarFunction, const RowTypePtr& inputType); /// Validate extract function. bool validateExtractExpr(const std::vector<core::TypedExprPtr>& params); /// Validates regex functions. /// Ensures the second pattern argument is a literal string. /// Check if the pattern can pass with RE2 compilation. bool validateRegexExpr(const std::string& name, const ::substrait::Expression::ScalarFunction& scalarFunction); /// Validate Substrait scarlar function. bool validateScalarFunction( const ::substrait::Expression::ScalarFunction& scalarFunction, const RowTypePtr& inputType); /// Validate Substrait Cast expression. bool validateCast(const ::substrait::Expression::Cast& castExpr, const RowTypePtr& inputType); /// Validate Substrait expression. bool validateExpression(const ::substrait::Expression& expression, const RowTypePtr& inputType); /// Validate Substrait if-then expression. bool validateIfThen(const ::substrait::Expression_IfThen& ifThen, const RowTypePtr& inputType); /// Validate Substrait IN expression. bool validateSingularOrList( const ::substrait::Expression::SingularOrList& singularOrList, const RowTypePtr& inputType); /// Add necessary log for fallback void logValidateMsg(const std::string& log) { validateLog_.emplace_back(log); } bool isAllowedCast(const TypePtr& fromType, const TypePtr& toType); }; } // namespace gluten