5#include <mutable/mutable-config.hpp>
10#include <unordered_map>
22namespace cnf {
struct CNF; }
52 returns<std::unique_ptr<DataModel>>::
53 crtp_args<const PlanTableSmallOrDense&, const PlanTableLargeAndSparse&>::
54 args<const QueryGraph&, Subproblem, const cnf::CNF&> { };
58 using estimate_join_all_tag::base_type::operator();
101 virtual std::unique_ptr<DataModel>
103 const std::size_t offset)
const = 0;
111 virtual std::unique_ptr<DataModel>
121 virtual std::unique_ptr<DataModel>
123 const cnf::CNF &condition)
const = 0;
126 template<
typename PlanTable>
127 std::unique_ptr<DataModel>
140 virtual double predict_number_distinct_values(
const DataModel &data)
const;
153 void dump(std::ostream &out)
const;
158 virtual void print(std::ostream &out)
const = 0;
163template<
typename Actual>
165 , estimate_join_all_tag::derived_type<Actual>
193 std::unique_ptr<DataModel> empty_model()
const override;
195 std::unique_ptr<DataModel>
197 std::unique_ptr<DataModel>
198 estimate_limit(
const QueryGraph &G,
const DataModel &data, std::size_t limit, std::size_t offset)
const override;
199 std::unique_ptr<DataModel>
200 estimate_grouping(
const QueryGraph &G,
const DataModel &data,
const std::vector<group_type> &groups)
const override;
201 std::unique_ptr<DataModel>
203 const cnf::CNF &condition)
const override;
205 template<
typename PlanTable>
206 std::unique_ptr<DataModel>
215 std::size_t predict_cardinality(
const DataModel &data)
const override;
218 void print(std::ostream &out)
const override;
251 mutable std::vector<char>
buf_;
253 mutable std::ostringstream
oss_;
285 std::unique_ptr<DataModel> empty_model()
const override;
287 std::unique_ptr<DataModel>
289 std::unique_ptr<DataModel>
290 estimate_limit(
const QueryGraph &G,
const DataModel &data, std::size_t limit, std::size_t offset)
const override;
291 std::unique_ptr<DataModel>
292 estimate_grouping(
const QueryGraph &G,
const DataModel &data,
const std::vector<group_type> &groups)
const override;
293 std::unique_ptr<DataModel>
295 const cnf::CNF &condition)
const override;
297 template<
typename PlanTable>
298 std::unique_ptr<DataModel>
306 std::size_t predict_cardinality(
const DataModel &data)
const override;
310 void print(std::ostream &out)
const override;
311 void buf_append(
const char *s)
const {
while (*s) buf_.emplace_back(*s++); }
313 buf_.reserve(buf_.size() + s.size());
314 buf_append(s.c_str());
316 const char *
buf_view()
const {
return buf_.data(); }
325 using SpnIdentifier = std::pair<ThreadSafePooledString, ThreadSafePooledString>;
326 using SpnJoin = std::pair<SpnIdentifier, SpnIdentifier>;
327 using table_spn_map = std::unordered_map<ThreadSafePooledString, std::reference_wrapper<const SpnWrapper>>;
341 : spns_(
std::move(spns))
342 , num_rows_(num_rows)
372 static std::pair<unsigned, bool> find_spn_id(
const SpnDataModel &data, SpnJoin &join);
380 static std::size_t max_frequency(
const SpnDataModel &data, SpnJoin &join);
395 std::unique_ptr<DataModel> empty_model()
const override;
397 std::unique_ptr<DataModel>
399 std::unique_ptr<DataModel>
400 estimate_limit(
const QueryGraph &G,
const DataModel &data, std::size_t limit, std::size_t offset)
const override;
401 std::unique_ptr<DataModel>
402 estimate_grouping(
const QueryGraph &G,
const DataModel &data,
const std::vector<group_type> &groups)
const override;
403 std::unique_ptr<DataModel>
405 const cnf::CNF &condition)
const override;
407 template<
typename PlanTable>
408 std::unique_ptr<DataModel>
417 std::size_t predict_cardinality(
const DataModel &data)
const override;
420 void print(std::ostream &out)
const override;
ThreadSafeStringPool::proxy_type ThreadSafePooledString
ThreadSafeStringPool::proxy_optional_type ThreadSafePooledOptionalString
data_model_exception is thrown if a DataModel implementation does not contain the requested informati...
data_model_exception(std::string message)
virtual std::unique_ptr< DataModel > estimate_filter(const QueryGraph &G, const DataModel &data, const cnf::CNF &filter) const =0
Applies a filter to a DataModel.
virtual std::unique_ptr< DataModel > estimate_grouping(const QueryGraph &G, const DataModel &data, const std::vector< group_type > &groups) const =0
Groups data in the DataModel.
virtual std::unique_ptr< DataModel > empty_model() const =0
Returns a DataModel representing the empty set.
std::unique_ptr< DataModel > estimate_join_all(const QueryGraph &G, const PlanTable &PT, Subproblem to_join, const cnf::CNF &condition) const
Compute a DataModel for the result of joining all DataSources in to_join by condition.
virtual std::unique_ptr< DataModel > estimate_scan(const QueryGraph &G, Subproblem P) const =0
Creates a DataModel for a single DataSource.
virtual std::unique_ptr< DataModel > estimate_limit(const QueryGraph &G, const DataModel &data, const std::size_t limit, const std::size_t offset) const =0
Extracts a subset from a DataModel.
M_LCOV_EXCL_START friend std::ostream & operator<<(std::ostream &out, const CardinalityEstimator &CE)
virtual std::unique_ptr< DataModel > estimate_join(const QueryGraph &G, const DataModel &left, const DataModel &right, const cnf::CNF &condition) const =0
Form a new DataModel by joining two DataModels.
virtual void print(std::ostream &out) const =0
virtual std::size_t predict_cardinality(const DataModel &data) const =0
std::pair< std::reference_wrapper< const ast::Expr >, ThreadSafePooledOptionalString > group_type
CartesianProductDataModel(std::size_t size)
void assign_to(Subproblem) override
Assigns this to the Subproblem s, i.e.
CartesianProductDataModel()=default
DummyEstimator that always returns the size of the cartesian product of the given subproblems.
CartesianProductEstimator()
CartesianProductEstimator(ThreadSafePooledString)
A DataModel describes a data set.
virtual void assign_to(Subproblem s)=0
Assigns this to the Subproblem s, i.e.
InjectionCardinalityDataModel & operator=(const InjectionCardinalityDataModel &other)=default
InjectionCardinalityDataModel(const InjectionCardinalityDataModel &)=default
InjectionCardinalityDataModel(InjectionCardinalityDataModel &&)=default
InjectionCardinalityDataModel & operator=(InjectionCardinalityDataModel &&other)=default
InjectionCardinalityDataModel(Subproblem S, std::size_t size)
void assign_to(Subproblem s) override
Assigns this to the Subproblem s, i.e.
InjectionCardinalityEstimator that estimates cardinalities based on a table that contains sizes for t...
const char * buf_view() const
std::unordered_map< ThreadSafePooledString, std::size_t > cardinality_table_
std::vector< char > buf_
buffer used to construct identifiers
InjectionCardinalityEstimator & operator=(InjectionCardinalityEstimator &&)=default
InjectionCardinalityEstimator(const InjectionCardinalityEstimator &)=delete
void buf_append(const std::string &s) const
~InjectionCardinalityEstimator()=default
CartesianProductEstimator fallback_
std::ostringstream oss_
buffer used to construct identifiers
void buf_append(const char *s) const
InjectionCardinalityEstimator(InjectionCardinalityEstimator &&)=default
An Operator represents an operation in a query plan.
This table represents all explored plans with their sub-plans, estimated size, cost,...
This table represents all explored plans with their sub-plans, estimated size, cost,...
The query graph represents all data sources and joins in a graph structure.
Implements a small and efficient set over integers in the range of 0 to 63 (including).
SpnDataModel(table_spn_map spns, std::size_t num_rows)
table_spn_map spns_
a map from table to Spn
void assign_to(Subproblem) override
Assigns this to the Subproblem s, i.e.
std::vector< std::size_t > max_frequencies_
the maximum frequencies of values of attributes to join
SpnEstimator that estimates cardinalities based on Sum-Product Networks.
std::unordered_map< ThreadSafePooledString, SpnWrapper * > table_to_spn_
the map from every table to its respective Spn, initially empty
ThreadSafePooledString name_of_database_
the name of the database, the estimator is built on
std::pair< SpnIdentifier, SpnIdentifier > SpnJoin
std::unordered_map< ThreadSafePooledString, std::reference_wrapper< const SpnWrapper > > table_spn_map
std::pair< ThreadSafePooledString, ThreadSafePooledString > SpnIdentifier
SpnEstimator(ThreadSafePooledString name_of_database)
A wrapper class for an Spn to be used in the context of databases.
A helper class to introduce a virtual method overload per type to a class hierarchy.
A CNF represents a conjunction of cnf::Clauses.
Learn an SPN on every table in the database that is currently in use.