Build an item-level predicate from a FilterGroup. Returns null when
the tree itself is null - the consumer typically interprets null as
"no filtering, accept every item". For an empty root group, the returned
predicate evaluates true for every item (vacuous truth on and).