org.hibernate.id.enhanced
Class OptimizerFactory.HiLoOptimizer

java.lang.Object
  extended by org.hibernate.id.enhanced.OptimizerFactory.OptimizerSupport
      extended by 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 - 1
As an example, consider a case with incrementSize of 10. 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)
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()
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()
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-2010 Red Hat, Inc. All Rights Reserved.