blob: 23c287263ff7d01332b7fe21ea1d65ee73fc9fbe [file] [log] [blame]
/**
* 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.
**/
#ifndef QUICKSTEP_QUERY_OPTIMIZER_LOGICAL_PATTERN_MATCHER_HPP_
#define QUICKSTEP_QUERY_OPTIMIZER_LOGICAL_PATTERN_MATCHER_HPP_
#include <memory>
#include <type_traits>
#include "query_optimizer/logical/LogicalType.hpp"
namespace quickstep {
namespace optimizer {
namespace logical {
class Aggregate;
class BinaryJoin;
class CopyFrom;
class CreateTable;
class DeleteTuples;
class DropTable;
class Filter;
class HashJoin;
class InsertTuple;
class Join;
class MultiwayCartesianJoin;
class NestedLoopsJoin;
class Project;
class SetOperation;
class SharedSubplanReference;
class Sort;
class TableReference;
class TopLevelPlan;
class UpdateTable;
class WindowAggregate;
/** \addtogroup OptimizerLogical
* @{
*/
/**
* @brief Templated matcher for each Logical node class.
*
* @param LogicalClass The logical class for the logical node to be matched with.
* @param logical_types All the logical types of the logical class.
*/
template <class LogicalClass, LogicalType... logical_types>
class SomeLogicalNode {
public:
/**
* @brief Checks whether the object managed in \p logical is an instance
* of the template argument LogicalClass by checking whether
* it is one of types in the given template arguments logical_types.
*
* @param logical The logical node to be checked.
* @return True for a match; otherwise false.
*/
template <class OtherLogicalClass>
static bool Matches(const std::shared_ptr<const OtherLogicalClass> &logical) {
for (const LogicalType logical_type : kLogicalTypes) {
if (logical->getLogicalType() == logical_type) {
return true;
}
}
return false;
}
/**
* @brief Checks whether the object managed in \p logical is an instance
* of the template argument LogicalClass by checking whether
* it is one of types in the given template arguments logical_types,
* If true, it additionally casts \p logical to a std::shared_ptr
* \p cast_logical of the template argument LogicalClass.
*
* @param logical The logical node to be checked.
* @param cast_logical The cast logical node.
* @return True if the object managed in \p logical is an instance of LogicalClass.
*/
template <class OtherLogicalClass>
static bool MatchesWithConditionalCast(const std::shared_ptr<const OtherLogicalClass> &logical,
std::shared_ptr<const LogicalClass> *cast_logical) {
bool is_match = Matches(logical);
if (is_match) {
*cast_logical = std::static_pointer_cast<const LogicalClass>(logical);
}
return is_match;
}
private:
constexpr static LogicalType kLogicalTypes[] = {logical_types...};
};
template <class LogicalClass, LogicalType... logical_types>
constexpr LogicalType SomeLogicalNode<LogicalClass, logical_types...>::kLogicalTypes[];
// Specializations for all Logical classes.
using SomeAggregate = SomeLogicalNode<Aggregate, LogicalType::kAggregate>;
using SomeBinaryJoin = SomeLogicalNode<BinaryJoin,
LogicalType::kHashJoin,
LogicalType::kNestedLoopsJoin>;
using SomeCopyFrom = SomeLogicalNode<CopyFrom, LogicalType::kCopyFrom>;
using SomeCreateTable = SomeLogicalNode<CreateTable, LogicalType::kCreateTable>;
using SomeDeleteTuples = SomeLogicalNode<DeleteTuples, LogicalType::kDeleteTuples>;
using SomeDropTable = SomeLogicalNode<DropTable, LogicalType::kDropTable>;
using SomeFilter = SomeLogicalNode<Filter, LogicalType::kFilter>;
using SomeHashJoin = SomeLogicalNode<HashJoin, LogicalType::kHashJoin>;
using SomeInsertTuple = SomeLogicalNode<InsertTuple, LogicalType::kInsertTuple>;
using SomeJoin = SomeLogicalNode<Join,
LogicalType::kHashJoin,
LogicalType::kMultiwayCartesianJoin,
LogicalType::kNestedLoopsJoin>;
using SomeMultiwayCartesianJoin = SomeLogicalNode<MultiwayCartesianJoin, LogicalType::kMultiwayCartesianJoin>;
using SomeNestedLoopsJoin = SomeLogicalNode<NestedLoopsJoin, LogicalType::kNestedLoopsJoin>;
using SomeProject = SomeLogicalNode<Project, LogicalType::kProject>;
using SomeSetOperation = SomeLogicalNode<SetOperation, LogicalType::kSetOperation>;
using SomeSharedSubplanReference = SomeLogicalNode<SharedSubplanReference, LogicalType::kSharedSubplanReference>;
using SomeSort = SomeLogicalNode<Sort, LogicalType::kSort>;
using SomeTableReference = SomeLogicalNode<TableReference, LogicalType::kTableReference>;
using SomeTopLevelPlan = SomeLogicalNode<TopLevelPlan, LogicalType::kTopLevelPlan>;
using SomeUpdateTable = SomeLogicalNode<UpdateTable, LogicalType::kUpdateTable>;
using SomeWindowAggregate = SomeLogicalNode<WindowAggregate, LogicalType::kWindowAggregate>;
/** @} */
} // namespace logical
} // namespace optimizer
} // namespace quickstep
#endif /* QUERY_PLANNER_LOGICAL_PATTERN_MATCHER_HPP_ */