Generally determining when predicates are satisfyible with existing cache can be difficult. Is it possible that a partitioning strategy would make the most sense here, at least as a simplification?
That is rather than fully materializing a view, you could materialize it in partitions with a top level view accessing all of those partitions with a select or where clause partitioning that can then be used by the optimizer? This could be also be more easily automated based upon just knowing the partitioning strategy / values.
That's clever but the problem I see is that the partitioning strategy is data dependent. In order to apply this strategy, I would have to regularly create new materialized views and alter the top level view. That would eliminate internal materialized views but a clever use of external materialized views might work. I'll play around with this.