Class NumericUtils

java.lang.Object
org.apache.lucene.util.NumericUtils

public final class NumericUtils extends Object
Helper APIs to encode numeric values as sortable bytes and vice-versa.

To also index floating point numbers, this class supplies two methods to convert them to integer values by changing their bit layout: doubleToSortableLong(double), floatToSortableInt(float). You will have no precision loss by converting floating point numbers to integers and back (only that the integer form is not usable). Other data types like dates can easily converted to longs or ints (e.g. date to long: Date.getTime()).

NOTE: This API is for internal purposes only and might change in incompatible ways in the next release.
  • Method Details

    • doubleToSortableLong

      public static long doubleToSortableLong(double value)
      Converts a double value to a sortable signed long. The value is converted by getting their IEEE 754 floating-point "double format" bit layout and then some bits are swapped, to be able to compare the result as long. By this the precision is not reduced, but the value can easily used as a long. The sort order (including Double.NaN) is defined by Double.compareTo(java.lang.Double); NaN is greater than positive infinity.
      See Also:
    • sortableLongToDouble

      public static double sortableLongToDouble(long encoded)
      Converts a sortable long back to a double.
      See Also:
    • floatToSortableInt

      public static int floatToSortableInt(float value)
      Converts a float value to a sortable signed int. The value is converted by getting their IEEE 754 floating-point "float format" bit layout and then some bits are swapped, to be able to compare the result as int. By this the precision is not reduced, but the value can easily used as an int. The sort order (including Float.NaN) is defined by Float.compareTo(java.lang.Float); NaN is greater than positive infinity.
      See Also:
    • sortableIntToFloat

      public static float sortableIntToFloat(int encoded)
      Converts a sortable int back to a float.
      See Also:
    • sortableDoubleBits

      public static long sortableDoubleBits(long bits)
      Converts IEEE 754 representation of a double to sortable order (or back to the original)
    • sortableFloatBits

      public static int sortableFloatBits(int bits)
      Converts IEEE 754 representation of a float to sortable order (or back to the original)
    • subtract

      public static void subtract(int bytesPerDim, int dim, byte[] a, byte[] b, byte[] result)
      Result = a - b, where a >= b, else IllegalArgumentException is thrown.
    • add

      public static void add(int bytesPerDim, int dim, byte[] a, byte[] b, byte[] result)
      Result = a + b, where a and b are unsigned. If there is an overflow, IllegalArgumentException is thrown.
    • nextUp

      public static boolean nextUp(byte[] bytes)
      Modify in-place the given bytes to the next value of the same length that compares greater than the current value. This returns false if, and only if, the value is currently equal to the maximum possible value.
    • nextDown

      public static boolean nextDown(byte[] bytes)
      Modify in-place the given bytes to the previous value of the same length that compares less than the current value. This returns false if, and only if, the value is currently equal to the minimum possible value.
    • intToSortableBytes

      public static void intToSortableBytes(int value, byte[] result, int offset)
      Encodes an integer value such that unsigned byte order comparison is consistent with Integer.compare(int, int)
      See Also:
    • sortableBytesToInt

      public static int sortableBytesToInt(byte[] encoded, int offset)
      Decodes an integer value previously written with intToSortableBytes(int, byte[], int)
      See Also:
    • longToSortableBytes

      public static void longToSortableBytes(long value, byte[] result, int offset)
      Encodes an long value such that unsigned byte order comparison is consistent with Long.compare(long, long)
      See Also:
    • sortableBytesToLong

      public static long sortableBytesToLong(byte[] encoded, int offset)
      Decodes a long value previously written with longToSortableBytes(long, byte[], int)
      See Also:
    • bigIntToSortableBytes

      public static void bigIntToSortableBytes(BigInteger bigInt, int bigIntSize, byte[] result, int offset)
      Encodes a BigInteger value such that unsigned byte order comparison is consistent with BigInteger.compareTo(BigInteger). This also sign-extends the value to bigIntSize bytes if necessary: useful to create a fixed-width size.
      See Also:
    • sortableBytesToBigInt

      public static BigInteger sortableBytesToBigInt(byte[] encoded, int offset, int length)
      Decodes a BigInteger value previously written with bigIntToSortableBytes(java.math.BigInteger, int, byte[], int)
      See Also: