Storage plugins may support specific set of operations that have corresponding Drill operators. The goal of this framework is to simplify the process of creating conversions from drill operators to plugin-specific operations (pushdowns).
A specific plugin that uses this framework, defines a list of pushdowns it supports. The framework will add all required rules based on this list to the planner, so if at any point of the planning process, the planner will find out that it is possible to do a specific optimization, corresponding part of the plan will be marked as plugin operation.
Storage plugin should define logic of converting specific operators to plugin expressions by implementing
org.apache.drill.exec.store.plan.PluginImplementor interface
(or extending org.apache.drill.exec.store.plan.AbstractPluginImplementor) class.
This implementation should have both canImplement(RelNode) and implement(PluginRel) methods
to be able to support specific pushdown. The first one checks whether it is possible to convert
the operation to plugin-specific expression, and the second one is responsible for the conversion itself.
Storage plugin should instantiate org.apache.drill.exec.store.StoragePluginRulesSupplier and specify for it
list of optimizations it wants to enable (it may be done configurable here), specify previously defined
implementation of org.apache.drill.exec.store.plan.PluginImplementor, and org.apache.calcite.plan.Convention
that includes plugin name.
This org.apache.drill.exec.store.StoragePluginRulesSupplier should be used in
AbstractStoragePlugin.getOptimizerRules() overridden method by calling
org.apache.drill.exec.store.StoragePluginRulesSupplier.getOptimizerRules()
Please use MongoStoragePlugin as an example, it supports almost all of supported optimizations.