|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectde.bsvrz.ars.ars.persistence.index.ATimeMonotoneIndex
public class ATimeMonotoneIndex
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.
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
|
private byte[] |
byteArray
|
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). |
private boolean |
ignoreLastFileEntry
|
private static boolean |
MAX
|
private static boolean |
MIN
|
static int |
NO_VALUE
|
private boolean |
noActualEntry
|
private int |
rbFstEnt
|
private int |
rbFstUnsaved
|
private int |
rbLstEnt
|
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. |
private IndexResult |
binaryFileSearch(String basePath,
byte[] tmpBuf,
ATimeMonotoneIndex.Key cmpKey,
long minKey,
long maxKey)
Führt eine binärSuche in der IndexDatei durch. |
private int |
binaryMemSearch(ATimeMonotoneIndex.Key cmpKey,
long key)
Sucht im Speicher nach dem ersten Eintrag, der auf den übergebenen Key passt. |
int |
capacity()
|
private void |
checkFileLength(File indexFile,
long fileLength)
|
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. |
private File |
checkIndexFile(String basePath)
Prüft grundlegende Eigenschaften einer Indexdatei. |
void |
closeIndex(String basePath)
Schließt den Index und speichert alle geänderten Daten auf Platte. |
private void |
closeRandomAccessFile(RandomAccessFile indexFile)
Schließt die Indexdatei. |
private int |
compare(ATimeMonotoneIndex.Key cmpKey,
int index,
long key)
Vergleicht den Eintrag an der gegebenen Position im Index mit dem gegebenen Schlüssel. |
private int |
countMatchingEntries(int startAt,
int numOfEntries,
ATimeMonotoneIndex.Key cmpKey,
long key)
Sucht den Puffer beginnend bei startAt in Richtung neuesten Eintrag nach Einträgen ab, die zum Vergleichswert passen. |
int |
entries()
|
private void |
flush(String basePath)
Speichert den aktuellen Buffer in die Datei. |
long |
getAbsoluteATMin(String basePath)
Liefert den kleinsten Archivzeit-Minwert, der jemals in diesem Index gespeichert wird. |
private long |
getCID(int pos)
|
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()
|
private long |
getEntry(ATimeMonotoneIndex.Key entrKey,
boolean min,
int pos)
Liefert den Key1 (Min) an der angegebenen Indexposition. |
protected IndexResult |
getMinEntry(String basePath)
Liefert den kleinsten Eintrag bei Sortierung nach Archivzeit. |
private int |
rb2pos(int rbPos)
Rechnet eine absolute Position im Feld (gezählt in Einträgen) in eine Ringpuffer-Position um (0 = neuester Eintrag). |
private void |
readFile(String basePath)
Füllt den Buffer so weit es geht mit den Daten aus der Indexdatei. |
private int |
readSearchChunk(RandomAccessFile raf,
int chunkNo,
byte[] buf,
int bufSize)
Liest einen Chunk zum Suchen in den Speicher. |
void |
resize(int newSize,
String basePath)
Verändert die Größe des RingBuffers. |
private void |
reuseIndexFromFile(String basePath)
Füllt den Buffer so weit es geht mit den Daten aus der Indexdatei. |
private void |
setEntry(int pos,
long dIMin,
long dIMax,
long aTMin,
long aTMax,
long dTMin,
long dTMax,
long cID)
Setzt einen Eintrag an der angegebenen Indexposition. |
private int |
stepRB(int rbPos)
Führt einen Schritt im Ringpuffer aus (und bricht dabei an der Feldgrenze um). |
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 |
---|
public static final ATimeMonotoneIndex.IndexStartmode APPEND_REUSE_LAST
public static final ATimeMonotoneIndex.IndexStartmode ERASE_OLD
public static final int NO_VALUE
public static final String IDX_FILENAME
protected static final ATimeMonotoneIndex.Key DI
protected static final ATimeMonotoneIndex.Key AT
protected static final ATimeMonotoneIndex.Key DT
private static final boolean MIN
private static final boolean MAX
public static final int ENTRY_LEN
private byte[] byteArray
private int rbFstEnt
private int rbLstEnt
private int rbFstUnsaved
private boolean ignoreLastFileEntry
private boolean noActualEntry
Constructor Detail |
---|
public ATimeMonotoneIndex(int size, String basePath, ATimeMonotoneIndex.IndexStartmode startmode) throws IndexException
size
- Größe des Buffers (Anzahl der Einträge)basePath
- Verzeichnis der Indexdateistartmode
- ATimeMonotoneIndex.IndexStartmode.ERASE_OLD
: alte Indexdatei loeschen, ATimeMonotoneIndex.IndexStartmode.APPEND_REUSE_LAST
: anfuegen, letzten Eintrag
weiterverwenden
IndexException
public ATimeMonotoneIndex(int size)
size
- Größe des Buffers (Anzahl der Einträge). Wird mindestens auf 1 gesetzt.Method Detail |
---|
public void resize(int newSize, String basePath) throws IndexException
newSize
- basePath
-
IndexException
private void reuseIndexFromFile(String basePath) throws IndexException, CorruptIndexException
basePath
- Verzeichnis der Indexdatei
IndexException
- Wenn es Probleme mit dem Einlesen der Datei gibt.
CorruptIndexException
- Wenn die Eingelesene Indexdatei beschädigt ist.private void readFile(String basePath) throws IndexException
basePath
- Verzeichnis der Indexdatei
IndexException
- Wenn es Probleme mit dem Einlesen der Datei gibt.private long getCID(int pos)
pos
- Indexposition (0 = neuester Eintrag, gezaehlt in Eintraegen)
private long getEntry(ATimeMonotoneIndex.Key entrKey, boolean min, int pos)
entrKey
- min
- pos
- Indexposition (0 = neuester Eintrag, gezaehlt in Eintraegen)
private void setEntry(int pos, long dIMin, long dIMax, long aTMin, long aTMax, long dTMin, long dTMax, long cID) throws IndexException
pos
- Indexposition (0 = neuester Eintrag, gezaehlt in Eintraegen)dIMin
- zu setzendes Datenindex-MinimumdIMax
- zu setzendes Datenindex-MaximumaTMin
- zu setzendes Archivzeit-MinimumaTMax
- zu setzendes Archivzeit-MaximumdTMin
- zu setzendes Datenzeit-MinimumdTMax
- zu setzendes Datenzeit-MaximumcID
- zu setzende Container-ID
IndexException
public void updateMax(long dIMax, long aTMax, long dTMax) throws IndexException
dIMax
- zu setzendes Datenindex-MaximumaTMax
- zu setzendes Archivzeit-MaximumdTMax
- zu setzendes Datenzeit-Maximum
IndexException
public long getCurrentCID()
public long getCurrentDIMin()
public long getCurrentDIMax()
public long getCurrentATMin()
public long getCurrentATMax()
public long getCurrentDTMin()
public long getCurrentDTMax()
public void add(String basePath, long dIMin, long dIMax, long aTMin, long aTMax, long dTMin, long dTMax, long cID) throws IndexException
basePath
- Verzeichnis der IndexdateidIMin
- Min-Wert des DatenindexdIMax
- Max-Wert des DatenindexaTMin
- Min-Wert der ArchivzeitaTMax
- Max-Wert der ArchivzeitdTMin
- Min-Wert der DatenzeitdTMax
- Max-Wert der DatenzeitcID
- Container-ID des Neueintrags
IndexException
public void checkForAdd(String basePath, long dIMin, long dIMax, long aTMin, long aTMax, long dTMin, long dTMax, long cID) throws IndexException
basePath
- Verzeichnis der IndexdateidIMin
- Min-Wert des DatenindexdIMax
- Max-Wert des DatenindexaTMin
- Min-Wert der ArchivzeitaTMax
- Max-Wert der ArchivzeitdTMin
- Min-Wert der DatenzeitdTMax
- Max-Wert der DatenzeitcID
- Container-ID des Neueintrags
IndexException
private int stepRB(int rbPos)
rbPos
- Absolute Position im Feld (gezählt in Einträgen).
private int rb2pos(int rbPos)
rbPos
- absolute Position im Feld (gezählt in Einträgen).
protected IndexResult getContainerID(String basePath, byte[] temp, ATimeMonotoneIndex.Key cmpKey, long minKey, long maxKey) throws IndexException
basePath
- Verzeichnis der Indexdateitemp
- Speicherbereich, der als Puffer dient, wenn auf die Datei zurückgegriffen werden muss.cmpKey
- minKey
- maxKey
-
IndexException
public IndexResult getContainerIDByATime(String basePath, byte[] temp, long minATime, long maxATime) throws IndexException
basePath
- Verzeichnis der Indexdateitemp
- Speicherbereich, der als Puffer dient, wenn auf die Datei zurückgegriffen werden muss.minATime
- Beginn der ZeitspannemaxATime
- Ende der Zeitspanne
IndexException
public long getAbsoluteATMin(String basePath) throws IndexException
basePath
- Verzeichnis, in dem die Index-Datei liegt
IndexException
- Bei Zugriffsproblemen mit der IndexDateiprotected IndexResult getMinEntry(String basePath) throws IndexException
basePath
- Verzeichnis, in dem die Index-Datei liegt
IndexException
- Bei Zugriffsproblemen mit der IndexDateiprivate int countMatchingEntries(int startAt, int numOfEntries, ATimeMonotoneIndex.Key cmpKey, long key) throws IndexException
startAt
- StartpositionnumOfEntries
- Maximal zu durchsuchende Zahl von EinträgencmpKey
- Vergleichswert des Eintragskey
- Vergleichsschluessel
IndexException
public int capacity()
public int entries()
private int binaryMemSearch(ATimeMonotoneIndex.Key cmpKey, long key) throws IndexException
cmpKey
- Vergleichswert des Eintragskey
- Startschlüssel
IndexException
private int compare(ATimeMonotoneIndex.Key cmpKey, int index, long key) throws IndexException
cmpKey
- Vergleichswert des Eintragsindex
- Position im Index (0 = neueste)key
- Vergleichsschlüssel
IndexException
private IndexResult binaryFileSearch(String basePath, byte[] tmpBuf, ATimeMonotoneIndex.Key cmpKey, long minKey, long maxKey) throws IndexException
basePath
- Verzeichnis der IndexdateitmpBuf
- Ein temporäres Array, das als Buffer verwendet wird.minKey
- Schlüssel, der gesucht wird
IndexException
- Wenn es Probleme mit der IndexDatei gibt.private int readSearchChunk(RandomAccessFile raf, int chunkNo, byte[] buf, int bufSize) throws IOException
ATimeMonotoneIndex.IndexStartmode.APPEND_REUSE_LAST
weiterverwendet wird, wird
der letzte Dateieintrag ignoriert.
raf
- IndexdateichunkNo
- Nummer des Chunks, beginnend bei 0buf
- SpeicherbereichbufSize
- Größe des Speicherbereichs in Byte (ist stets durch entryLen() teilbar)
IOException
private File checkIndexFile(String basePath) throws IndexException
basePath
- Verzeichnis der Indexdatei
IndexException
private void checkFileLength(File indexFile, long fileLength) throws CorruptIndexException
CorruptIndexException
private void flush(String basePath) throws IndexException
ATimeMonotoneIndex.IndexStartmode.APPEND_REUSE_LAST
gestartet wurde, wird beim ersten Flushen der letzte Dateieintrag ueberschrieben.
basePath
- Verzeichnis der Indexdatei
IndexException
- Wenn es Probleme mit der IndexDatei gibtpublic void closeIndex(String basePath) throws IndexException
basePath
- Verzeichnis, in dem die Index-Datei liegt
IndexException
private void closeRandomAccessFile(RandomAccessFile indexFile) throws IndexException
indexFile
- Indexdatei
IndexException
public String toString()
toString
in class Object
|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |