@@ -327,6 +327,12 @@ struct M_EXPORT Catalog
327
327
using TableFactoryDecoratorCallback = std::function<std::unique_ptr<TableFactory>(std::unique_ptr<TableFactory>)>;
328
328
ComponentSet<TableFactoryDecoratorCallback> table_properties_; // stores callback functions that decorate a table with the given decorator
329
329
330
+ using PreOptimizationCallback = std::function<void (const QueryGraph &)>;
331
+ ComponentSet<PreOptimizationCallback> pre_optimizations_;
332
+
333
+ using PostOptimizationCallback = std::function<std::unique_ptr<Producer>(std::unique_ptr<Producer>)>;
334
+ ComponentSet<PostOptimizationCallback> post_optimizations_;
335
+
330
336
public:
331
337
/* ===== Stores ===================================================================================================*/
332
338
/* * Registers a new `Store` with the given `name`. */
@@ -592,6 +598,42 @@ struct M_EXPORT Catalog
592
598
auto table_properties_end () const { return table_properties_.end (); }
593
599
auto table_properties_cbegin () const { return table_properties_begin (); }
594
600
auto table_properties_cend () const { return table_properties_end (); }
601
+
602
+ /* ===== Pre-Optimizations ========================================================================================*/
603
+ /* * Registers a new pre-optimization with the given `name`. */
604
+ void register_pre_optimization (const char *name, PreOptimizationCallback optimization, const char *description = nullptr )
605
+ {
606
+ pre_optimizations_.add (
607
+ pool (name),
608
+ Component<PreOptimizationCallback>(description, std::make_unique<PreOptimizationCallback>(std::move (optimization)))
609
+ );
610
+ }
611
+
612
+ auto pre_optimizations () { return range (pre_optimizations_.begin (), pre_optimizations_.end ()); }
613
+ auto pre_optimizations_begin () { return pre_optimizations_.begin (); }
614
+ auto pre_optimizations_end () { return pre_optimizations_.end (); }
615
+ auto pre_optimizations_begin () const { return pre_optimizations_.begin (); }
616
+ auto pre_optimizations_end () const { return pre_optimizations_.end (); }
617
+ auto pre_optimizations_cbegin () const { return pre_optimizations_begin (); }
618
+ auto pre_optimizations_cend () const { return pre_optimizations_end (); }
619
+
620
+ /* ===== Post-Optimizations ========================================================================================*/
621
+ /* * Registers a new post-optimization with the given `name`. */
622
+ void register_post_optimization (const char *name, PostOptimizationCallback optimization, const char *description = nullptr )
623
+ {
624
+ post_optimizations_.add (
625
+ pool (name),
626
+ Component<PostOptimizationCallback>(description, std::make_unique<PostOptimizationCallback>(std::move (optimization)))
627
+ );
628
+ }
629
+
630
+ auto post_optimizations () { return range (post_optimizations_.begin (), post_optimizations_.end ()); }
631
+ auto post_optimizations_begin () { return post_optimizations_.begin (); }
632
+ auto post_optimizations_end () { return post_optimizations_.end (); }
633
+ auto post_optimizations_begin () const { return post_optimizations_.begin (); }
634
+ auto post_optimizations_end () const { return post_optimizations_.end (); }
635
+ auto post_optimizations_cbegin () const { return post_optimizations_begin (); }
636
+ auto post_optimizations_cend () const { return post_optimizations_end (); }
595
637
};
596
638
597
639
}
0 commit comments