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.