org.h2.tools

## Class MultiDimension

- java.lang.Object
- - org.h2.tools.MultiDimension

All Implemented Interfaces:
  java.util.Comparator<long[]>

    public class MultiDimension
    extends java.lang.Object
    implements java.util.Comparator<long[]>

A tool to help an application execute multi-dimensional range queries. The algorithm used is database independent, the only requirement is that the engine supports a range index (for example b-tree).

### Constructor Summary

Constructors
`protected` `MultiDimension()`

### Method Summary

Methods
`int` `compare(long[] a, long[] b)`
`int` `deinterleave(int dimensions, long scalar, int dim)` Gets one of the original multi-dimensional values from a scalar value.
`java.lang.String` `generatePreparedQuery(java.lang.String table, java.lang.String scalarColumn, java.lang.String[] columns)` Generates an optimized multi-dimensional range query.
`static MultiDimension` `getInstance()` Get the singleton.
`int` `getMaxValue(int dimensions)` Get the maximum value for the given dimension count.
`java.sql.ResultSet` `getResult(java.sql.PreparedStatement prep, int[] min, int[] max)` Executes a prepared query that was generated using generatePreparedQuery.
`long` `interleave(int... values)` Convert the multi-dimensional value into a one-dimensional (scalar) value.
`long` `interleave(int x, int y)` Convert the two-dimensional value into a one-dimensional (scalar) value.
`int` `normalize(int dimensions, double value, double min, double max)` Normalize a value so that it is between the minimum and maximum for the given number of dimensions.

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Methods inherited from interface java.util.Comparator

`equals`

### Constructor Detail

#### MultiDimension

    protected MultiDimension()

### Method Detail

#### getInstance

    public static MultiDimension getInstance()

Get the singleton.

Returns:
  the singleton

#### normalize

    public int normalize(int dimensions,
                double value,
                double min,
                double max)

Normalize a value so that it is between the minimum and maximum for the given number of dimensions.

Parameters:
  `dimensions` - the number of dimensions
  `value` - the value (must be in the range min..max)
  `min` - the minimum value
  `max` - the maximum value (must be larger than min)
Returns:
  the normalized value in the range 0..getMaxValue(dimensions)

#### getMaxValue

    public int getMaxValue(int dimensions)

Get the maximum value for the given dimension count. For two dimensions, each value must contain at most 32 bit, for 3: 21 bit, 4: 16 bit, 5: 12 bit, 6: 10 bit, 7: 9 bit, 8: 8 bit.

Parameters:
  `dimensions` - the number of dimensions
Returns:
  the maximum value

#### interleave

    public long interleave(int... values)

Convert the multi-dimensional value into a one-dimensional (scalar) value. This is done by interleaving the bits of the values. Each values must be between 0 (including) and the maximum value for the given number of dimensions (getMaxValue, excluding). To normalize values to this range, use the normalize function.

Parameters:
  `values` - the multi-dimensional value
Returns:
  the scalar value

#### interleave

    public long interleave(int x,
                  int y)

Convert the two-dimensional value into a one-dimensional (scalar) value. This is done by interleaving the bits of the values. Each values must be between 0 (including) and the maximum value for the given number of dimensions (getMaxValue, excluding). To normalize values to this range, use the normalize function.

Parameters:
  `x` - the value of the first dimension, normalized
  `y` - the value of the second dimension, normalized
Returns:
  the scalar value

#### deinterleave

    public int deinterleave(int dimensions,
                   long scalar,
                   int dim)

Gets one of the original multi-dimensional values from a scalar value.

Parameters:
  `dimensions` - the number of dimensions
  `scalar` - the scalar value
  `dim` - the dimension of the returned value (starting from 0)
Returns:
  the value

#### generatePreparedQuery

    public java.lang.String generatePreparedQuery(java.lang.String table,
                                         java.lang.String scalarColumn,
                                         java.lang.String[] columns)

Generates an optimized multi-dimensional range query. The query contains parameters. It can only be used with the H2 database.

Parameters:
  `table` - the table name
  `columns` - the list of columns
  `scalarColumn` - the column name of the computed scalar column
Returns:
  the query

#### getResult

    public java.sql.ResultSet getResult(java.sql.PreparedStatement prep,
                               int[] min,
                               int[] max)
                                 throws java.sql.SQLException

Executes a prepared query that was generated using generatePreparedQuery.

Parameters:
  `prep` - the prepared statement
  `min` - the lower values
  `max` - the upper values
Returns:
  the result set
Throws:
  `java.sql.SQLException`

#### compare

    public int compare(long[] a,
              long[] b)

Specified by:
  `compare` in interface `java.util.Comparator<long[]>`