public class ATimeMonotoneIndex
extends java.lang.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 für nachgeforderte Datensätze). Daher kann diese Klasse nur nach Archivzeit suchen.
Zudem muss in jedem Eintrag das Maximum Größer 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.
Modifier and Type | Class and Description |
---|---|
protected static class |
ATimeMonotoneIndex.IndexStartmode |
static class |
ATimeMonotoneIndex.Key |
Modifier and Type | Field and Description |
---|---|
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 java.lang.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 and Description |
---|
ATimeMonotoneIndex(int size)
Erzeugt einen neuen monoton steigenden Index.
|
ATimeMonotoneIndex(int size,
java.lang.String basePath,
ATimeMonotoneIndex.IndexStartmode startmode)
Erzeugt einen neuen monoton steigenden Index.
|
Modifier and Type | Method and Description |
---|---|
void |
add(java.lang.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<ArchiveTimeIndexEntry> |
binaryFileSearch(java.lang.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(java.io.File indexFile,
long fileLength) |
void |
checkForAdd(java.lang.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 java.io.File |
checkIndexFile(java.lang.String basePath)
Prüft grundlegende Eigenschaften einer Indexdatei.
|
void |
closeIndex(java.lang.String basePath)
Schließt den Index und speichert alle geänderten Daten auf Platte.
|
private void |
closeRandomAccessFile(java.io.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(java.lang.String basePath)
Speichert den aktuellen Buffer in die Datei.
|
long |
getAbsoluteATMin(java.lang.String basePath)
Liefert den kleinsten Archivzeit-Minwert, der jemals in diesem Index gespeichert wird.
|
private long |
getCID(int pos) |
protected IndexResult<ArchiveTimeIndexEntry> |
getContainerID(java.lang.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<ArchiveTimeIndexEntry> |
getContainerIDByATime(java.lang.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<ArchiveTimeIndexEntry> |
getMinEntry(java.lang.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(java.lang.String basePath)
Füllt den Buffer so weit es geht mit den Daten aus der Indexdatei.
|
private int |
readSearchChunk(java.io.RandomAccessFile raf,
int chunkNo,
byte[] buf,
int bufSize)
Liest einen Chunk zum Suchen in den Speicher.
|
void |
resize(int newSize,
java.lang.String basePath)
Verändert die Größe des RingBuffers.
|
private void |
reuseIndexFromFile(java.lang.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).
|
java.lang.String |
toString() |
void |
updateMax(long dIMax,
long aTMax,
long dTMax)
Aktualisiert die Maximumwerte des aktuellsten Eintrages.
|
public static final ATimeMonotoneIndex.IndexStartmode APPEND_REUSE_LAST
public static final ATimeMonotoneIndex.IndexStartmode ERASE_OLD
public static final int NO_VALUE
public static final java.lang.String IDX_FILENAME
Der Dateiname, unter dem alle Indices dieser Art gespeichert werden (der Speicherort wird später bestimmt).
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
public ATimeMonotoneIndex(int size, java.lang.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.
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 weiterverwendenIndexException
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.
size
- Größe des Buffers (Anzahl der Einträge). Wird mindestens auf 1 gesetzt.public void resize(int newSize, java.lang.String basePath) throws IndexException
Verändert die Größe des RingBuffers. Beim Verkleinern werden nicht gespeicherte Einträge auf Platte geschrieben
newSize
- basePath
- IndexException
private void reuseIndexFromFile(java.lang.String basePath) throws IndexException, CorruptIndexException
Füllt den Buffer so weit es geht mit den Daten aus der Indexdatei. Dabei wird nur der neuste Teil geladen, wenn die Datei mehr Daten hält als in den Buffer passen. Der letzte Eintrag wird weiterverwendet und deswegen aus der Indexdatei gelöscht.
basePath
- Verzeichnis der IndexdateiIndexException
- Wenn es Probleme mit dem Einlesen der Datei gibt.CorruptIndexException
- Wenn die Eingelesene Indexdatei beschädigt ist.private void readFile(java.lang.String basePath) throws IndexException
Füllt den Buffer so weit es geht mit den Daten aus der Indexdatei.
basePath
- Verzeichnis der IndexdateiIndexException
- 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)
Liefert den Key1 (Min) an der angegebenen Indexposition.
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
Setzt einen Eintrag an der angegebenen Indexposition.
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-IDIndexException
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.
dIMax
- zu setzendes Datenindex-MaximumaTMax
- zu setzendes Archivzeit-MaximumdTMax
- zu setzendes Datenzeit-MaximumIndexException
public long getCurrentCID()
public long getCurrentDIMin()
public long getCurrentDIMax()
public long getCurrentATMin()
public long getCurrentATMax()
public long getCurrentDTMin()
public long getCurrentDTMax()
public void add(java.lang.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.
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 NeueintragsIndexException
public void checkForAdd(java.lang.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.
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 NeueintragsIndexException
private int stepRB(int rbPos)
Führt einen Schritt im Ringpuffer aus (und bricht dabei an der Feldgrenze um).
rbPos
- Absolute Position im Feld (gezählt in Einträgen).private int rb2pos(int rbPos)
Rechnet eine absolute Position im Feld (gezählt in Einträgen) in eine Ringpuffer-Position um (0 = neuester Eintrag).
rbPos
- absolute Position im Feld (gezählt in Einträgen).protected IndexResult<ArchiveTimeIndexEntry> getContainerID(java.lang.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.
basePath
- Verzeichnis der Indexdateitemp
- Speicherbereich, der als Puffer dient, wenn auf die Datei zurückgegriffen werden muss.cmpKey
- minKey
- maxKey
- IndexException
public IndexResult<ArchiveTimeIndexEntry> getContainerIDByATime(java.lang.String basePath, byte[] temp, long minATime, long maxATime) throws IndexException
Liefert die IDs der Container, deren Archivzeitspanne sich mit der angegebenen Spanne ueberschneidet.
basePath
- Verzeichnis der Indexdateitemp
- Speicherbereich, der als Puffer dient, wenn auf die Datei zurückgegriffen werden muss.minATime
- Beginn der ZeitspannemaxATime
- Ende der ZeitspanneIndexException
public long getAbsoluteATMin(java.lang.String basePath) throws IndexException
Liefert den kleinsten Archivzeit-Minwert, der jemals in diesem Index gespeichert wird.
basePath
- Verzeichnis, in dem die Index-Datei liegtIndexException
- Bei Zugriffsproblemen mit der IndexDateiprotected IndexResult<ArchiveTimeIndexEntry> getMinEntry(java.lang.String basePath) throws IndexException
Liefert den kleinsten Eintrag bei Sortierung nach Archivzeit.
basePath
- Verzeichnis, in dem die Index-Datei liegtIndexException
- Bei Zugriffsproblemen mit der IndexDateiprivate int countMatchingEntries(int startAt, int numOfEntries, ATimeMonotoneIndex.Key cmpKey, long key) throws IndexException
Sucht den Puffer beginnend bei startAt in Richtung neuesten Eintrag nach Einträgen ab, die zum Vergleichswert passen.
startAt
- StartpositionnumOfEntries
- Maximal zu durchsuchende Zahl von EinträgencmpKey
- Vergleichswert des Eintragskey
- VergleichsschluesselIndexException
public int capacity()
public int entries()
private int binaryMemSearch(ATimeMonotoneIndex.Key cmpKey, long key) throws IndexException
Sucht im Speicher nach dem ersten Eintrag, der auf den übergebenen Key passt. Dies ist der älteste Eintrag, bei dem Key gleich oder zwischen Key1 und Key2 ist. Liegt Key zwischen zwei Einträgen, wird der ältere genommen.
cmpKey
- Vergleichswert des Eintragskey
- StartschlüsselIndexException
private int compare(ATimeMonotoneIndex.Key cmpKey, int index, long key) throws IndexException
Vergleicht den Eintrag an der gegebenen Position im Index mit dem gegebenen Schlüssel.
cmpKey
- Vergleichswert des Eintragsindex
- Position im Index (0 = neueste)key
- VergleichsschlüsselIndexException
private IndexResult<ArchiveTimeIndexEntry> binaryFileSearch(java.lang.String basePath, byte[] tmpBuf, ATimeMonotoneIndex.Key cmpKey, long minKey, long maxKey) throws IndexException
Führt eine binärSuche in der IndexDatei durch. Dabei wird die IndexDatei in kleine Teile zerlegt, die dann in den übergebenen temporären Buffer eingelesen und mit dem gesuchten Wert verglichen werden.
basePath
- Verzeichnis der IndexdateitmpBuf
- Ein temporäres Array, das als Buffer verwendet wird.minKey
- Schlüssel, der gesucht wirdIndexException
- Wenn es Probleme mit der IndexDatei gibt.private int readSearchChunk(java.io.RandomAccessFile raf, int chunkNo, byte[] buf, int bufSize) throws java.io.IOException
Liest einen Chunk zum Suchen in den Speicher. Falls der letzte Eintrag wegen Startmode==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)java.io.IOException
private java.io.File checkIndexFile(java.lang.String basePath) throws IndexException
Prüft grundlegende Eigenschaften einer Indexdatei.
basePath
- Verzeichnis der IndexdateiIndexException
private void checkFileLength(java.io.File indexFile, long fileLength) throws CorruptIndexException
CorruptIndexException
private void flush(java.lang.String basePath) throws IndexException
Speichert den aktuellen Buffer in die Datei. Dabei werden nur die noch nicht gespeicherten Daten an die Daten in der Datei angehängt. Falls der Index mit ATimeMonotoneIndex.IndexStartmode.APPEND_REUSE_LAST
gestartet wurde, wird beim ersten Flushen der letzte Dateieintrag ueberschrieben.
basePath
- Verzeichnis der IndexdateiIndexException
- Wenn es Probleme mit der IndexDatei gibtpublic void closeIndex(java.lang.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.
basePath
- Verzeichnis, in dem die Index-Datei liegtIndexException
private void closeRandomAccessFile(java.io.RandomAccessFile indexFile) throws IndexException
Schließt die Indexdatei.
indexFile
- IndexdateiIndexException
public java.lang.String toString()
toString
in class java.lang.Object