de.bsvrz.ars.ars.persistence.index
Class DataIndexIndex

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

public final class DataIndexIndex
extends Object

Diese Klasse stellt einen Datenindex-Index dar. Sie verhält sich ähnlich dem DataTimeIndex. Die Folge der Eintraege (min, max) ist nicht monoton, weil es beim Nachfordern Rueckspruenge geben kann. Stattdessen sind die Eintraege nur nach dem min-Wert sortiert. Ein Eintrag enthaelt Minimum, Maximum des Datenindex und die ContainerID.

Author:
beck et al. projects GmbH, Phil Schrettenbrunner

Nested Class Summary
static class DataIndexIndex.IndexStartmode
          Modi, mit denen ein Index angelegt werden kann (siehe DataTimeIndex.DataTimeIndex(int,String,byte[],IndexStartmode) )
 
Field Summary
static DataIndexIndex.IndexStartmode APPEND_REUSE_LAST
           
private  long biggestDIMaxInFile
          Hilfsvariablen
private static int CONTID_POS
           
private  long[] currentEntry
          Current Entry Array - aktuelle Daten
static DataIndexIndex.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
private static int MAX_POS
           
private static int MIN_POS
          Positionen einzelner Daten im Enty-Array
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 rbOffsetOfFirstUnsavedFromSmallest
           
private  int rbSmallestEntry
           
 
Constructor Summary
DataIndexIndex(int bufferSize)
          Erzeugt einen neuen DatenIndexIndex.
DataIndexIndex(int bufferSize, String basePath, byte[] temp, DataIndexIndex.IndexStartmode startmode)
          Erzeugt einen neuen DatenIndex.
 
Method Summary
 void add(String basePath, byte[] temp, 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 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 getAbsolutDIdxMin(String basePath)
          Liefert den kleinsten DT Min Wert, der jemals in diesem Index gespeichert wird.
 IndexResult getContainerID(String basePath, byte[] temp, long dIMin, long dIMax)
          Liefert eine Matrix mit 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
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  void linearFileSearch(RandomAccessFile raf, byte[] temp, IndexResult ir, long min, long max)
           
private static int locateEntry(byte[] buffer, long[] entry)
           
private  void osAppendToFile(OutputStream os)
           
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 rbFindDIMin(long key)
           
private  long rbGetCID(int index)
           
private  long rbGetDIMax(int index)
           
private  long rbGetDIMin(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 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 DataIndexIndex.IndexStartmode APPEND_REUSE_LAST

ERASE_OLD

public static final DataIndexIndex.IndexStartmode ERASE_OLD

MIN_POS

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

See Also:
Constant Field Values

MAX_POS

private static final int 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

biggestDIMaxInFile

private long biggestDIMaxInFile
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

rbOffsetOfFirstUnsavedFromSmallest

private int rbOffsetOfFirstUnsavedFromSmallest

rbFileupdateNecessary

private boolean rbFileupdateNecessary
Constructor Detail

DataIndexIndex

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

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 - DataIndexIndex.IndexStartmode.ERASE_OLD: alte Indexdatei loeschen, DataIndexIndex.IndexStartmode.APPEND_REUSE_LAST: anfuegen, letzten Eintrag weiterverwenden
Throws:
IndexException - Bei Problemem mit dem Dateizugriff

DataIndexIndex

public DataIndexIndex(int bufferSize)
Erzeugt einen neuen DatenIndexIndex. 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 newDIMax)
               throws IndexException
Aktualisiert den Max-Wert des aktuellsten Eintrages. Der Min-Wert und die ContainerID bleiben unverändert

Parameters:
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.

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 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
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 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
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 dIMin,
                                  long dIMax)
                           throws IndexException
Liefert eine Matrix mit 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

getAbsolutDIdxMin

public long getAbsolutDIdxMin(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:
Kleinsten Datenindex oder -1, falls keiner 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 void linearFileSearch(RandomAccessFile raf,
                              byte[] temp,
                              IndexResult ir,
                              long min,
                              long max)
                       throws IndexException
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)

rbFindDIMin

private int rbFindDIMin(long key)

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

osAppendToFile

private void osAppendToFile(OutputStream os)
                     throws Exception
Throws:
Exception

rbGetFileAnchor

private long[] rbGetFileAnchor()

rbHasUnsavedData

private boolean rbHasUnsavedData()

rbCacheChanged

private boolean rbCacheChanged()

rbGetFirstUnsaved

private int rbGetFirstUnsaved()

rbToString

private String rbToString()