Currently `Framework.getPlanner` allows you to pass in an array of `RuleSet` objects. You can then invoke these one by one to get multi-phase optimization.
A new `Program` interface generalizes `RuleSet`. It could, for instance, choose a different set of rules based on the input. It could invoke a particular planner engine (hep or volcano), and enable a particular set of traits. It could also invoke `RelNode` transformations that are ad hoc, not implemented in `RelOptRule`s.
One of the current `Framework.getPlanner` methods is now deprecated and will be removed before optiq-0.9; new code should use a version that passes a list of `Program`.