| # Generic storage plugin pushdown framework | |
| 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). | |
| ## How it works | |
| 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. | |
| ## How to use it | |
| 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. |