public static PredicateTreeAnalyzerResult analyzePredicateTree(Predicate predicate) {
        AnalyzerContext context = new AnalyzerContext();
        int treeSize = aggregatePredicateStatistics(predicate, false, context);
        int minFeature = ((int)Math.ceil(findMinFeature(predicate, false, context))) + (context.hasNegationPredicate ? 1 : 0);
        return new PredicateTreeAnalyzerResult(minFeature, treeSize, context.subTreeSizes);
    }
@Test
    void require_that_minvalue_feature_set_considers_all_values() {
        {
            Predicate p =
                    and(
                            feature("foo").inSet("A", "B"),
                            feature("foo").inSet("B"));
            PredicateTreeAnalyzerResult r = PredicateTreeAnalyzer.analyzePredicateTree(p);
            assertEquals(1, r.minFeature);
            assertEquals(2, r.treeSize);
        }
        {
            Predicate p =
                    and(
                            feature("foo").inSet("A", "B"),
                            feature("foo").inSet("C"));
            PredicateTreeAnalyzerResult r = PredicateTreeAnalyzer.analyzePredicateTree(p);
            assertEquals(2, r.minFeature);
            assertEquals(2, r.treeSize);
        }
    }