* 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 <google/protobuf/arena.h>
#include <string>
#include <typeinfo>
#include "velox/core/PlanNode.h"
#include "velox/type/Type.h"
#include "SubstraitExtensionCollector.h"
#include "VeloxToSubstraitExpr.h"
#include "substrait/algebra.pb.h"
#include "substrait/plan.pb.h"
namespace gluten {
class VeloxToSubstraitPlanConvertor {
public:
::substrait::Plan& toSubstrait(google::protobuf::Arena& arena, const core::PlanNodePtr& planNode);
private:
void toSubstrait(google::protobuf::Arena& arena, const core::PlanNodePtr& planNode, ::substrait::Rel* rel);
void toSubstrait(
google::protobuf::Arena& arena,
const std::shared_ptr<const core::FilterNode>& filterNode,
::substrait::FilterRel* filterRel);
void toSubstrait(
google::protobuf::Arena& arena,
const std::shared_ptr<const core::ValuesNode>& valuesNode,
::substrait::ReadRel* readRel);
void toSubstrait(
google::protobuf::Arena& arena,
const std::shared_ptr<const core::ProjectNode>& projectNode,
::substrait::ProjectRel* projectRel);
void toSubstrait(
google::protobuf::Arena& arena,
const std::shared_ptr<const core::AggregationNode>& aggregateNode,
::substrait::AggregateRel* aggregateRel);
void toSubstrait(
google::protobuf::Arena& arena,
const std::shared_ptr<const core::OrderByNode>& orderByNode,
::substrait::SortRel* sortRel);
void toSubstrait(
google::protobuf::Arena& arena,
const std::shared_ptr<const core::TopNNode>& topNNode,
::substrait::FetchRel* fetchRel);
const ::substrait::SortRel& processSortFields(
google::protobuf::Arena& arena,
const std::vector<core::FieldAccessTypedExprPtr>& sortingKeys,
const std::vector<core::SortOrder>& sortingOrders,
const RowTypePtr& inputType);
void toSubstrait(
google::protobuf::Arena& arena,
const std::shared_ptr<const core::LimitNode>& limitNode,
::substrait::FetchRel* fetchRel);
const core::PlanNodePtr& getSingleSource(const core::PlanNodePtr& node);
std::unique_ptr<VeloxToSubstraitExprConvertor> exprConvertor_;
std::shared_ptr<VeloxToSubstraitTypeConvertor> typeConvertor_;
SubstraitExtensionCollectorPtr extensionCollector_;
};
}