Michael>If we want to calibrate A part of the question is "What should Aggregate#computeSelfCost return?"
A) There's an option to make that method abstract so every sub-class defines its own cost implementation. It might be sad, and it might look like a NLogN duplication all over the place. B) On the other hand, if there's a generic implementation in Aggregate class, then it should be aligned with Enumerable* / Bindable* / Cassandra* and so on costs. For instance, if EnumerableHashJoin uses "0.5 units per hashed cell", then Aggregate should use the same units, so the optimizer can properly tell the cost difference between EnumerableHashSemiJoin(A, B) vs EnumerableHashJoin(A, Aggregate(B)) Vladimir
