* 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 "SubstraitToOmniPlan.h"
#include "memory/memory_pool.h"
namespace omniruntime {
class SubstraitToOmniPlanValidator {
public:
explicit SubstraitToOmniPlanValidator(mem::MemoryPool *pool)
: pool(pool), planConverter(confMap, std::nullopt, true) {}
bool Validate(const ::substrait::Plan &plan);
const std::vector<std::string> &GetValidateLog() const
{
return validateLog;
}
private:
bool Validate(const ::substrait::WriteRel &writeRel);
bool Validate(const ::substrait::FetchRel &fetchRel);
bool Validate(const ::substrait::TopNRel &topNRel);
bool Validate(const ::substrait::ExpandRel &expandRel);
bool Validate(const ::substrait::SortRel &sortRel);
bool Validate(const ::substrait::WindowRel &windowRel);
bool Validate(const ::substrait::SetRel &setRel);
bool Validate(const ::substrait::AggregateRel &aggRel);
bool Validate(const ::substrait::ProjectRel &projectRel);
bool Validate(const ::substrait::FilterRel &filterRel);
bool Validate(const ::substrait::JoinRel &joinRel);
bool Validate(const ::substrait::CrossRel &crossRel);
bool Validate(const ::substrait::ReadRel &readRel);
bool Validate(const ::substrait::Rel &rel);
bool Validate(const ::substrait::RelRoot &relRoot);
mem::MemoryPool *pool;
std::unordered_map<std::string, std::string> confMap = {};
SubstraitToOmniPlanConverter planConverter;
SubstraitOmniExprConverter *exprConverter_ = nullptr;
std::vector<std::string> validateLog;
bool ParseOmniType(const ::substrait::extensions::AdvancedExtension &extension, DataTypePtr &out);
bool ParseOmniType(const ::substrait::extensions::AdvancedExtension &extension, DataTypePtr &out, std::vector<DataTypeId> &excludes);
bool FlattenSingleLevel(const DataTypePtr &type, std::vector<DataTypePtr> &out, std::vector<DataTypeId> *excludes = nullptr);
bool ValidateRound(const ::substrait::Expression::ScalarFunction &scalarFunction, const DataTypesPtr &inputType);
bool ValidateExtractExpr(const std::vector<TypedExprPtr> ¶ms);
bool ValidateRegexExpr(const std::string &name, const ::substrait::Expression::ScalarFunction &scalarFunction);
bool ValidateScalarFunction(
const ::substrait::Expression::ScalarFunction &scalarFunction,
const DataTypesPtr &inputType);
bool ValidateCast(const ::substrait::Expression::Cast &castExpr, const DataTypesPtr &inputType);
bool ValidateExpression(const ::substrait::Expression &expression, const DataTypesPtr &inputType);
bool ValidateLiteral(const ::substrait::Expression_Literal &literal, const DataTypesPtr &inputType);
bool ValidateIfThen(const ::substrait::Expression_IfThen &ifThen, const DataTypesPtr &inputType);
bool ValidateSingularOrList(
const ::substrait::Expression::SingularOrList &singularOrList,
const DataTypesPtr &inputType);
void LogValidateMsg(const std::string &log)
{
validateLog.emplace_back(log);
}
};
}