public static PredicateTreeAnnotations createPredicateTreeAnnotations(Predicate predicate) {
        PredicateTreeAnalyzerResult analyzerResult = PredicateTreeAnalyzer.analyzePredicateTree(predicate);
        // The tree size is used as the interval range.
        int intervalEnd = analyzerResult.treeSize;
        AnnotatorContext context = new AnnotatorContext(intervalEnd, analyzerResult.sizeMap);
        assignIntervalLabels(predicate, Interval.INTERVAL_BEGIN, intervalEnd, false, context);
        return new PredicateTreeAnnotations(
                analyzerResult.minFeature, intervalEnd, context.intervals, context.intervalsWithBounds,
                context.featureConjunctions);
    }
@Test
    void require_that_extreme_ranges_works() {
        Predicate p =
                and(
                        range("max range", partition("max range=9223372036854775806-9223372036854775807")),
                        range("max edge", edgePartition("max edge=9223372036854775807", 0, 0, 1)),
                        range("min range", partition("min range=-9223372036854775807-9223372036854775806")),
                        range("min edge", edgePartition("min edge=-9223372036854775808", 0, 0, 1)));
        PredicateTreeAnnotations r = PredicateTreeAnnotator.createPredicateTreeAnnotations(p);
        assertEquals(4, r.minFeature);
        assertEquals(4, r.intervalEnd);
        assertEquals(2, r.intervalMap.size());
        assertEquals(2, r.boundsMap.size());
        assertIntervalContains(r, "max range=9223372036854775806-9223372036854775807", 0x00010001);
        assertBoundsContains(r, "max edge=9223372036854775807", bound(0x00020002, 0x40000002));
        assertIntervalContains(r, "min range=-9223372036854775807-9223372036854775806", 0x00030003);
        assertBoundsContains(r, "min edge=-9223372036854775808", bound(0x00040004, 0x40000002));
    }