blob: 653e1154a98d7de73b0502eb36f454703cd9ec1d [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 QUERY_OPTIMIZER_COST_MODEL_SIMPLE_COST_MODEL_HPP_
#define QUERY_OPTIMIZER_COST_MODEL_SIMPLE_COST_MODEL_HPP_
#include <cstddef>
#include <vector>
#include "query_optimizer/cost_model/CostModel.hpp"
#include "query_optimizer/physical/Aggregate.hpp"
#include "query_optimizer/physical/CrossReferenceCoalesceAggregate.hpp"
#include "query_optimizer/physical/NestedLoopsJoin.hpp"
#include "query_optimizer/physical/FilterJoin.hpp"
#include "query_optimizer/physical/HashJoin.hpp"
#include "query_optimizer/physical/Physical.hpp"
#include "query_optimizer/physical/Selection.hpp"
#include "query_optimizer/physical/Sort.hpp"
#include "query_optimizer/physical/TableGenerator.hpp"
#include "query_optimizer/physical/TableReference.hpp"
#include "query_optimizer/physical/TopLevelPlan.hpp"
#include "query_optimizer/physical/UnionAll.hpp"
#include "query_optimizer/physical/WindowAggregate.hpp"
#include "utility/Macros.hpp"
namespace quickstep {
namespace optimizer {
namespace cost {
/** \addtogroup CostModel
* @{
*/
/**
* @brief A simple cost model.
*/
class SimpleCostModel : public CostModel {
public:
/**
* @brief Constructor.
*/
explicit SimpleCostModel(const std::vector<physical::PhysicalPtr> &shared_subplans)
: shared_subplans_(shared_subplans) {}
std::size_t estimateCardinality(
const physical::PhysicalPtr &physical_plan) override;
private:
// Returns the estimated cardinality of the input plan.
std::size_t estimateCardinalityForTopLevelPlan(
const physical::TopLevelPlanPtr &physical_plan);
// Returns the estimated cardinality of the relation.
std::size_t estimateCardinalityForTableReference(
const physical::TableReferencePtr &physical_plan);
// Returns the estimated cardinality of the input plan.
std::size_t estimateCardinalityForSelection(
const physical::SelectionPtr &physical_plan);
// Returns the estimated cardinality of the input plan.
std::size_t estimateCardinalityForTableGenerator(
const physical::TableGeneratorPtr &physical_plan);
// Returns the estimated cardinality as K if there is a LIMIT K clause,
// otherwise returns the estimated cardinality of the input plan.
std::size_t estimateCardinalityForSort(
const physical::SortPtr &physical_plan);
// Returns the left child's cardinality
std::size_t estimateCardinalityForFilterJoin(
const physical::FilterJoinPtr &physical_plan);
// Returns the larger value of the estimated cardinalities of two
// input plans.
std::size_t estimateCardinalityForHashJoin(
const physical::HashJoinPtr &physical_plan);
// Returns the larger value of the estimated cardinalities of two
// input plans.
std::size_t estimateCardinalityForNestedLoopsJoin(
const physical::NestedLoopsJoinPtr &physical_plan);
// Returns 1 for a scalar aggregation; otherwise, returns the estimated
// cardinality of the input plan divided by 10.
std::size_t estimateCardinalityForAggregate(
const physical::AggregatePtr &physical_plan);
// Returns the cardinality of the left child plan.
std::size_t estimateCardinalityForCrossReferenceCoalesceAggregate(
const physical::CrossReferenceCoalesceAggregatePtr &physical_plan);
// Return the estimated cardinality of the input plan.
std::size_t estimateCardinalityForWindowAggregate(
const physical::WindowAggregatePtr &physical_plan);
// Return the estimated cardinality of union all operation,
// which is the sum of the cardinality of all children operators.
std::size_t estimateCardinalityForUnionAll(
const physical::UnionAllPtr &physical_plan);
const std::vector<physical::PhysicalPtr> &shared_subplans_;
DISALLOW_COPY_AND_ASSIGN(SimpleCostModel);
};
/** @} */
} // namespace cost
} // namespace optimizer
} // namespace quickstep
#endif /* QUERY_OPTIMIZER_COST_MODEL_SIMPLE_COST_MODEL_HPP_ */