## org.hibernate.id.enhanced
Class OptimizerFactory.HiLoOptimizer

    java.lang.Object
      org.hibernate.id.enhanced.OptimizerFactory.OptimizerSupport
          org.hibernate.id.enhanced.OptimizerFactory.HiLoOptimizer

All Implemented Interfaces:
  Optimizer

Enclosing class:
  OptimizerFactory

    public static class OptimizerFactory.HiLoOptimizer

extends OptimizerFactory.OptimizerSupport

Optimizer which applies a 'hilo' algorithm in memory to achieve optimization.

A 'hilo' algorithm is simply a means for a single value stored in the database to represent a "bucket" of possible, contiguous values. The database value identifies which particular bucket we are on.

This database value must be paired with another value that defines the size of the bucket; the number of possible values available. The `incrementSize` serves this purpose. The naming here is meant more for consistency in that this value serves the same purpose as the increment supplied to the `OptimizerFactory.PooledOptimizer`.

The general algorithms used to determine the bucket are:

1. `upperLimit = (databaseValue * incrementSize) + 1`
2. `lowerLimit = upperLimit - incrementSize`

As an example, consider a case with incrementSize of 20. Initially the database holds 1:

1. `upperLimit = (1 * 20) + 1 = 21`
2. `lowerLimit = 21 - 20 = 1`

From there we increment the value from lowerLimit until we reach the upperLimit, at which point we would define a new bucket. The database now contains 2, though incrementSize remains unchanged:

1. `upperLimit = (2 * 20) + 1 = 41`
2. `lowerLimit = 41 - 20 = 21`

And so on...

Note, 'value' always (after init) holds the next value to return

Field Summary

Fields inherited from class org.hibernate.id.enhanced.OptimizerFactory.OptimizerSupport
`incrementSize, returnClass`

Constructor Summary
`OptimizerFactory.HiLoOptimizer(Class returnClass, int incrementSize)`

Method Summary
`boolean` `applyIncrementSizeToSourceValues()` Are increments to be applied to the values stored in the underlying value source?
`Serializable` `generate(AccessCallback callback)` Generate an identifier value accounting for this specific optimization.
`IntegralDataTypeHolder` `getHiValue()` Getter for property 'upperLimit'.
`IntegralDataTypeHolder` `getLastSourceValue()` A common means to access the last value obtained from the underlying source.
`IntegralDataTypeHolder` `getLastValue()` Getter for property 'lastValue'.

Methods inherited from class org.hibernate.id.enhanced.OptimizerFactory.OptimizerSupport
`getIncrementSize, getReturnClass`

Methods inherited from class java.lang.Object
`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

Constructor Detail

### OptimizerFactory.HiLoOptimizer

    public OptimizerFactory.HiLoOptimizer(Class returnClass,
                                          int incrementSize)

Method Detail

### generate

    public Serializable generate(AccessCallback callback)

  Description copied from interface: `Optimizer`
  Generate an identifier value accounting for this specific optimization.

  Parameters:
    `callback` - Callback to access the underlying value source.
  Returns:
    The generated identifier value.

### getLastSourceValue

    public IntegralDataTypeHolder getLastSourceValue()

  Description copied from interface: `Optimizer`
  A common means to access the last value obtained from the underlying source. This is intended for testing purposes, since accessing the underlying database source directly is much more difficult.

  Returns:
    The last value we obtained from the underlying source; null indicates we have not yet consulted with the source.

### applyIncrementSizeToSourceValues

    public boolean applyIncrementSizeToSourceValues()

  Description copied from interface: `Optimizer`
  Are increments to be applied to the values stored in the underlying value source?

  Returns:
    True if the values in the source are to be incremented according to the defined increment size; false otherwise, in which case the increment is totally an in memory construct.

### getLastValue

    public IntegralDataTypeHolder getLastValue()

  Getter for property 'lastValue'.

  Exposure intended for testing purposes.

  Returns:
    Value for property 'lastValue'.

### getHiValue

    public IntegralDataTypeHolder getHiValue()

  Getter for property 'upperLimit'.

  Exposure intended for testing purposes.

  Returns:
    Value for property 'upperLimit'.

Copyright © 2001-2012 Red Hat, Inc. All Rights Reserved.