mutable
A Database System for Research and Fast Prototyping
Loading...
Searching...
No Matches
Catalog.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <concepts>
4#include <memory>
18#include <mutable/util/Pool.hpp>
20#include <type_traits>
21
22
23namespace {
24
25/*======================================================================================================================
26 * Factory helpers
27 *====================================================================================================================*/
28
29struct StoreFactory
30{
31 virtual ~StoreFactory() { }
32
33 virtual std::unique_ptr<m::Store> make(const m::Table&) const = 0;
34};
35
36template<typename T>
37requires std::derived_from<T, m::Store>
38struct ConcreteStoreFactory : StoreFactory
39{
40 std::unique_ptr<m::Store> make(const m::Table &tbl) const override { return std::make_unique<T>(tbl); }
41};
42
43struct CardinalityEstimatorFactory
44{
45 virtual ~CardinalityEstimatorFactory() { }
46
47 virtual std::unique_ptr<m::CardinalityEstimator> make(m::ThreadSafePooledString database) const = 0;
48};
49
50template<typename T>
51requires std::derived_from<T, m::CardinalityEstimator>
52struct ConcreteCardinalityEstimatorFactory : CardinalityEstimatorFactory
53{
54 std::unique_ptr<m::CardinalityEstimator> make(m::ThreadSafePooledString database) const override {
55 return std::make_unique<T>(std::move(database));
56 }
57};
58
59struct WasmEngineFactory
60{
61 virtual ~WasmEngineFactory() { }
62
63 virtual std::unique_ptr<m::WasmEngine> make() const = 0;
64};
65
66template<typename T>
67requires std::derived_from<T, m::WasmEngine>
68struct ConcreteWasmEngineFactory : WasmEngineFactory
69{
70 std::unique_ptr<m::WasmEngine> make() const override { return std::make_unique<T>(); }
71};
72
73struct BackendFactory
74{
75 virtual ~BackendFactory() { }
76
77 virtual std::unique_ptr<m::Backend> make() const = 0;
78};
79
80template<typename T>
81requires std::derived_from<T, m::Backend>
82struct ConcreteBackendFactory : BackendFactory
83{
84 std::unique_ptr<m::Backend> make() const override { return std::make_unique<T>(); }
85};
86
87struct ConcreteWasmBackendFactory : BackendFactory
88{
89 private:
90 std::unique_ptr<WasmEngineFactory> platform_factory_;
91
92 public:
93 ConcreteWasmBackendFactory(std::unique_ptr<WasmEngineFactory> platform_factory)
94 : platform_factory_(std::move(platform_factory))
95 { }
96
97 std::unique_ptr<m::Backend> make() const override {
98 return std::make_unique<m::WasmBackend>(platform_factory_->make());
99 }
100};
101
102struct DatabaseInstructionFactory
103{
104 virtual ~DatabaseInstructionFactory() { }
105
106 virtual std::unique_ptr<m::DatabaseInstruction> make(std::vector<std::string> args) const = 0;
107};
108
109template<typename T>
110requires std::derived_from<T, m::DatabaseInstruction>
111struct ConcreteDatabaseInstructionFactory : DatabaseInstructionFactory
112{
113 std::unique_ptr<m::DatabaseInstruction> make(std::vector<std::string> args) const override {
114 return std::make_unique<T>(std::move(args));
115 }
116};
117
118
119/*======================================================================================================================
120 * Components
121 *====================================================================================================================*/
122
123template<typename T>
124struct Component
125{
126 using type = T;
127
128 private:
129 const char *description_;
130 std::unique_ptr<T> instance_;
131
132 public:
133 Component(const char *description, std::unique_ptr<T> instance)
134 : description_(description), instance_(std::move(instance))
135 { }
136
137 Component(const char *description, T *instance)
138 : description_(description), instance_(instance)
139 { }
140
141 const char * description() const { return description_; }
142 T & operator*() const { return *instance_; }
143};
144
145template<typename T>
146struct ComponentSet
147{
148 using type = T;
149
150 private:
151 using map_t = std::unordered_map<m::ThreadSafePooledString, Component<T>>;
153 map_t components_;
155 typename map_t::iterator default_;
156
157 public:
158 void add(m::ThreadSafePooledString name, Component<T> &&component) {
159 auto it = components_.find(name);
160 if (it != components_.end())
161 throw std::invalid_argument("component with that name already exists");
162 it = components_.emplace_hint(it, std::move(name), std::move(component));
163 if (default_ == components_.end())
164 default_ = it;
165 }
166
167 void set_default(const m::ThreadSafePooledString &name) {
168 auto it = components_.find(name);
169 if (it == components_.end())
170 throw std::invalid_argument("component does not exist");
171 default_ = it;
172 }
173
174 bool has_default() const { return default_ != components_.end(); }
175
176 const m::ThreadSafePooledString & get_default_name() const { M_insist(has_default()); return default_->first; }
177 const char * get_default_description() const { return default_->second.description; }
178 T & get_default() const { M_insist(has_default()); return *default_->second; }
179
180 const char * get_description(const m::ThreadSafePooledString &name) const {
181 auto it = components_.find(name);
182 if (it == components_.end())
183 throw std::invalid_argument("component does not exist");
184 return it->second.description;
185 }
186
189 T & get(const m::ThreadSafePooledString &name) const {
190 auto it = components_.find(name);
191 if (it == components_.end())
192 throw std::invalid_argument("component does not exist");
193 return *it->second;
194 }
195
196 typename map_t::iterator begin() { return components_.begin(); }
197 typename map_t::iterator end() { return components_.end(); }
198 typename map_t::const_iterator begin() const { return components_.begin(); }
199 typename map_t::const_iterator end() const { return components_.end(); }
200 typename map_t::const_iterator cbegin() const { return components_.begin(); }
201 typename map_t::const_iterator cend() const { return components_.end(); }
202};
203
204}
205
206namespace m {
207
208/*======================================================================================================================
209 * Catalog
210 *====================================================================================================================*/
211
214struct M_EXPORT Catalog
215{
216 private:
219
221
222 std::unique_ptr<memory::Allocator> allocator_;
224 std::unordered_map<ThreadSafePooledString, Database*> databases_;
225 Database *database_in_use_ = nullptr;
226 std::unordered_map<ThreadSafePooledString, Function*> standard_functions_;
228
229 private:
230 Catalog();
231 Catalog(const Catalog&) = delete;
232 Catalog & operator=(const Catalog&) = delete;
233
234 public:
235 ~Catalog();
236
238 static Catalog & Get();
239
241 static void Clear() {
242 if (the_catalog_) {
243 for (auto DB : the_catalog_->databases_)
244 delete DB.second;
245 the_catalog_->databases_.clear();
246 the_catalog_->database_in_use_ = nullptr;
247 }
248 }
249
251 static void Destroy();
252
253 m::ArgParser & arg_parser() { return arg_parser_; }
254
256 std::size_t num_databases() const { return databases_.size(); }
257
259 ThreadSafeStringPool & get_pool() { return pool_; }
261 const ThreadSafeStringPool & get_pool() const { return pool_; }
262
264 Timer & timer() { return timer_; }
266 const Timer & timer() const { return timer_; }
267
269 memory::Allocator & allocator() { return *allocator_; }
271 const memory::Allocator & allocator() const { return *allocator_; }
272
274 ThreadSafePooledString pool(const char *str) const { return pool_(str); }
276 ThreadSafePooledString pool(std::string_view str) const { return pool_(str); }
277
278 /*===== Database =================================================================================================*/
281 Database & add_database(ThreadSafePooledString name);
283 Database & get_database(const ThreadSafePooledString &name) const { return *databases_.at(name); }
285 bool has_database(const ThreadSafePooledString &name) const { return databases_.contains(name); }
288 void drop_database(const ThreadSafePooledString &name);
290 void drop_database(const Database &db) { return drop_database(db.name); }
291
293 bool has_database_in_use() const { return database_in_use_ != nullptr; }
296 if (not has_database_in_use())
297 throw std::logic_error("no database currently in use");
298 return *database_in_use_;
299 }
301 const Database & get_database_in_use() const { return const_cast<Catalog*>(this)->get_database_in_use(); }
303 void set_database_in_use(Database &db) { database_in_use_ = &db; }
305 void unset_database_in_use() { database_in_use_ = nullptr; }
306
307 /*===== Functions ================================================================================================*/
310 const Function * get_function(const ThreadSafePooledString &name) const { return standard_functions_.at(name); }
311
312
313 /*------------------------------------------------------------------------------------------------------------------
314 * Components
315 *----------------------------------------------------------------------------------------------------------------*/
316 private:
317 ComponentSet<StoreFactory> stores_;
318 ComponentSet<storage::DataLayoutFactory> data_layouts_;
319 ComponentSet<CardinalityEstimatorFactory> cardinality_estimators_;
320 ComponentSet<pe::PlanEnumerator> plan_enumerators_;
321 ComponentSet<BackendFactory> backends_;
322 ComponentSet<CostFunction> cost_functions_;
323 ComponentSet<DatabaseInstructionFactory> instructions_;
324 ComponentSet<Scheduler> schedulers_;
325
326 using TableFactoryDecoratorCallback = std::function<std::unique_ptr<TableFactory>(std::unique_ptr<TableFactory>)>;
327 ComponentSet<TableFactoryDecoratorCallback> table_properties_; // stores callback functions that decorate a table with the given decorator
328
329 using PreOptimizationCallback = std::function<void(QueryGraph&)>;
330 ComponentSet<PreOptimizationCallback> pre_optimizations_;
331
332 using LogicalPostOptimizationCallback = std::function<std::unique_ptr<Producer>(std::unique_ptr<Producer>)>;
333 ComponentSet<LogicalPostOptimizationCallback> logical_post_optimizations_;
334
335 using PhysicalPostOptimizationCallback = std::function<std::unique_ptr<MatchBase>(std::unique_ptr<MatchBase>)>;
336 ComponentSet<PhysicalPostOptimizationCallback> physical_post_optimizations_;
337
338 public:
339 /*===== Stores ===================================================================================================*/
341 template<typename T>
342 requires std::derived_from<T, m::Store>
343 void register_store(ThreadSafePooledString name, const char *description = nullptr) {
344 auto c = Component<StoreFactory>(description, std::make_unique<ConcreteStoreFactory<T>>());
345 stores_.add(std::move(name), std::move(c));
346 }
348 void default_store(const ThreadSafePooledString &name) { stores_.set_default(name); }
350 bool has_default_store() const { return stores_.has_default(); }
352 std::unique_ptr<Store> create_store(const Table &tbl) const { return stores_.get_default().make(tbl); }
354 std::unique_ptr<Store> create_store(const ThreadSafePooledString &name, const Table &tbl) const {
355 return stores_.get(name).make(tbl);
356 }
358 const ThreadSafePooledString & default_store_name() const { return stores_.get_default_name(); }
359
360 auto stores_begin() { return stores_.begin(); }
361 auto stores_end() { return stores_.end(); }
362 auto stores_begin() const { return stores_.begin(); }
363 auto stores_end() const { return stores_.end(); }
364 auto stores_cbegin() const { return stores_.begin(); }
365 auto stores_cend() const { return stores_.end(); }
366
367 /*===== DataLayouts ==============================================================================================*/
369 void register_data_layout(ThreadSafePooledString name, std::unique_ptr<storage::DataLayoutFactory> data_layout,
370 const char *description = nullptr)
371 {
372 data_layouts_.add(std::move(name), Component<storage::DataLayoutFactory>(description, std::move(data_layout)));
373 }
375 void default_data_layout(const ThreadSafePooledString &name) { data_layouts_.set_default(name); }
377 bool has_default_data_layout() const { return data_layouts_.has_default(); }
379 storage::DataLayoutFactory & data_layout() const { return data_layouts_.get_default(); }
381 storage::DataLayoutFactory & data_layout(const ThreadSafePooledString &name) const { return data_layouts_.get(name); }
383 const m::ThreadSafePooledString & default_data_layout_name() const { return data_layouts_.get_default_name(); }
384
385 auto data_layouts_begin() { return data_layouts_.begin(); }
386 auto data_layouts_end() { return data_layouts_.end(); }
387 auto data_layouts_begin() const { return data_layouts_.begin(); }
388 auto data_layouts_end() const { return data_layouts_.end(); }
389 auto data_layouts_cbegin() const { return data_layouts_.begin(); }
390 auto data_layouts_cend() const { return data_layouts_.end(); }
391
392 /*===== CardinalityEstimators ====================================================================================*/
394 template<typename T>
395 requires std::derived_from<T, m::CardinalityEstimator>
396 void register_cardinality_estimator(ThreadSafePooledString name, const char *description = nullptr) {
397 auto c = Component<CardinalityEstimatorFactory>(
398 description,
399 std::make_unique<ConcreteCardinalityEstimatorFactory<T>>()
400 );
401 cardinality_estimators_.add(std::move(name), std::move(c));
402 }
403
405 void default_cardinality_estimator(const ThreadSafePooledString &name) { cardinality_estimators_.set_default(name); }
407 bool has_default_cardinality_estimator() const { return cardinality_estimators_.has_default(); }
409 std::unique_ptr<CardinalityEstimator> create_cardinality_estimator(ThreadSafePooledString database) const {
410 return cardinality_estimators_.get_default().make(std::move(database));
411 }
413 std::unique_ptr<CardinalityEstimator> create_cardinality_estimator(const ThreadSafePooledString &name,
414 ThreadSafePooledString database) const {
415 return cardinality_estimators_.get(name).make(std::move(database));
416 }
419 return cardinality_estimators_.get_default_name();
420 }
421
422 auto cardinality_estimators_begin() { return cardinality_estimators_.begin(); }
423 auto cardinality_estimators_end() { return cardinality_estimators_.end(); }
424 auto cardinality_estimators_begin() const { return cardinality_estimators_.begin(); }
425 auto cardinality_estimators_end() const { return cardinality_estimators_.end(); }
426 auto cardinality_estimators_cbegin() const { return cardinality_estimators_.begin(); }
427 auto cardinality_estimators_cend() const { return cardinality_estimators_.end(); }
428
429 /*===== Plan Enumerators =========================================================================================*/
431 void register_plan_enumerator(ThreadSafePooledString name, std::unique_ptr<pe::PlanEnumerator> PE,
432 const char *description = nullptr)
433 {
434 plan_enumerators_.add(std::move(name), Component<pe::PlanEnumerator>(description, std::move(PE)));
435 }
437 void default_plan_enumerator(const ThreadSafePooledString &name) { plan_enumerators_.set_default(name); }
439 bool has_default_plan_enumerator() const { return plan_enumerators_.has_default(); }
441 pe::PlanEnumerator & plan_enumerator() const { return plan_enumerators_.get_default(); }
443 pe::PlanEnumerator & plan_enumerator(const ThreadSafePooledString &name) const { return plan_enumerators_.get(name); }
445 const ThreadSafePooledString & default_plan_enumerator_name() const { return plan_enumerators_.get_default_name(); }
446
447 auto plan_enumerators_begin() { return plan_enumerators_.begin(); }
448 auto plan_enumerators_end() { return plan_enumerators_.end(); }
449 auto plan_enumerators_begin() const { return plan_enumerators_.begin(); }
450 auto plan_enumerators_end() const { return plan_enumerators_.end(); }
451 auto plan_enumerators_cbegin() const { return plan_enumerators_.begin(); }
452 auto plan_enumerators_cend() const { return plan_enumerators_.end(); }
453
454 /*===== Backends =================================================================================================*/
456 template<typename T>
457 requires std::derived_from<T, m::Backend>
458 void register_backend(ThreadSafePooledString name, const char *description = nullptr) {
459 auto c = Component<BackendFactory>(description, std::make_unique<ConcreteBackendFactory<T>>());
460 backends_.add(std::move(name), std::move(c));
461 }
463 template<typename T>
464 requires std::derived_from<T, m::WasmEngine>
465 void register_wasm_backend(ThreadSafePooledString name, const char *description = nullptr) {
466 auto c = Component<BackendFactory>(
467 description,
468 std::make_unique<ConcreteWasmBackendFactory>(std::make_unique<ConcreteWasmEngineFactory<T>>())
469 );
470 backends_.add(std::move(name), std::move(c));
471 }
473 void default_backend(const ThreadSafePooledString &name) { backends_.set_default(name); }
475 bool has_default_backend() const { return backends_.has_default(); }
477 std::unique_ptr<Backend> create_backend() const { return backends_.get_default().make(); }
479 std::unique_ptr<Backend> create_backend(const ThreadSafePooledString &name) const { return backends_.get(name).make(); }
481 const ThreadSafePooledString & default_backend_name() const { return backends_.get_default_name(); }
482
483 auto backends_begin() { return backends_.begin(); }
484 auto backends_end() { return backends_.end(); }
485 auto backends_begin() const { return backends_.begin(); }
486 auto backends_end() const { return backends_.end(); }
487 auto backends_cbegin() const { return backends_begin(); }
488 auto backends_cend() const { return backends_end(); }
489
490 /*===== CostFunction =============================================================================================*/
492 void register_cost_function(ThreadSafePooledString name, std::unique_ptr<CostFunction> CF,
493 const char *description = nullptr)
494 {
495 cost_functions_.add(std::move(name), Component<CostFunction>(description, std::move(CF)));
496 }
498 void default_cost_function(const ThreadSafePooledString &name) { cost_functions_.set_default(name); }
500 bool has_default_cost_function() const { return cost_functions_.has_default(); }
502 CostFunction & cost_function() const { return cost_functions_.get_default(); }
504 CostFunction & cost_function(const ThreadSafePooledString &name) const { return cost_functions_.get(name); }
506 const ThreadSafePooledString & default_cost_function_name() const { return cost_functions_.get_default_name(); }
507
508 auto cost_functions_begin() { return cost_functions_.begin(); }
509 auto cost_functions_end() { return cost_functions_.end(); }
510 auto cost_functions_begin() const { return cost_functions_.begin(); }
511 auto cost_functions_end() const { return cost_functions_.end(); }
512 auto cost_functions_cbegin() const { return cost_functions_begin(); }
513 auto cost_functions_cend() const { return cost_functions_end(); }
514
515 /*===== Instructions =============================================================================================*/
517 template<typename T>
518 requires std::derived_from<T, m::DatabaseInstruction>
519 void register_instruction(ThreadSafePooledString name, const char *description = nullptr) {
520 auto I = Component<DatabaseInstructionFactory>(
521 description,
522 std::make_unique<ConcreteDatabaseInstructionFactory<T>>()
523 );
524 instructions_.add(std::move(name), std::move(I));
525 }
528 std::unique_ptr<DatabaseInstruction> create_instruction(const ThreadSafePooledString &name,
529 const std::vector<std::string> &args) const
530 {
531 return instructions_.get(name).make(args);
532 }
533
534 auto instructions_begin() { return instructions_.begin(); }
535 auto instructions_end() { return instructions_.end(); }
536 auto instructions_begin() const { return instructions_.begin(); }
537 auto instructions_end() const { return instructions_.end(); }
538 auto instructions_cbegin() const { return instructions_.begin(); }
539 auto instructions_cend() const { return instructions_.end(); }
540
541 /*===== Schedulers =================================================================================================*/
543 void register_scheduler(ThreadSafePooledString name, std::unique_ptr<Scheduler> scheduler,
544 const char *description = nullptr)
545 {
546 schedulers_.add(std::move(name), Component<Scheduler>(description, std::move(scheduler)));
547 }
549 void default_scheduler(const ThreadSafePooledString &name) { schedulers_.set_default(name); }
551 bool has_default_scheduler() const { return schedulers_.has_default(); }
553 Scheduler & scheduler() const { return schedulers_.get_default(); }
555 Scheduler & scheduler(const ThreadSafePooledString &name) const { return schedulers_.get(name); }
557 const ThreadSafePooledString & default_scheduler_name() const { return schedulers_.get_default_name(); }
558
559 auto schedulers_begin() { return schedulers_.begin(); }
560 auto schedulers_end() { return schedulers_.end(); }
561 auto schedulers_begin() const { return schedulers_.begin(); }
562 auto schedulers_end() const { return schedulers_.end(); }
563 auto schedulers_cbegin() const { return schedulers_begin(); }
564 auto schedulers_cend() const { return schedulers_end(); }
565
566 /*===== Table Factories ==========================================================================================*/
567 private:
568 std::unique_ptr<TableFactory> table_factory_;
569
570 public:
572 std::unique_ptr<TableFactory> table_factory(std::unique_ptr<TableFactory> table_factory) {
573 return std::exchange(table_factory_, std::move(table_factory));
574 }
576 TableFactory & table_factory() const { return *table_factory_; }
577
580 template<class T>
581 requires std::derived_from<T, TableFactoryDecorator>
582 void register_table_property(ThreadSafePooledString name, const char *description = nullptr) {
583 table_properties_.add(
584 std::move(name),
585 Component<TableFactoryDecoratorCallback>(
586 description,
587 std::make_unique<TableFactoryDecoratorCallback>([](std::unique_ptr<TableFactory> table_factory){
588 return std::make_unique<T>(std::move(table_factory));
589 })
590 )
591 );
592 }
595 std::unique_ptr<TableFactory> apply_table_property(const ThreadSafePooledString &name,
596 std::unique_ptr<TableFactory> table_factory) const
597 {
598 return table_properties_.get(name).operator()(std::move(table_factory));
599 }
600
601 auto table_properties_begin() { return table_properties_.begin(); }
602 auto table_properties_end() { return table_properties_.end(); }
603 auto table_properties_begin() const { return table_properties_.begin(); }
604 auto table_properties_end() const { return table_properties_.end(); }
605 auto table_properties_cbegin() const { return table_properties_begin(); }
606 auto table_properties_cend() const { return table_properties_end(); }
607
608 /*===== Pre-Optimizations ========================================================================================*/
611 const char *description = nullptr)
612 {
613 pre_optimizations_.add(
614 std::move(name),
615 Component<PreOptimizationCallback>(
616 description,
617 std::make_unique<PreOptimizationCallback>(std::move(optimization))
618 )
619 );
620 }
621
622 auto pre_optimizations() { return range(pre_optimizations_.begin(), pre_optimizations_.end()); }
623 auto pre_optimizations_begin() { return pre_optimizations_.begin(); }
624 auto pre_optimizations_end() { return pre_optimizations_.end(); }
625 auto pre_optimizations_begin() const { return pre_optimizations_.begin(); }
626 auto pre_optimizations_end() const { return pre_optimizations_.end(); }
627 auto pre_optimizations_cbegin() const { return pre_optimizations_begin(); }
628 auto pre_optimizations_cend() const { return pre_optimizations_end(); }
629
630 /*===== Logical Post-Optimizations ===============================================================================*/
633 const char *description = nullptr)
634 {
635 logical_post_optimizations_.add(
636 std::move(name),
637 Component<LogicalPostOptimizationCallback>(
638 description,
639 std::make_unique<LogicalPostOptimizationCallback>(std::move(optimization))
640 )
641 );
642 }
643
645 return range(logical_post_optimizations_.begin(), logical_post_optimizations_.end());
646 }
647 auto logical_post_optimizations_begin() { return logical_post_optimizations_.begin(); }
648 auto logical_post_optimizations_end() { return logical_post_optimizations_.end(); }
649 auto logical_post_optimizations_begin() const { return logical_post_optimizations_.begin(); }
650 auto logical_post_optimizations_end() const { return logical_post_optimizations_.end(); }
651 auto logical_post_optimizations_cbegin() const { return logical_post_optimizations_begin(); }
652 auto logical_post_optimizations_cend() const { return logical_post_optimizations_end(); }
653
654 /*===== Physical Post-Optimizations ===============================================================================*/
657 const char *description = nullptr)
658 {
659 physical_post_optimizations_.add(
660 pool(name),
661 Component<PhysicalPostOptimizationCallback>(
662 description,
663 std::make_unique<PhysicalPostOptimizationCallback>(std::move(optimization))
664 )
665 );
666 }
667
669 return range(physical_post_optimizations_.begin(), physical_post_optimizations_.end());
670 }
671 auto physical_post_optimizations_begin() { return physical_post_optimizations_.begin(); }
672 auto physical_post_optimizations_end() { return physical_post_optimizations_.end(); }
673 auto physical_post_optimizations_begin() const { return physical_post_optimizations_.begin(); }
674 auto physical_post_optimizations_end() const { return physical_post_optimizations_.end(); }
675 auto physical_post_optimizations_cbegin() const { return physical_post_optimizations_begin(); }
676 auto physical_post_optimizations_cend() const { return physical_post_optimizations_end(); }
677};
678
679}
struct @5 args
A parser for command line arguments.
Definition: ArgParser.hpp:20
#define M_insist(...)
Definition: macro.hpp:129
M_EXPORT const version_info & get()
Definition: version.cpp:4
auto operator*(PrimitiveExpr< U, L > other) -> PrimitiveExpr< common_type_t< T, U >, L >
Multiplies this and other.
Definition: WasmDSL.hpp:2375
std::pair<::wasm::Expression *, std::list< std::shared_ptr< Bit > > > move()
Moves the underlying Binaryen ::wasm::Expression and the referenced bits out of this.
Definition: WasmDSL.hpp:1567
‍mutable namespace
Definition: Backend.hpp:10
T(x)
ThreadSafeStringPool::proxy_type ThreadSafePooledString
Definition: Pool.hpp:464
STL namespace.
The catalog contains all Databases and keeps track of all meta information of the database system.
Definition: Catalog.hpp:215
void register_plan_enumerator(ThreadSafePooledString name, std::unique_ptr< pe::PlanEnumerator > PE, const char *description=nullptr)
Registers a new PlanEnumerator with the given name.
Definition: Catalog.hpp:431
CostFunction & cost_function() const
Returns a reference to the default CostFunction.
Definition: Catalog.hpp:502
std::unique_ptr< CardinalityEstimator > create_cardinality_estimator(const ThreadSafePooledString &name, ThreadSafePooledString database) const
Creates a new CardinalityEstimator of name name.
Definition: Catalog.hpp:413
void register_cardinality_estimator(ThreadSafePooledString name, const char *description=nullptr)
Registers a new CardinalityEstimator with the given name.
Definition: Catalog.hpp:396
auto plan_enumerators_cend() const
Definition: Catalog.hpp:452
auto table_properties_end() const
Definition: Catalog.hpp:604
auto schedulers_end() const
Definition: Catalog.hpp:562
std::function< void(QueryGraph &)> PreOptimizationCallback
Definition: Catalog.hpp:329
auto backends_begin() const
Definition: Catalog.hpp:485
const memory::Allocator & allocator() const
Returns a reference to the memory::Allocator.
Definition: Catalog.hpp:271
auto stores_end()
Definition: Catalog.hpp:361
const Timer & timer() const
Returns the global Timer instance.
Definition: Catalog.hpp:266
ThreadSafePooledString pool(std::string_view str) const
Creates an internalized copy of the string str by adding it to the internal StringPool.
Definition: Catalog.hpp:276
auto logical_post_optimizations()
Definition: Catalog.hpp:644
auto cost_functions_end() const
Definition: Catalog.hpp:511
auto schedulers_cbegin() const
Definition: Catalog.hpp:563
ComponentSet< CardinalityEstimatorFactory > cardinality_estimators_
Definition: Catalog.hpp:319
void register_logical_post_optimization(ThreadSafePooledString name, LogicalPostOptimizationCallback optimization, const char *description=nullptr)
Registers a new logical post-optimization with the given name.
Definition: Catalog.hpp:632
const ThreadSafeStringPool & get_pool() const
Returns a reference to the StringPool.
Definition: Catalog.hpp:261
auto cost_functions_begin() const
Definition: Catalog.hpp:510
auto plan_enumerators_begin() const
Definition: Catalog.hpp:449
auto cost_functions_cbegin() const
Definition: Catalog.hpp:512
void default_cardinality_estimator(const ThreadSafePooledString &name)
Sets the default CardinalityEstimator to use.
Definition: Catalog.hpp:405
std::unordered_map< ThreadSafePooledString, Function * > standard_functions_
functions defined by the SQL standard
Definition: Catalog.hpp:226
auto physical_post_optimizations_cbegin() const
Definition: Catalog.hpp:675
auto cardinality_estimators_cend() const
Definition: Catalog.hpp:427
void drop_database(const Database &db)
Drops the Database db.
Definition: Catalog.hpp:290
auto data_layouts_cbegin() const
Definition: Catalog.hpp:389
void default_store(const ThreadSafePooledString &name)
Sets the default Store to use.
Definition: Catalog.hpp:348
auto backends_end() const
Definition: Catalog.hpp:486
ComponentSet< DatabaseInstructionFactory > instructions_
Definition: Catalog.hpp:323
ThreadSafeStringPool & get_pool()
Returns a reference to the StringPool.
Definition: Catalog.hpp:259
auto backends_end()
Definition: Catalog.hpp:484
ComponentSet< StoreFactory > stores_
Definition: Catalog.hpp:317
auto data_layouts_end()
Definition: Catalog.hpp:386
const ThreadSafePooledString & default_cardinality_estimator_name() const
Returns the name of the default CardinalityEstimator.
Definition: Catalog.hpp:418
Scheduler & scheduler(const ThreadSafePooledString &name) const
Returns a reference to the Scheduler with the given name.
Definition: Catalog.hpp:555
ComponentSet< BackendFactory > backends_
Definition: Catalog.hpp:321
ComponentSet< TableFactoryDecoratorCallback > table_properties_
Definition: Catalog.hpp:327
auto schedulers_begin() const
Definition: Catalog.hpp:561
auto plan_enumerators_begin()
Definition: Catalog.hpp:447
auto stores_cbegin() const
Definition: Catalog.hpp:364
Database & get_database_in_use()
Returns a reference to the Database that is currently in use, if any.
Definition: Catalog.hpp:295
ComponentSet< PhysicalPostOptimizationCallback > physical_post_optimizations_
Definition: Catalog.hpp:336
pe::PlanEnumerator & plan_enumerator(const ThreadSafePooledString &name) const
Returns a reference to the PlanEnumerator with the given name.
Definition: Catalog.hpp:443
void default_cost_function(const ThreadSafePooledString &name)
Sets the default CostFunction to use.
Definition: Catalog.hpp:498
auto physical_post_optimizations_begin()
Definition: Catalog.hpp:671
const ThreadSafePooledString & default_cost_function_name() const
Returns the name of the default CostFunction.
Definition: Catalog.hpp:506
void register_wasm_backend(ThreadSafePooledString name, const char *description=nullptr)
Registers a new WasmBackend using the given WasmEngine with the given name.
Definition: Catalog.hpp:465
Database & get_database(const ThreadSafePooledString &name) const
Returns the Database with the given name.
Definition: Catalog.hpp:283
memory::Allocator & allocator()
Returns a reference to the memory::Allocator.
Definition: Catalog.hpp:269
const m::ThreadSafePooledString & default_data_layout_name() const
Returns the name of the default DataLayoutFactory.
Definition: Catalog.hpp:383
auto stores_end() const
Definition: Catalog.hpp:363
ComponentSet< CostFunction > cost_functions_
Definition: Catalog.hpp:322
Catalog & operator=(const Catalog &)=delete
storage::DataLayoutFactory & data_layout(const ThreadSafePooledString &name) const
Returns a reference to the DataLayoutFactory with the given name.
Definition: Catalog.hpp:381
auto plan_enumerators_end()
Definition: Catalog.hpp:448
std::unique_ptr< Store > create_store(const Table &tbl) const
Creates a new Store for the given Table tbl.
Definition: Catalog.hpp:352
bool has_default_cardinality_estimator() const
Returns true iff the Catalog has a default CardinalityEstimator.
Definition: Catalog.hpp:407
ThreadSafeStringPool pool_
pool of strings
Definition: Catalog.hpp:223
auto stores_cend() const
Definition: Catalog.hpp:365
auto cardinality_estimators_end() const
Definition: Catalog.hpp:425
Database * database_in_use_
the currently used database
Definition: Catalog.hpp:225
auto instructions_end()
Definition: Catalog.hpp:535
auto physical_post_optimizations_cend() const
Definition: Catalog.hpp:676
void register_scheduler(ThreadSafePooledString name, std::unique_ptr< Scheduler > scheduler, const char *description=nullptr)
Registers a new Scheduler with the given name.
Definition: Catalog.hpp:543
auto schedulers_begin()
Definition: Catalog.hpp:559
void default_data_layout(const ThreadSafePooledString &name)
Sets the default DataLayoutFactory to use.
Definition: Catalog.hpp:375
std::unique_ptr< TableFactory > apply_table_property(const ThreadSafePooledString &name, std::unique_ptr< TableFactory > table_factory) const
Applies the TableFactoryDecorator corresponding to name to table_factory.
Definition: Catalog.hpp:595
bool has_database_in_use() const
Returns true if any Database is currently in use.
Definition: Catalog.hpp:293
void register_instruction(ThreadSafePooledString name, const char *description=nullptr)
Registers a new DatabaseInstruction with the given name.
Definition: Catalog.hpp:519
ThreadSafePooledString pool(const char *str) const
Creates an internalized copy of the string str by adding it to the internal StringPool.
Definition: Catalog.hpp:274
bool has_default_data_layout() const
Returns true iff the Catalog has a default DataLayoutFactory.
Definition: Catalog.hpp:377
auto pre_optimizations_cend() const
Definition: Catalog.hpp:628
ComponentSet< pe::PlanEnumerator > plan_enumerators_
Definition: Catalog.hpp:320
void register_table_property(ThreadSafePooledString name, const char *description=nullptr)
Registers a new TableFactoryDecorator with the given name.
Definition: Catalog.hpp:582
static Catalog & Get()
Return a reference to the single Catalog instance.
bool has_database(const ThreadSafePooledString &name) const
Returns true iff a Database with the given name exists.
Definition: Catalog.hpp:285
auto cardinality_estimators_cbegin() const
Definition: Catalog.hpp:426
auto data_layouts_end() const
Definition: Catalog.hpp:388
std::function< std::unique_ptr< Producer >(std::unique_ptr< Producer >)> LogicalPostOptimizationCallback
Definition: Catalog.hpp:332
auto pre_optimizations()
Definition: Catalog.hpp:622
auto plan_enumerators_end() const
Definition: Catalog.hpp:450
void register_backend(ThreadSafePooledString name, const char *description=nullptr)
Registers a new Backend with the given name.
Definition: Catalog.hpp:458
auto table_properties_end()
Definition: Catalog.hpp:602
std::unique_ptr< memory::Allocator > allocator_
our custom allocator
Definition: Catalog.hpp:222
bool has_default_plan_enumerator() const
Returns true iff the Catalog has a default PlanEnumerator.
Definition: Catalog.hpp:439
auto cardinality_estimators_begin() const
Definition: Catalog.hpp:424
auto stores_begin() const
Definition: Catalog.hpp:362
auto instructions_cbegin() const
Definition: Catalog.hpp:538
auto cost_functions_end()
Definition: Catalog.hpp:509
bool has_default_scheduler() const
Returns true iff the Catalog has a default Scheduler.
Definition: Catalog.hpp:551
std::size_t num_databases() const
Returns the number of Databases.
Definition: Catalog.hpp:256
auto physical_post_optimizations_begin() const
Definition: Catalog.hpp:673
auto physical_post_optimizations_end()
Definition: Catalog.hpp:672
const ThreadSafePooledString & default_store_name() const
Returns the name of the default Store.
Definition: Catalog.hpp:358
std::unique_ptr< DatabaseInstruction > create_instruction(const ThreadSafePooledString &name, const std::vector< std::string > &args) const
Returns a reference to the DatabaseInstruction with the given name.
Definition: Catalog.hpp:528
auto pre_optimizations_begin()
Definition: Catalog.hpp:623
auto schedulers_end()
Definition: Catalog.hpp:560
auto data_layouts_cend() const
Definition: Catalog.hpp:390
m::ArgParser arg_parser_
Definition: Catalog.hpp:220
std::function< std::unique_ptr< MatchBase >(std::unique_ptr< MatchBase >)> PhysicalPostOptimizationCallback
Definition: Catalog.hpp:335
std::unique_ptr< CardinalityEstimator > create_cardinality_estimator(ThreadSafePooledString database) const
Creates a new CardinalityEstimator.
Definition: Catalog.hpp:409
void register_store(ThreadSafePooledString name, const char *description=nullptr)
Registers a new Store with the given name.
Definition: Catalog.hpp:343
auto backends_cend() const
Definition: Catalog.hpp:488
const ThreadSafePooledString & default_plan_enumerator_name() const
Returns the name of the default PlanEnumerator.
Definition: Catalog.hpp:445
auto plan_enumerators_cbegin() const
Definition: Catalog.hpp:451
CostFunction & cost_function(const ThreadSafePooledString &name) const
Returns a reference to the CostFunction with the given name.
Definition: Catalog.hpp:504
void default_scheduler(const ThreadSafePooledString &name)
Sets the default Scheduler to use.
Definition: Catalog.hpp:549
void register_physical_post_optimization(const char *name, PhysicalPostOptimizationCallback optimization, const char *description=nullptr)
Registers a new physical post-optimization with the given name.
Definition: Catalog.hpp:656
Timer & timer()
Returns the global Timer instance.
Definition: Catalog.hpp:264
auto logical_post_optimizations_cbegin() const
Definition: Catalog.hpp:651
Scheduler & scheduler() const
Returns a reference to the default Scheduler.
Definition: Catalog.hpp:553
bool has_default_backend() const
Returns true iff the Catalog has a default Backend.
Definition: Catalog.hpp:475
const ThreadSafePooledString & default_backend_name() const
Returns the name of the default Backend.
Definition: Catalog.hpp:481
void default_plan_enumerator(const ThreadSafePooledString &name)
Sets the default PlanEnumerator to use.
Definition: Catalog.hpp:437
auto pre_optimizations_begin() const
Definition: Catalog.hpp:625
static void Clear()
Removes all content from the Catalog instance.
Definition: Catalog.hpp:241
auto instructions_begin() const
Definition: Catalog.hpp:536
auto schedulers_cend() const
Definition: Catalog.hpp:564
auto instructions_cend() const
Definition: Catalog.hpp:539
auto backends_cbegin() const
Definition: Catalog.hpp:487
static Catalog * the_catalog_
Singleton Catalog instance.
Definition: Catalog.hpp:218
auto logical_post_optimizations_end() const
Definition: Catalog.hpp:650
void register_pre_optimization(ThreadSafePooledString name, PreOptimizationCallback optimization, const char *description=nullptr)
Registers a new pre-optimization with the given name.
Definition: Catalog.hpp:610
auto pre_optimizations_end()
Definition: Catalog.hpp:624
auto physical_post_optimizations_end() const
Definition: Catalog.hpp:674
auto logical_post_optimizations_cend() const
Definition: Catalog.hpp:652
auto cardinality_estimators_begin()
Definition: Catalog.hpp:422
std::unique_ptr< Backend > create_backend(const ThreadSafePooledString &name) const
Returns a new Backend of name name.
Definition: Catalog.hpp:479
bool has_default_store() const
Returns true iff the Catalog has a default Store.
Definition: Catalog.hpp:350
void set_database_in_use(Database &db)
Sets the Database db as the Database that is currently in use.
Definition: Catalog.hpp:303
auto table_properties_begin()
Definition: Catalog.hpp:601
storage::DataLayoutFactory & data_layout() const
Returns a reference to the default DataLayoutFactory.
Definition: Catalog.hpp:379
const Function * get_function(const ThreadSafePooledString &name) const
Returns a reference to the Function with the given name.
Definition: Catalog.hpp:310
Catalog(const Catalog &)=delete
const ThreadSafePooledString & default_scheduler_name() const
Returns the name of the default Scheduler.
Definition: Catalog.hpp:557
const Database & get_database_in_use() const
Returns a reference to the Database that is currently in use, if any.
Definition: Catalog.hpp:301
auto table_properties_cend() const
Definition: Catalog.hpp:606
auto stores_begin()
Definition: Catalog.hpp:360
ComponentSet< LogicalPostOptimizationCallback > logical_post_optimizations_
Definition: Catalog.hpp:333
ComponentSet< storage::DataLayoutFactory > data_layouts_
Definition: Catalog.hpp:318
auto cost_functions_cend() const
Definition: Catalog.hpp:513
auto physical_post_optimizations()
Definition: Catalog.hpp:668
bool has_default_cost_function() const
Returns true iff the Catalog has a default CostFunction.
Definition: Catalog.hpp:500
auto cardinality_estimators_end()
Definition: Catalog.hpp:423
pe::PlanEnumerator & plan_enumerator() const
Returns a reference to the default PlanEnumerator.
Definition: Catalog.hpp:441
auto backends_begin()
Definition: Catalog.hpp:483
std::unique_ptr< Backend > create_backend() const
Returns a new Backend.
Definition: Catalog.hpp:477
auto data_layouts_begin() const
Definition: Catalog.hpp:387
static void Destroy()
Destroys the current Catalog instance.
void unset_database_in_use()
Unsets the Database that is currenly in use.
Definition: Catalog.hpp:305
ComponentSet< Scheduler > schedulers_
Definition: Catalog.hpp:324
std::unique_ptr< TableFactory > table_factory_
The TableFactory used to construct Tables.
Definition: Catalog.hpp:568
void register_cost_function(ThreadSafePooledString name, std::unique_ptr< CostFunction > CF, const char *description=nullptr)
Registers a new CostFunction with the given name.
Definition: Catalog.hpp:492
auto pre_optimizations_end() const
Definition: Catalog.hpp:626
auto data_layouts_begin()
Definition: Catalog.hpp:385
TableFactory & table_factory() const
Returns a reference to the stored TableFactory.
Definition: Catalog.hpp:576
std::function< std::unique_ptr< TableFactory >(std::unique_ptr< TableFactory >)> TableFactoryDecoratorCallback
Definition: Catalog.hpp:326
auto table_properties_cbegin() const
Definition: Catalog.hpp:605
void register_data_layout(ThreadSafePooledString name, std::unique_ptr< storage::DataLayoutFactory > data_layout, const char *description=nullptr)
Registers a new DataLayoutFactory with the given name.
Definition: Catalog.hpp:369
auto instructions_end() const
Definition: Catalog.hpp:537
ComponentSet< PreOptimizationCallback > pre_optimizations_
Definition: Catalog.hpp:330
auto table_properties_begin() const
Definition: Catalog.hpp:603
auto cost_functions_begin()
Definition: Catalog.hpp:508
auto logical_post_optimizations_begin() const
Definition: Catalog.hpp:649
m::ArgParser & arg_parser()
Definition: Catalog.hpp:253
auto logical_post_optimizations_end()
Definition: Catalog.hpp:648
Timer timer_
a global timer
Definition: Catalog.hpp:227
std::unordered_map< ThreadSafePooledString, Database * > databases_
the databases
Definition: Catalog.hpp:224
std::unique_ptr< Store > create_store(const ThreadSafePooledString &name, const Table &tbl) const
Creates a new Store of name name for the given Table tbl.
Definition: Catalog.hpp:354
void default_backend(const ThreadSafePooledString &name)
Sets the default Backend to use.
Definition: Catalog.hpp:473
auto instructions_begin()
Definition: Catalog.hpp:534
std::unique_ptr< TableFactory > table_factory(std::unique_ptr< TableFactory > table_factory)
Replaces the stored TableFactory with table_factory and returns the old TableFactory.
Definition: Catalog.hpp:572
auto pre_optimizations_cbegin() const
Definition: Catalog.hpp:627
auto logical_post_optimizations_begin()
Definition: Catalog.hpp:647
A Database is a set of Tables, Functions, and Statistics.
Definition: Schema.hpp:870
ThreadSafePooledString name
the name of the database
Definition: Schema.hpp:892
Defines a function.
Definition: Schema.hpp:828
The query graph represents all data sources and joins in a graph structure.
Definition: QueryGraph.hpp:172
The Scheduler handles the execution of all incoming queries.
Definition: Scheduler.hpp:15
The table factory creates Tables with all enabled decorators.
A table is a sorted set of attributes.
Definition: Schema.hpp:388
Collect timings of events.
Definition: Timer.hpp:17
This is the common interface for all memory allocators that support rewiring.
Definition: memory.hpp:18
An interface for all plan enumerators.
This is an interface for factories that compute particular DataLayouts for a given sequence of Types,...