de.bsvrz.ars.ars.persistence.index
Class ATimeMonotoneIndex

java.lang.Object
  extended by de.bsvrz.ars.ars.persistence.index.ATimeMonotoneIndex
Direct Known Subclasses:
DIdxATimeMonotoneIndex

public class ATimeMonotoneIndex
extends Object

Diese Klasse implementiert einen monoton steigenden Index. Jeder Eintrag des Index besteht aus Datenindex-Minimum, Datenindex-Maximum, Archivzeit-Minimum, Archivzeit-Maximum, Datenzeit-Minimum, Datenzeit-Maximum und der Container-ID. In dieser Klasse ist gefordert, dass die Archivzeit monoton und die ContainerID streng monoton ueber alle Eintraege hinweg steigend sind. Datenindex und Datenzeit duerfen Rueckspruenge aufweisen (benoetigt fuer nachgeforderte Datensaetze). Daher kann diese Klasse nur nach Archivzeit suchen.

Zudem muss in jedem Eintrag das Maximum groesser oder gleich dem Minimum sein.

Wenn die Zahl der Einträge die Pufferkapazität im Speicher übersteigt, werden die Einträge in die Indexdatei geschrieben. Je größer die Pufferkapazität im Speicher, umso schneller ist die Suche, weil keine Plattenzugriffe notwendig sind. Die Suche nach ContainerIDs ist als Binärsuche implementiert, die automatisch im Speicher und in der Datei sucht.

Author:
beck et al. projects GmbH, Phil Schrettenbrunner, Alexander Schmidt

Nested Class Summary
protected static class ATimeMonotoneIndex.IndexStartmode
           
static class ATimeMonotoneIndex.Key
           
 
Field Summary
static ATimeMonotoneIndex.IndexStartmode APPEND_REUSE_LAST
           
protected static ATimeMonotoneIndex.Key AT
           
protected static ATimeMonotoneIndex.Key DI
           
protected static ATimeMonotoneIndex.Key DT
           
static int ENTRY_LEN
           
static ATimeMonotoneIndex.IndexStartmode ERASE_OLD
           
static String IDX_FILENAME
          Der Dateiname, unter dem alle Indices dieser Art gespeichert werden (der Speicherort wird später bestimmt).
static int NO_VALUE
           
 
Constructor Summary
ATimeMonotoneIndex(int size)
          Erzeugt einen neuen monoton steigenden Index.
ATimeMonotoneIndex(int size, String basePath, ATimeMonotoneIndex.IndexStartmode startmode)
          Erzeugt einen neuen monoton steigenden Index.
 
Method Summary
 void add(String basePath, long dIMin, long dIMax, long aTMin, long aTMax, long dTMin, long dTMax, long cID)
          Fügt einen neuen Eintrag in den Buffer ein.
 int capacity()
           
 void checkForAdd(String basePath, long dIMin, long dIMax, long aTMin, long aTMax, long dTMin, long dTMax, long cID)
          Prüft, ob dem Index ein neuer Eintrag hinzugefügt werden könnte.
 void closeIndex(String basePath)
          Schließt den Index und speichert alle geänderten Daten auf Platte.
 int entries()
           
 long getAbsoluteATMin(String basePath)
          Liefert den kleinsten Archivzeit-Minwert, der jemals in diesem Index gespeichert wird.
protected  IndexResult getContainerID(String basePath, byte[] temp, ATimeMonotoneIndex.Key cmpKey, long minKey, long maxKey)
          Liefert die IDs der Container, bei denen der gesuchte Key zwischen Anfang und Ende liegt.
 IndexResult getContainerIDByATime(String basePath, byte[] temp, long minATime, long maxATime)
          Liefert die IDs der Container, deren Archivzeitspanne sich mit der angegebenen Spanne ueberschneidet.
 long getCurrentATMax()
           
 long getCurrentATMin()
           
 long getCurrentCID()
           
 long getCurrentDIMax()
           
 long getCurrentDIMin()
           
 long getCurrentDTMax()
           
 long getCurrentDTMin()
           
protected  IndexResult getMinEntry(String basePath)
          Liefert den kleinsten Eintrag bei Sortierung nach Archivzeit.
 void resize(int newSize, String basePath)
          Verändert die Größe des RingBuffers.
 String toString()
           
 void updateMax(long dIMax, long aTMax, long dTMax)
          Aktualisiert die Maximumwerte des aktuellsten Eintrages.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

APPEND_REUSE_LAST

public static final ATimeMonotoneIndex.IndexStartmode APPEND_REUSE_LAST

ERASE_OLD

public static final ATimeMonotoneIndex.IndexStartmode ERASE_OLD

NO_VALUE

public static final int NO_VALUE
See Also:
Constant Field Values

IDX_FILENAME

public static final String IDX_FILENAME
Der Dateiname, unter dem alle Indices dieser Art gespeichert werden (der Speicherort wird später bestimmt).

See Also:
Constant Field Values

DI

protected static final ATimeMonotoneIndex.Key DI

AT

protected static final ATimeMonotoneIndex.Key AT

DT

protected static final ATimeMonotoneIndex.Key DT

ENTRY_LEN

public static final int ENTRY_LEN
See Also:
Constant Field Values
Constructor Detail

ATimeMonotoneIndex

public ATimeMonotoneIndex(int size,
                          String basePath,
                          ATimeMonotoneIndex.IndexStartmode startmode)
                   throws IndexException
Erzeugt einen neuen monoton steigenden Index.

Bei startmode==APPEND_REUSE_LAST wird der Ringpuffer mit den aktuellsten Daten aus einer vorhandenen Indexdate gefüllt. Zusätzlich wird der letzte Eintrag in der Indexdatei zum currentEntry. Damit kann ein Container fortgesetzt und der Key2 weiter aktualisiert werden.

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

Parameters:
size - Größe des Buffers (Anzahl der Einträge)
basePath - Verzeichnis der Indexdatei
startmode - ATimeMonotoneIndex.IndexStartmode.ERASE_OLD: alte Indexdatei loeschen, ATimeMonotoneIndex.IndexStartmode.APPEND_REUSE_LAST: anfuegen, letzten Eintrag weiterverwenden
Throws:
IndexException

ATimeMonotoneIndex

public ATimeMonotoneIndex(int size)
Erzeugt einen neuen monoton steigenden Index. Neue Eintraege werden an eine bestehende Indexdatei angefuegt, wenn diese bereits existiert. Existiert keine Indexdatei, wird eine erzeugt. Initial werden keine Daten eingelesen; es findet kein Plattenzugriff statt.

Parameters:
size - Größe des Buffers (Anzahl der Einträge). Wird mindestens auf 1 gesetzt.
Method Detail

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

updateMax

public void updateMax(long dIMax,
                      long aTMax,
                      long dTMax)
               throws IndexException
Aktualisiert die Maximumwerte des aktuellsten Eintrages. Die Minimumwerte und die Container-ID bleiben unverändert.

Parameters:
dIMax - zu setzendes Datenindex-Maximum
aTMax - zu setzendes Archivzeit-Maximum
dTMax - zu setzendes Datenzeit-Maximum
Throws:
IndexException

getCurrentCID

public long getCurrentCID()
Returns:
ContainerID des aktuellen Eintrags oder -1 falls kein Eintrag vorhanden ist

getCurrentDIMin

public long getCurrentDIMin()
Returns:
Minimum des Datenindex des aktuellen Eintrags oder -1 falls kein Eintrag vorhanden ist

getCurrentDIMax

public long getCurrentDIMax()
Returns:
Maximum des Datenindex des aktuellen Eintrags oder -1 falls kein Eintrag vorhanden ist

getCurrentATMin

public long getCurrentATMin()
Returns:
Minimum der Archivzeit des aktuellen Eintrags oder -1 falls kein Eintrag vorhanden ist

getCurrentATMax

public long getCurrentATMax()
Returns:
Maximum der Archivzeit des aktuellen Eintrags oder -1 falls kein Eintrag vorhanden ist

getCurrentDTMin

public long getCurrentDTMin()
Returns:
Minimum der Datenzeit des aktuellen Eintrags oder -1 falls kein Eintrag vorhanden ist

getCurrentDTMax

public long getCurrentDTMax()
Returns:
Maximum der Datenzeit des aktuellen Eintrags oder -1 falls kein Eintrag vorhanden ist

add

public void add(String basePath,
                long dIMin,
                long dIMax,
                long aTMin,
                long aTMax,
                long dTMin,
                long dTMax,
                long cID)
         throws IndexException
Fügt einen neuen Eintrag in den Buffer ein. Bei Bedarf wird der Puffer auf Platte geschrieben.

Parameters:
basePath - Verzeichnis der Indexdatei
dIMin - Min-Wert des Datenindex
dIMax - Max-Wert des Datenindex
aTMin - Min-Wert der Archivzeit
aTMax - Max-Wert der Archivzeit
dTMin - Min-Wert der Datenzeit
dTMax - Max-Wert der Datenzeit
cID - Container-ID des Neueintrags
Throws:
IndexException

checkForAdd

public void checkForAdd(String basePath,
                        long dIMin,
                        long dIMax,
                        long aTMin,
                        long aTMax,
                        long dTMin,
                        long dTMax,
                        long cID)
                 throws IndexException
Prüft, ob dem Index ein neuer Eintrag hinzugefügt werden könnte.

Parameters:
basePath - Verzeichnis der Indexdatei
dIMin - Min-Wert des Datenindex
dIMax - Max-Wert des Datenindex
aTMin - Min-Wert der Archivzeit
aTMax - Max-Wert der Archivzeit
dTMin - Min-Wert der Datenzeit
dTMax - Max-Wert der Datenzeit
cID - Container-ID des Neueintrags
Throws:
IndexException

getContainerID

protected IndexResult getContainerID(String basePath,
                                     byte[] temp,
                                     ATimeMonotoneIndex.Key cmpKey,
                                     long minKey,
                                     long maxKey)
                              throws IndexException
Liefert die IDs der Container, bei denen der gesuchte Key zwischen Anfang und Ende liegt.

Parameters:
basePath - Verzeichnis der Indexdatei
temp - Speicherbereich, der als Puffer dient, wenn auf die Datei zurückgegriffen werden muss.
cmpKey -
minKey -
maxKey -
Returns:
Liste von ContainerIDs mit Min/Max-Werten von DI, AT, DT
Throws:
IndexException

getContainerIDByATime

public IndexResult getContainerIDByATime(String basePath,
                                         byte[] temp,
                                         long minATime,
                                         long maxATime)
                                  throws IndexException
Liefert die IDs der Container, deren Archivzeitspanne sich mit der angegebenen Spanne ueberschneidet.

Parameters:
basePath - Verzeichnis der Indexdatei
temp - Speicherbereich, der als Puffer dient, wenn auf die Datei zurückgegriffen werden muss.
minATime - Beginn der Zeitspanne
maxATime - Ende der Zeitspanne
Returns:
Liste von ContainerIDs mit Min/Max-Werten von DI, AT, DT
Throws:
IndexException

getAbsoluteATMin

public long getAbsoluteATMin(String basePath)
                      throws IndexException
Liefert den kleinsten Archivzeit-Minwert, der jemals in diesem Index gespeichert wird.

Parameters:
basePath - Verzeichnis, in dem die Index-Datei liegt
Returns:
Kleinster Archivzeitwert
Throws:
IndexException - Bei Zugriffsproblemen mit der IndexDatei

getMinEntry

protected IndexResult getMinEntry(String basePath)
                           throws IndexException
Liefert den kleinsten Eintrag bei Sortierung nach Archivzeit.

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

capacity

public int capacity()
Returns:
Liefert die Zahl der Einträge, die im Speicher gehalten werden können.

entries

public int entries()
Returns:
Anzahl der Einträge, die aktuell im Speicher gehalten werden.

closeIndex

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

Parameters:
basePath - Verzeichnis, in dem die Index-Datei liegt
Throws:
IndexException

toString

public String toString()
Overrides:
toString in class Object