de.bsvrz.ars.ars.persistence.index
Class DataTimeIndex

java.lang.Object
  extended by de.bsvrz.ars.ars.persistence.index.DataTimeIndex

public final class DataTimeIndex
extends Object

Diese Klasse stellt einen DatenzeitIndex dar. Sie verhält sich ähnlich dem ATimeMonotoneIndex. Der Unterschied ist, dass die Folge der Eintraege (min, max, min, max...) nicht monoton ist, weil es Rueckspruenge geben kann. Stattdessen sind die Eintraege nur nach dem min-Wert sortiert.

Author:
beck et al. projects GmbH, Phil Schrettenbrunner

Nested Class Summary
static class DataTimeIndex.IndexStartmode
          Modi, mit denen ein Index angelegt werden kann (siehe DataTimeIndex(int,String,byte[],IndexStartmode) )
 
Field Summary
static DataTimeIndex.IndexStartmode APPEND_REUSE_LAST
           
private  long biggestDTMaxInFile
          Hilfsvariablen
private static int CONTID_POS
           
private  long[] currentEntry
          Current Entry Array - aktuelle Daten
private static int DI_MAX_POS
           
private static int DI_MIN_POS
           
private static int DT_MAX_POS
           
private static int DT_MIN_POS
          Positionen einzelner Daten im Enty-Array
static DataTimeIndex.IndexStartmode ERASE_OLD
           
private static String ERROR_ACCESS
           
private static String ERROR_CLOSE
           
private static String ERROR_OPEN
           
private  long filePositionReactivatedEntry
           
static String IDX_FILENAME
          Dateiname, unter dem alle Indices dieser Art gespeichert werden
static int NO_VALUE
          Flag, mit dem signalisiert wird, dass ein Eintrag "keinen Wert" hat
private  int rbBiggestEntry
           
private  byte[] rbBuffer
           
private  boolean rbFileupdateNecessary
           
private  int rbFirstUnsaved
           
private  int rbSmallestEntry
           
 
Constructor Summary
DataTimeIndex(int bufferSize)
          Erzeugt einen neuen DatenZeitIndex.
DataTimeIndex(int bufferSize, String basePath, byte[] temp, DataTimeIndex.IndexStartmode startmode)
          Erzeugt einen neuen Datenzeitindex.
 
Method Summary
 void add(String basePath, byte[] temp, long dTMin, long dTMax, long dIMin, long dIMax, long contId)
          Fügt dem Index einen neuen Eintrag hinzu.
private  long binaryFileSearch(RandomAccessFile raf, byte[] temp, long key)
          Ermittelt mit einer binären Suche die Position, an der der Key1 untergebracht werden kann.
 int capacity()
          Anzahl der Einträge, die dieser Index im RAM halten kann
 void checkForAdd(String basePath, byte[] temp, long dTMin, long dTMax, long dIMin, long dIMax, long contId)
          Prüft, ob dem Index ein neuer Eintrag hinzugefügt werden könnte.
 void closeIndex(String basePath, byte[] temp)
          Schließt den Index und speichert alle geänderten Daten auf Platte.
private  int containsKey(byte[] array, int cnt, long key)
           
private  void currentEntryToBuffer(String basePath, byte[] temp)
           
 int entries()
          Anzahl der Einträge, die dieser Index im RAM hält
private  void flush(String basePath)
           
 long getAbsolutDTMin(String basePath)
          Liefert den kleinsten DT Min Wert, der jemals in diesem Index gespeichert wird.
 IndexResult getContainerID(String basePath, byte[] temp, long dTMin, long dTMax)
          Liefert eine Matrix mit DTMin/Max, DIMin/Max und ContainerIds, deren DTMin/Max-Werte zwischen dTMin und dTMax liegen.
 long getCurrentCID()
          Liefert die aktuelle Container ID.
 long getCurrentDIMax()
          Liefert vom aktuellen Eintrag den Max-Wert des DatenIndex
 long getCurrentDIMin()
          Liefert vom aktuellen Eintrag den Min-Wert des DatenIndex
 long getCurrentDTMax()
          Liefert vom aktuellen Eintrag den Max-Wert
 long getCurrentDTMin()
          Liefert vom aktuellen Eintrag den Min-Wert
private  long[][] getMaximaFromFile(RandomAccessFile raf, byte[] temp, int fileStart, int fileEnd)
           
private  void ifClose(RandomAccessFile raf)
           
private  RandomAccessFile ifOpen(String basePath)
           
private  void insertIntoFile(String basePath, byte[] temp)
           
private  long[] linearFileSearch(RandomAccessFile raf, byte[] temp, IndexResult ir, long min, long max)
          Sucht mit Hilfe eine linearen Suche auf der Indexdatei Container der Datenzeiten sich mit dem übergebenen Bereich schneiden und speicher diese im übergebenen Indexresult.
private static int locateEntry(byte[] buffer, long[] entry)
           
private  boolean overlap(long firstMin, long firstMax, long secondMin, long secondMax)
           
private  void rbAddCurrentEntry()
           
private  void rbAppendCurrentEntry()
           
private  void rbAppendToFile(RandomAccessFile raf)
           
private  int rbBytePos(int pos)
           
private  boolean rbCacheChanged()
           
private  int rbCapacity()
           
private  int rbCapacityInBytes()
           
private  int rbElementsInbetween(int start, int stop, int ringbufferSize)
           
private  int rbEntries()
           
private  int rbEntryLength()
           
private  void rbExtractMaxima()
           
private  int rbFindDTMin(long key)
           
private  long rbGetCID(int index)
           
private  long rbGetDIMax(int index)
           
private  long rbGetDIMin(int index)
           
private  long rbGetDTMax(int index)
           
private  long rbGetDTMin(int index)
           
private  long[] rbGetEntry(int index)
           
private  long[] rbGetFileAnchor()
           
private  int rbGetFirstUnsaved()
           
private  boolean rbHasUnsavedData()
           
private  void rbInit(int entries)
           
private  void rbInsertElement()
           
private  void rbLoad(RandomAccessFile raf)
           
private  void rbMoveEntryLeft(int index)
           
private  void rbMoveEntryRight(int index)
           
private  boolean rbMustBeSaved()
           
private  int rbStep(int index)
           
private  int rbStepBack(int index)
           
private  String rbToString()
           
 void resize(int newSize, String basePath)
          Verändert die Größe des RingBuffers.
 String toString()
          Gibt den Inhalt des ByteBuffers als String aus, inkl Angaben über Kapazität, Anzahl der Einträge und des CurrentEntries.
private  void updateCurrentEntryInFile(String basePath)
           
 void updateMax(long newDTMax, long newDIMax)
          Aktualisiert den Max-Wert des aktuellsten Eintrages.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

IDX_FILENAME

public static final String IDX_FILENAME
Dateiname, unter dem alle Indices dieser Art gespeichert werden

See Also:
Constant Field Values

NO_VALUE

public static final int NO_VALUE
Flag, mit dem signalisiert wird, dass ein Eintrag "keinen Wert" hat

See Also:
Constant Field Values

APPEND_REUSE_LAST

public static final DataTimeIndex.IndexStartmode APPEND_REUSE_LAST

ERASE_OLD

public static final DataTimeIndex.IndexStartmode ERASE_OLD

DT_MIN_POS

private static final int DT_MIN_POS
Positionen einzelner Daten im Enty-Array

See Also:
Constant Field Values

DT_MAX_POS

private static final int DT_MAX_POS
See Also:
Constant Field Values

DI_MIN_POS

private static final int DI_MIN_POS
See Also:
Constant Field Values

DI_MAX_POS

private static final int DI_MAX_POS
See Also:
Constant Field Values

CONTID_POS

private static final int CONTID_POS
See Also:
Constant Field Values

ERROR_OPEN

private static final String ERROR_OPEN
See Also:
Constant Field Values

ERROR_CLOSE

private static final String ERROR_CLOSE
See Also:
Constant Field Values

ERROR_ACCESS

private static final String ERROR_ACCESS
See Also:
Constant Field Values

biggestDTMaxInFile

private long biggestDTMaxInFile
Hilfsvariablen


filePositionReactivatedEntry

private long filePositionReactivatedEntry

currentEntry

private long[] currentEntry
Current Entry Array - aktuelle Daten


rbBuffer

private byte[] rbBuffer

rbSmallestEntry

private int rbSmallestEntry

rbBiggestEntry

private int rbBiggestEntry

rbFirstUnsaved

private int rbFirstUnsaved

rbFileupdateNecessary

private boolean rbFileupdateNecessary
Constructor Detail

DataTimeIndex

public DataTimeIndex(int bufferSize,
                     String basePath,
                     byte[] temp,
                     DataTimeIndex.IndexStartmode startmode)
              throws IndexException
Erzeugt einen neuen Datenzeitindex.

Bei startmode==APPEND_REUSE_LAST wird der Ringpuffer mit den aktuellsten Daten aus einer vorhandenen Indexdatei gefüllt. Der Eintrag mit der größten ContainerId wird als currentEntry reaktiviert. Damit kann ein Container fortgesetzt und der reaktivierte Eintrag weiter aktualisiert werden.

Bei startmode==ERASE_OLD wird ein leerer Index erzeugt und die bisherige Indexdatei (sofern vorhanden) geloescht.

Parameters:
bufferSize - Anzahl der Einträge, die der die der Index im RAM halten soll
basePath - Verzeichnis, in dem die Indexdatei liegt
temp - Ein temporäres ByteArray, das zum Suchen des currentEntries verwendet wird
startmode - DataTimeIndex.IndexStartmode.ERASE_OLD: alte Indexdatei loeschen, DataTimeIndex.IndexStartmode.APPEND_REUSE_LAST: anfuegen, letzten Eintrag weiterverwenden
Throws:
IndexException - Bei Problemem mit dem Dateizugriff

DataTimeIndex

public DataTimeIndex(int bufferSize)
Erzeugt einen neuen DatenZeitIndex. Eine eventuell vorhandene Datei wird weiterbenutzt, ein weiterbenutzen des currentEntries ist nicht möglich.

Parameters:
bufferSize - Anzahl der Einträge, die der die der Index im RAM halten soll
Method Detail

updateMax

public void updateMax(long newDTMax,
                      long newDIMax)
               throws IndexException
Aktualisiert den Max-Wert des aktuellsten Eintrages. Der Min-Wert und die ContainerID bleiben unverändert

Parameters:
newDTMax - neuer Wert für DatenZeitIndex-Max
newDIMax - neuer Wert für DatenIndexIndex-Max
Throws:
IndexException - Wenn der neue Wert kleiner als der dazugehörige Min-Wert ist oder wenn keinen currentEntry gibt

getCurrentCID

public long getCurrentCID()
Liefert die aktuelle Container ID. Wenn es noch keine Aktuelle Container ID gibt, wird -1 zurückgeliefert

Returns:
die aktuelle Container ID oder -1, wenn es keinen aktuellen Entry gibt.

getCurrentDTMin

public long getCurrentDTMin()
Liefert vom aktuellen Eintrag den Min-Wert

Returns:
Min-Wert des aktuellen Eintrags

getCurrentDTMax

public long getCurrentDTMax()
Liefert vom aktuellen Eintrag den Max-Wert

Returns:
Max-Wert des aktuellen Eintrags

getCurrentDIMin

public long getCurrentDIMin()
Liefert vom aktuellen Eintrag den Min-Wert des DatenIndex

Returns:
Min-Wert des DatenIndex des aktuellen Eintrags

getCurrentDIMax

public long getCurrentDIMax()
Liefert vom aktuellen Eintrag den Max-Wert des DatenIndex

Returns:
Max-Wert des DatenIndex des aktuellen Eintrags

capacity

public int capacity()
Anzahl der Einträge, die dieser Index im RAM halten kann

Returns:
Anzahl der Einträge

entries

public int entries()
Anzahl der Einträge, die dieser Index im RAM hält

Returns:
Anzahl der Einträge

add

public void add(String basePath,
                byte[] temp,
                long dTMin,
                long dTMax,
                long dIMin,
                long dIMax,
                long contId)
         throws IndexException
Fügt dem Index einen neuen Eintrag hinzu. Dabei wird der derzeitig aktuelle Eintrag abgeschlossen. Führt dies dazu, dass keine weiteren freien Plätze im Cache vorhanden sind, werden die Änderungen auf Platte geschrieben. Wenn der Cache noch vollständig leer ist, werden die aktuellsten Daten aus der Index-Datei geladen.

Parameters:
basePath - Verzeichnis, in dem die Index-Datei liegt
temp - Puffer, der beim Einlesen/Schreiben der Index-Datei verwendet wird
dTMin - DatenZeit Min-Wert
dTMax - DatenZeit Max-Wert
dIMin - DatenIndex Min-Wert
dIMax - DatenIndex Max-Wert
contId - Container ID
Throws:
IndexException - Bei Problemem mit der Index-Datei

checkForAdd

public void checkForAdd(String basePath,
                        byte[] temp,
                        long dTMin,
                        long dTMax,
                        long dIMin,
                        long dIMax,
                        long contId)
                 throws IndexException
Prüft, ob dem Index ein neuer Eintrag hinzugefügt werden könnte.

Parameters:
basePath - Verzeichnis, in dem die Index-Datei liegt
temp - Puffer, der beim Einlesen/Schreiben der Index-Datei verwendet wird
dTMin - DatenZeit Min-Wert
dTMax - DatenZeit Max-Wert
dIMin - DatenIndex Min-Wert
dIMax - DatenIndex Max-Wert
contId - Container ID
Throws:
IndexException - Bei Problemem mit der Index-Datei

getContainerID

public IndexResult getContainerID(String basePath,
                                  byte[] temp,
                                  long dTMin,
                                  long dTMax)
                           throws IndexException
Liefert eine Matrix mit DTMin/Max, DIMin/Max und ContainerIds, deren DTMin/Max-Werte zwischen dTMin und dTMax liegen. Wird diese Methode aufgerufen wenn der Cache noch leer ist, werden die aktuellsten Daten aus der Datei nachgeladen.

Parameters:
basePath - Verzeichnis, in dem die Index-Datei liegt
temp - Puffer, der beim Einlesen/Schreiben der Index-Datei verwendet wird
dTMin - Min-Wert der Zeitspanne
dTMax - Max-Wert der Zeitspanne
Returns:
IndexResult-Objekt, das die Index innerhalb der gesuchten Zeitspanne enthält (DT und DI Werte, keine AT Werte)
Throws:
IndexException - Bei Problemem mit der IndexDatei

getAbsolutDTMin

public long getAbsolutDTMin(String basePath)
                     throws IndexException
Liefert den kleinsten DT Min Wert, der jemals in diesem Index gespeichert wird.

Parameters:
basePath - Verzeichnis, in dem die Index-Datei liegt
Returns:
Kleinste Datenzeit oder -1 falls keine vorhanden
Throws:
IndexException - Bei Zugriffsproblemen mit der IndexDatei

closeIndex

public void closeIndex(String basePath,
                       byte[] temp)
                throws IndexException
Schließt den Index und speichert alle geänderten Daten auf Platte. Nach dem Aufruf von close() darf die Index-Instanz nicht mehr verwendet werden.

Parameters:
basePath - Verzeichnis, in dem die Index-Datei liegt
temp - Puffer, der beim Schreiben der Index-Datei verwendet wird
Throws:
IndexException

toString

public String toString()
Gibt den Inhalt des ByteBuffers als String aus, inkl Angaben über Kapazität, Anzahl der Einträge und des CurrentEntries.

Overrides:
toString in class Object
Returns:
ByteBuffer als String

currentEntryToBuffer

private void currentEntryToBuffer(String basePath,
                                  byte[] temp)
                           throws IndexException
Throws:
IndexException

flush

private void flush(String basePath)
            throws IndexException
Throws:
IndexException

insertIntoFile

private void insertIntoFile(String basePath,
                            byte[] temp)
                     throws IndexException
Throws:
IndexException

binaryFileSearch

private long binaryFileSearch(RandomAccessFile raf,
                              byte[] temp,
                              long key)
                       throws IndexException,
                              IOException
Ermittelt mit einer binären Suche die Position, an der der Key1 untergebracht werden kann. Wenn es schon mehrere gleiche Key1 gibt, wird ein beliebiger davon zurück gegeben.

Parameters:
raf - Eine Referenz auf die Datei
temp - Ein Temp Array, zum Einlesen der Datei. Je größer umso besser
key - der gesuchte Key1
Returns:
die bytePosition an der der Key eingefügt werden muss
Throws:
IndexException
IOException

linearFileSearch

private long[] linearFileSearch(RandomAccessFile raf,
                                byte[] temp,
                                IndexResult ir,
                                long min,
                                long max)
                         throws IndexException
Sucht mit Hilfe eine linearen Suche auf der Indexdatei Container der Datenzeiten sich mit dem übergebenen Bereich schneiden und speicher diese im übergebenen Indexresult. Informationen zu einem vorhergehenden Container des Maximum am nächsten am Minimum des Zeitbereichs liegt, werden in einem Array zurückgeben, falls vorhanden.

Parameters:
raf - Eine Referenz auf die Datei
temp - Ein Temp Array, zum Einlesen der Datei. Je größer umso besser
ir - Speichert die gefundenen Container
min - Minimum des gesuchten Zeitbereichs
max - Maximum des gesuchten Zeitbereichs
Returns:
Informationen zu einem vorhergehenden Container des Maximum am nächsten am Minimum des Zeitbereichs liegt.
Throws:
IndexException

locateEntry

private static int locateEntry(byte[] buffer,
                               long[] entry)

updateCurrentEntryInFile

private void updateCurrentEntryInFile(String basePath)
                               throws IndexException
Throws:
IndexException

getMaximaFromFile

private long[][] getMaximaFromFile(RandomAccessFile raf,
                                   byte[] temp,
                                   int fileStart,
                                   int fileEnd)
                            throws IOException
Parameters:
raf - Random Access File
temp - Temp. Buffer
fileStart - Erstes Byte, ab den gelesen werden soll
fileEnd - Letztes Byte, bis zu dem gelesen werden soll
Returns:
Matrix: [0][0] = Größter DTMax-Wert [1][0] = erstes Byte des Eintrags mit der größten CID [2][] = der Maximaeintrag selbst
Throws:
IOException

containsKey

private int containsKey(byte[] array,
                        int cnt,
                        long key)

overlap

private boolean overlap(long firstMin,
                        long firstMax,
                        long secondMin,
                        long secondMax)

ifOpen

private RandomAccessFile ifOpen(String basePath)
                         throws IndexException
Throws:
IndexException

ifClose

private void ifClose(RandomAccessFile raf)
              throws IndexException
Throws:
IndexException

rbInit

private void rbInit(int entries)

rbLoad

private void rbLoad(RandomAccessFile raf)
             throws IndexException
Throws:
IndexException

resize

public void resize(int newSize,
                   String basePath)
            throws IndexException
Verändert die Größe des RingBuffers. Beim Verkleinern werden nicht gespeicherte Einträge auf Platte geschrieben

Parameters:
newSize -
basePath -
Throws:
IndexException

rbElementsInbetween

private int rbElementsInbetween(int start,
                                int stop,
                                int ringbufferSize)

rbEntries

private int rbEntries()

rbBytePos

private int rbBytePos(int pos)

rbCapacity

private int rbCapacity()

rbCapacityInBytes

private int rbCapacityInBytes()

rbEntryLength

private int rbEntryLength()

rbMustBeSaved

private boolean rbMustBeSaved()

rbAddCurrentEntry

private void rbAddCurrentEntry()

rbAppendCurrentEntry

private void rbAppendCurrentEntry()

rbInsertElement

private void rbInsertElement()

rbExtractMaxima

private void rbExtractMaxima()

rbMoveEntryRight

private void rbMoveEntryRight(int index)

rbMoveEntryLeft

private void rbMoveEntryLeft(int index)

rbFindDTMin

private int rbFindDTMin(long key)

rbGetDTMin

private long rbGetDTMin(int index)

rbGetDTMax

private long rbGetDTMax(int index)

rbGetDIMin

private long rbGetDIMin(int index)

rbGetDIMax

private long rbGetDIMax(int index)

rbGetCID

private long rbGetCID(int index)

rbGetEntry

private long[] rbGetEntry(int index)

rbStep

private int rbStep(int index)

rbStepBack

private int rbStepBack(int index)

rbAppendToFile

private void rbAppendToFile(RandomAccessFile raf)
                     throws Exception
Throws:
Exception

rbGetFileAnchor

private long[] rbGetFileAnchor()

rbHasUnsavedData

private boolean rbHasUnsavedData()

rbCacheChanged

private boolean rbCacheChanged()

rbGetFirstUnsaved

private int rbGetFirstUnsaved()

rbToString

private String rbToString()