Class IterableComparator

java.lang.Object
com.apple.foundationdb.tuple.IterableComparator
All Implemented Interfaces:
Comparator<Iterable<?>>

public class IterableComparator extends Object implements Comparator<Iterable<?>>
A Tuple-compatible Comparator that will sort Iterables in a manner that is consistent with the byte-representation of Tuples. In particular, if one has two Tuples, tuple1 and tuple2, it is the case that:
 
    tuple1.compareTo(tuple2)
      == new IterableComparator().compare(tuple1, tuple2)
      == new IterableComparator().compare(tuple1.getItems(), tuple2.getItems()),
      == ByteArrayUtil.compareUnsigned(tuple1.pack(), tuple2.pack())
 

The individual elements of the Iterable must be of a type that can be serialized by a Tuple. For items of identical types, they will be sorted in a way that is consistent with their natural ordering with a few caveats:

  • For floating point types, negative NaN values are sorted before all regular values, and positive NaN values are sorted after all regular values.
  • Single-precision floating point numbers are sorted before all double-precision floating point numbers.
  • UUIDs are sorted by their unsigned Big-Endian byte representation rather than their signed byte representation (which is the behavior of UUID.compareTo()).
  • Strings are sorted explicitly by their UTF-8 byte representation
  • Nested Tuples and Lists are sorted element-wise.
  • Constructor Details

    • IterableComparator

      public IterableComparator()
      Creates a new IterableComparator. This Comparator has no internal state.
  • Method Details

    • compare

      public int compare(Iterable<?> iterable1, Iterable<?> iterable2)
      Compare two Iterables in a way consistent with their byte representation. This is done element-wise and is consistent with a number of other ways of sorting Tuples. This will raise an IllegalArgumentException if any of the items of either Iterable cannot be serialized by a Tuple.
      Specified by:
      compare in interface Comparator<Iterable<?>>
      Parameters:
      iterable1 - the first Iterable of items
      iterable2 - the second Iterable of items
      Returns:
      a negative number if the first iterable would sort before the second when serialized, a positive number if the opposite is true, and zero if the two are equal