There is unnecessary boilerplate required when using the Filter/Expression classes. Filter is no longer necessary; it (and FilterVector) can be replaced with Expression. Expression is sufficiently general that it can be subclassed to provide any custom functionality which would have been added through a GenericFilter (add some tests for this).
Additionally rows within RecordBatches yielded from a scan are not currently filtered using Expression::Evaluate(). (Add tests ensuring both row filtering and pruning obey Kleene logic)
Add some comments on the mechanism of Assume() too, and refactor it not to return a Result (its failure modes are covered by Validate())