Some clean-ups to planner rules; convert never returns null; rename convert(RelTrait,List<RelNode>) to convertList(List<RelNode>,RelTraitSet).
Implement EXPLAIN.
Table statistics. Add method Table.getStatistic(), so a table and provide row-count and number of distinct values per column, if it knows them. Add Statistics class, with some helper methods. Restructure ArrayTable to store number of distinct values per column.

Add ImmutableIntList. Like ArrayList<Integer>, but immutable and memory-efficient.

Add RelNode.isKey(BitSet); also slightly change the interpretation of RelNode.isDistinct(). It now returns whether rows are distinct FOR ANY REASON. If you want to find out whether your UNION, EXCEPT or INTERSECT had an ALL flag, use the 'all' field, don't use !isDistinct().
Remove some uses of openjava.mop.Environment.
Remove some more OpenJava dependencies.
Split out base class, Prepare, of OJPreparingStmt, and use wherever possible. Now, only OJ code depends on package org.eigenbase.oj.stmt.
Remove redundant imports.