private void processFeatureRange(FeatureRange range, PredicateOptions options) {
        range.clearPartitions();
        int arity = options.getArity();
        RangePruner rangePruner = new RangePruner(range, options, arity);
        long from = rangePruner.getFrom();
        long to = rangePruner.getTo();

        if (from < 0) {
            if (to < 0) {
                // Special case for to==-1. -X-0 means the same as -X-1, but is more efficient.
                partitionRange(range, (to == -1 ? 0 : -to), -from, arity, true);
            } else {
                partitionRange(range, 0, -from, arity, true);
                partitionRange(range, 0, to, arity, false);
            }
        } else {
            partitionRange(range, from, to, arity, false);
        }
    }
Partitions all the feature ranges according to the arity and bounds
set in the PredicateOptions, and updates the ranges with a set of
partitions and edge partitions.
This is required to be able to store a range in the PredicateIndex.

@author Magnar Nedland
@author bjorncs
predicate-search-core/src/main/java/com/yahoo/search/predicate/optimization/ComplexNodeTransformer.java