de.bsvrz.ars.ars.mgmt.tasks
Class ArchiveQueryTask.Query

java.lang.Object
  extended by de.bsvrz.ars.ars.mgmt.tasks.ArchiveQueryTask.Query
Enclosing class:
ArchiveQueryTask

private class ArchiveQueryTask.Query
extends Object

Klasse, die eine einzelne Unterabfrage (ArchiveDataSpecification) aus der Archivanfrage und die zugehoerigen Daten fuer die Archivantwort kapselt.


Field Summary
private  ArchiveDataSpecification arcDataSpec
          Die Archivanfrage.
private  Map<ArchiveDataKind,ArchiveQueryTask.ContWalk> contWalks
          Map mit Container-Walks fuer die einzelnen Datensatzarten.
private  boolean done
          Flag, ob Anfrage bereits erledigt ist.
private  Boolean firstDataFromDeletedCont
          Flag, ob der Anfangszustand aus einem geloeschten COntainer stammt.
private  boolean firstDataSent
          Flag, ob der Kennzeichen-Datensatz am Anfang der Antwort bereits versandt worden ist.
private  boolean hasMatchingData
          Flag, ob es zur angefragten Datenidentifikation ueberhaupt irgendwelche Daten im ArS gibt.
private  ArchiveQueryTask.Container lastContainer
          Hier wird der Container vermerkt, aus dem der zuletzt gelieferte Ergebnisdatensatz stammt.
private  ArchiveQueryTask.SimpleArchiveData lastDataForDelta
          Enthaelt den letzten Datensatz einer aktuellen Datensatzart fuer den Deltavergleich.
private  int maxInterval
          Gibt Maximum für die Anzahl von Datensätzen an, die mit einer Relativanfrage zu bekommen sind.
private  ArchiveOrder order
           
private  int qIdx
          Index dieser Query; entspricht dem Index des zugeordneten Streams.
private  boolean rephrased
           
private  boolean requestedIntervalError
          Flag zeigt an, ob der Beginnzeitpunkt der Unterabfrage zeitlich hinter dem Endzeitpunkt liegt.
private  Map<ArchiveDataKind,ArchiveQueryTask.SimpleArchiveData> resultData
          Map mit den naechsten Ergebnisdatensaetzen der einzelnen Datensatzarten.
private  ArchiveTimeSpecification timeSpec
          Der Zeit-/Indexbereich der Archivanfrage.
 
Constructor Summary
private ArchiveQueryTask.Query(ArchiveDataSpecification ads, int qIdx, boolean requestedIntervalError)
          Erzeugt eine neue Query mit dem angegebenen Index zur Bearbeitung der angegebenen Unterabfrage.
 
Method Summary
private  void abort()
          Bricht die Query ab und markiert sie als erledigt.
private  boolean accessContainer(ArchiveQueryTask.ContWalk contWalk)
          Oeffnet im angegebenen Container-Walk alle Container innerhalb des aktuellen Container-Walk-Indexes zum Lesen.
private  boolean beforeLowerBound(ArchiveQueryTask.SimpleArchiveData sad)
          Liefert Flag, ob der angegebene Datensatz vor der unteren Grenze des gesuchten Intervalls liegt.
private  boolean beforeUpperBound(ArchiveQueryTask.Container contInfo)
          Liefert Flag, ob der angegebene Datensatz vor der oberen Grenze des gesuchten Intervalls liegt.
private  boolean containSameData(ArchiveQueryTask.SimpleArchiveData arcData1, ArchiveQueryTask.SimpleArchiveData arcData2)
          Vergleicht die beiden angegebenen Ergebnis-Datensaetze auf Gleichheit der Nutzdaten fuer die Deltaantwort.
 long getAbsoluteMin(ArchiveQueryTask.Info[] infos)
          Berechnet den Minimalstempel aller übergebenen Container-Infos
 long getAbsoluteMin(ArchiveQueryTask.Info[] oaInfos, ArchiveQueryTask.Info[] onInfos, ArchiveQueryTask.Info[] naInfos, ArchiveQueryTask.Info[] nnInfos)
          Berechnet den Minimalstempel aller übergebenen Container-Infos
private  long[] getAllTillMin(int i, long minThisSpec, ArchiveQueryTask.Info[] infos, long end)
          Anzahl der Datensätze bis zum gegebenen Minimalindex aus den entsprechenden Containern einer Datenart (spezifiziert durch Info[]) lesen und den Zähler inkrementieren
private  ArchiveQueryTask.Container[] getContainer(DataIdentNode din, TimingType timingType, ArchiveDataKind dataKind, String path, long minKey, long maxKey)
          Erstellt ein Array mit den Container-Infos der Ergebnis-Datencontainer anhand der Container-IDs aus den Indexen passend zu den angegebenen Parametern.
private  int getContainerFileIdx(ArchiveDataKind dataKind, int contInfoIdx)
          Wenn ein Container geoeffnet werden soll, muss der Persistenz ein Index uebergeben werden, mit dem sie mehrere geoffnete Container (ContainerFiles) eines Tasks unterscheiden kann.
private  ArchiveQueryTask.SimpleArchiveData getEndData()
          Erstellt und liefert den Ende-Kennzeichen-Datensatz zur Markierung des Endes der Archivantwort [TArS-39].
private  ArchiveQueryTask.SimpleArchiveData getFirstData()
          Wertet die Anfangszustaende (erster Ergebnisdatensatz) der einzelnen Datensatzarten aus und ermittelt den ersten zu sendenden Datensatz.
private  ArchiveQueryTask.Info[] getInfo(File[] containers)
          Infos zu Containern aus den zugehörigen Files auslesen
 ArchiveQueryTask.Info getInfoCurrent(File container)
          Infos zum spezifizierten Container auslesen
private  long getMax(ArchiveQueryTask.Info info)
           
private  long getMin(ArchiveQueryTask.Info info)
          Minimalwert der Zeit / Index der Daten im Container, der durch Info spezifiziert ist.
private  long getMin(long minThisSpec, ArchiveQueryTask.Info info)
          Minimalwert der Zeit / Index der Daten im Container, der durch Info spezifiziert ist (Zeit / Index wird nur angepasst, wenn der im TimingType spezifizierte Wert tatsächlich kleiner ist, als der, der mit minThisSpec übergeben wird)
private  ArchiveQueryTask.SimpleArchiveData getNextData()
          Liefert den naechsten Ergebnis-Datensatz der Unterabfrage zurueck.
private  ArchiveQueryTask.SimpleArchiveData getNextData(ArchiveQueryTask.ContWalk contWalk)
          Liefert den naechsten Ergebnis-Datensatz des angegebenen Container-Walks.
private  long[] guessStartEnd(int anzahl)
          Startwert für Relativanfrage raten, nebenbei fällt der Wert des Intervallendes, sowie das der minimale jemals archivierte Wert (bzgl.
private  String ident()
          Liefert einen Namen zur Identifikation dieser Unterabfrage.
private  void leaveContainer(ArchiveQueryTask.Container contInfo)
          Verlaesst den durch die Container-Info spezifizierten Container und markiert ihn als erledigt.
private  void leaveContainer(ArchiveQueryTask.ContWalk contWalk, int contWalkIdx)
          Verlaesst im angegebenen Container-Walk alle Container innerhalb des angegebenen Container-Walk-Indexes.
private  boolean matchesLowerBound(ArchiveQueryTask.SimpleArchiveData sad)
          Liefert Flag, ob der angegebene Datensatz genau auf der unteren Grenze des gesuchten Intervalls liegt.
private  boolean matchesLowerBoundSearchDirectly(ArchiveQueryTask.Container contInfo)
          Ermittelt, ob der aktuell im ContainerDataIterator der angegebenen ContInfo befindliche Datensatz die Suchkriterien der Query bezüglich der unteren Intervallgrenze direkt erfuellt.
private  boolean matchesSearchDirectly(ArchiveQueryTask.Container contInfo)
          Liefert Flag, ob der aktuell im ContainerDataIterator der angegebenen ContInfo befindliche Datensatz die Suchkriterien der Query direkt erfuellt.
private  boolean matchesSearchDirectly(ArchiveQueryTask.SimpleArchiveData sad)
          Liefert Flag, ob der uebergebene Datensatz die Suchkriterien der Query direkt erfuellt.
private  boolean matchesUpperBound(ArchiveQueryTask.SimpleArchiveData sad)
          Liefert Flag, ob der angegebene Datensatz genau auf der oberen Grenze des gesuchten Intervalls liegt.
private  ArchiveQueryTask.SimpleArchiveData mixNextData()
          Liefert den naechsten zu sendenden Datensatz, wobei dieser aus den naechsten zu sendenden Datensaetzen der verschiedenen Datensatzarten ausgewaehlt wird ("Mischen") [TArS-44].
private  void rephraseQuery()
          Für Relativanfragen müssen von einem Endezeitpunkt an X vorherige Datensätze geliefert werden.
private  File[] sortContainersById(File[] files)
          Sortiert ein Array von ContainerFiles nach ihrer ID (absteigend)
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

arcDataSpec

private ArchiveDataSpecification arcDataSpec
Die Archivanfrage.


timeSpec

private ArchiveTimeSpecification timeSpec
Der Zeit-/Indexbereich der Archivanfrage.


order

private ArchiveOrder order

qIdx

private int qIdx
Index dieser Query; entspricht dem Index des zugeordneten Streams.


requestedIntervalError

private boolean requestedIntervalError
Flag zeigt an, ob der Beginnzeitpunkt der Unterabfrage zeitlich hinter dem Endzeitpunkt liegt.


hasMatchingData

private boolean hasMatchingData
Flag, ob es zur angefragten Datenidentifikation ueberhaupt irgendwelche Daten im ArS gibt.


contWalks

private Map<ArchiveDataKind,ArchiveQueryTask.ContWalk> contWalks
Map mit Container-Walks fuer die einzelnen Datensatzarten.


resultData

private Map<ArchiveDataKind,ArchiveQueryTask.SimpleArchiveData> resultData
Map mit den naechsten Ergebnisdatensaetzen der einzelnen Datensatzarten.


firstDataSent

private boolean firstDataSent
Flag, ob der Kennzeichen-Datensatz am Anfang der Antwort bereits versandt worden ist.


firstDataFromDeletedCont

private Boolean firstDataFromDeletedCont
Flag, ob der Anfangszustand aus einem geloeschten COntainer stammt. In diesem Fall gilt Sonderfall TAnfArS 5.1.2.10.2.3.1


done

private boolean done
Flag, ob Anfrage bereits erledigt ist. Dies bedeutet, es sind alle Ergebnis-Datensaetze und der Kennzeichen-Datensatz am Ende der Antwort versandt worden.


lastContainer

private ArchiveQueryTask.Container lastContainer
Hier wird der Container vermerkt, aus dem der zuletzt gelieferte Ergebnisdatensatz stammt. Mit Hilfe dieser Information kann der Kennzeichen-Datensatz am Ende der Antwort versandt werden.


lastDataForDelta

private ArchiveQueryTask.SimpleArchiveData lastDataForDelta
Enthaelt den letzten Datensatz einer aktuellen Datensatzart fuer den Deltavergleich. War der letzte versandte Datensatz ein nachgelieferter, ist hier null enthalten.


maxInterval

private int maxInterval
Gibt Maximum für die Anzahl von Datensätzen an, die mit einer Relativanfrage zu bekommen sind.


rephrased

private boolean rephrased
Constructor Detail

ArchiveQueryTask.Query

private ArchiveQueryTask.Query(ArchiveDataSpecification ads,
                               int qIdx,
                               boolean requestedIntervalError)
                        throws PersistenceException,
                               IndexException
Erzeugt eine neue Query mit dem angegebenen Index zur Bearbeitung der angegebenen Unterabfrage.

Parameters:
ads - Unterabfrage, die diese Query bearbeitet
qIdx - Index der Query; entspricht dem Index des zugeordneten Streams.
requestedIntervalError - Zeigt an, ob die Grenzen des Abfrage-Intervalls vertauscht sind
Throws:
IndexException
PersistenceException
Method Detail

ident

private String ident()
Liefert einen Namen zur Identifikation dieser Unterabfrage.

Returns:
Query-ID

getNextData

private ArchiveQueryTask.SimpleArchiveData getNextData()
Liefert den naechsten Ergebnis-Datensatz der Unterabfrage zurueck. Dabei werden die Ergebnisdatensaetze der verschiedenen Datensatzarten gemischt. [TArs-44] Pro angefragter Datensatzart existiert ein Container-Walk mit Ergebnis-Containern.

Returns:
Naechster Ergebnisdatensatz, null falls keiner mehr zu liefern ist.

getFirstData

private ArchiveQueryTask.SimpleArchiveData getFirstData()
Wertet die Anfangszustaende (erster Ergebnisdatensatz) der einzelnen Datensatzarten aus und ermittelt den ersten zu sendenden Datensatz. Dabei werden evtl. nicht benoetigte Datensaetze eliminiert. [TArS-44]

Returns:
Erster zu sendender Ergebnisdatensatz

mixNextData

private ArchiveQueryTask.SimpleArchiveData mixNextData()
Liefert den naechsten zu sendenden Datensatz, wobei dieser aus den naechsten zu sendenden Datensaetzen der verschiedenen Datensatzarten ausgewaehlt wird ("Mischen") [TArS-44]. Diese stehen in resultData zur Verfuegung, das aus den einzelnen Container-Walks befuellt wird.

Returns:
Naechster zu sendender Ergebnisdatensatz, null falls keiner mehr zu liefern ist

getNextData

private ArchiveQueryTask.SimpleArchiveData getNextData(ArchiveQueryTask.ContWalk contWalk)
Liefert den naechsten Ergebnis-Datensatz des angegebenen Container-Walks.

Parameters:
contWalk - Container-Walk
Returns:
SimpleArchiveData mit dem Ergebnisdatensatz, null falls keiner mehr zu liefern.

getEndData

private ArchiveQueryTask.SimpleArchiveData getEndData()
Erstellt und liefert den Ende-Kennzeichen-Datensatz zur Markierung des Endes der Archivantwort [TArS-39].

Returns:
Ende-Kennzeichen-Datensatz

matchesSearchDirectly

private boolean matchesSearchDirectly(ArchiveQueryTask.Container contInfo)
Liefert Flag, ob der aktuell im ContainerDataIterator der angegebenen ContInfo befindliche Datensatz die Suchkriterien der Query direkt erfuellt.

Dies hat nichts damit zu tun, ob ein Datensatz Teil der Antwort ist.

Parameters:
contInfo - Container-Info
Returns:
Flag

matchesLowerBoundSearchDirectly

private boolean matchesLowerBoundSearchDirectly(ArchiveQueryTask.Container contInfo)
Ermittelt, ob der aktuell im ContainerDataIterator der angegebenen ContInfo befindliche Datensatz die Suchkriterien der Query bezüglich der unteren Intervallgrenze direkt erfuellt.

Dies hat nichts damit zu tun, ob ein Datensatz Teil der Antwort ist.

Parameters:
contInfo - Container-Info
Returns:
true, falls der aktuelle Datensatz auf oder nach der unteren Intervallgrenze liegt.

matchesSearchDirectly

private boolean matchesSearchDirectly(ArchiveQueryTask.SimpleArchiveData sad)
Liefert Flag, ob der uebergebene Datensatz die Suchkriterien der Query direkt erfuellt. Wird verwendet, um vor dem Versenden den Sonderfall TAnfArS 5.1.2.10.2.3.1 anzupruefen.

Dies hat nichts damit zu tun, ob ein Datensatz Teil der Antwort ist.

Parameters:
sad - Datensatz
Returns:
Flag

matchesUpperBound

private boolean matchesUpperBound(ArchiveQueryTask.SimpleArchiveData sad)
Liefert Flag, ob der angegebene Datensatz genau auf der oberen Grenze des gesuchten Intervalls liegt.

Parameters:
sad - Archivdatensatz
Returns:
Flag

matchesLowerBound

private boolean matchesLowerBound(ArchiveQueryTask.SimpleArchiveData sad)
Liefert Flag, ob der angegebene Datensatz genau auf der unteren Grenze des gesuchten Intervalls liegt.

Parameters:
sad - Archivdatensatz
Returns:
Flag

beforeLowerBound

private boolean beforeLowerBound(ArchiveQueryTask.SimpleArchiveData sad)
Liefert Flag, ob der angegebene Datensatz vor der unteren Grenze des gesuchten Intervalls liegt.

Parameters:
sad - Archivdatensatz
Returns:
Flag

beforeUpperBound

private boolean beforeUpperBound(ArchiveQueryTask.Container contInfo)
Liefert Flag, ob der angegebene Datensatz vor der oberen Grenze des gesuchten Intervalls liegt.

Parameters:
contInfo - Informationen zu einem Ergebnis-Datencontainer
Returns:
Flag

accessContainer

private boolean accessContainer(ArchiveQueryTask.ContWalk contWalk)
Oeffnet im angegebenen Container-Walk alle Container innerhalb des aktuellen Container-Walk-Indexes zum Lesen. Der ContainerDataIterator wird in jedem Container bereits auf den ersten Datensatz positioniert.

Parameters:
contWalk - Container-Walk
Returns:
true falls Container zum Lesen geoeffnet werden koennen, false sonst

abort

private void abort()
Bricht die Query ab und markiert sie als erledigt. Noch geoeffnete Container werden geschlossen.


leaveContainer

private void leaveContainer(ArchiveQueryTask.ContWalk contWalk,
                            int contWalkIdx)
Verlaesst im angegebenen Container-Walk alle Container innerhalb des angegebenen Container-Walk-Indexes.

Parameters:
contWalk - Container-Walk
contWalkIdx - Container-Walk-Index

leaveContainer

private void leaveContainer(ArchiveQueryTask.Container contInfo)
Verlaesst den durch die Container-Info spezifizierten Container und markiert ihn als erledigt.

Parameters:
contInfo - Zu verlassender Container

getContainer

private ArchiveQueryTask.Container[] getContainer(DataIdentNode din,
                                                  TimingType timingType,
                                                  ArchiveDataKind dataKind,
                                                  String path,
                                                  long minKey,
                                                  long maxKey)
Erstellt ein Array mit den Container-Infos der Ergebnis-Datencontainer anhand der Container-IDs aus den Indexen passend zu den angegebenen Parametern.

Parameters:
din - DataIdentNode zur angefragten Datenidentifikation
timingType - Archivzeit, Datenzeit oder Datenindex
dataKind - Datensatzart
path - Pfad zum Containerverzeichnis
minKey - Untere Grenze des Bereichs
maxKey - Obere Grenze des Bereichs
Returns:
Liste der Container-Infos, leere Liste im Fehlerfall oder falls keine passenden Datensaetze vorhanden

getContainerFileIdx

private int getContainerFileIdx(ArchiveDataKind dataKind,
                                int contInfoIdx)
Wenn ein Container geoeffnet werden soll, muss der Persistenz ein Index uebergeben werden, mit dem sie mehrere geoffnete Container (ContainerFiles) eines Tasks unterscheiden kann. In jeder Query muessen pro Container-Walk jeweils die innerhalb eines ContainerWalk-Indexes liegenden Container gleichzeitig geoeffnet werden. Daher wird der Index der ContainerInfo innerhalb des aktuellen ContainerWalk-Indexes herangezogen, um den Index für die Persistenz zu bilden. Desweitern wird die Datensatzart verwandt, da sie den Container-Walk dieser Datensatzart adressiert, sowie der Index der Query selber, um sie von den anderen Queries zu unterscheiden.

Parameters:
dataKind - Datensatzart zur Adressierung des Container-Walks dieser Datensatzart
contInfoIdx - Index der Container-Info des zu oeffnenden Containers innerhalb des aktuellen ContainerWalk-Indexes
Returns:
ContainerFile-Index fuer den Zugriff auf die Persistenz

containSameData

private boolean containSameData(ArchiveQueryTask.SimpleArchiveData arcData1,
                                ArchiveQueryTask.SimpleArchiveData arcData2)
Vergleicht die beiden angegebenen Ergebnis-Datensaetze auf Gleichheit der Nutzdaten fuer die Deltaantwort.

Parameters:
arcData1 - Erster Datensatz
arcData2 - Zweiter Datensatz
Returns:
Flag, ob die beiden Datensaetze gleich sind

sortContainersById

private File[] sortContainersById(File[] files)
Sortiert ein Array von ContainerFiles nach ihrer ID (absteigend)

Parameters:
files -
Returns:
das sortierte Array

getAbsoluteMin

public long getAbsoluteMin(ArchiveQueryTask.Info[] oaInfos,
                           ArchiveQueryTask.Info[] onInfos,
                           ArchiveQueryTask.Info[] naInfos,
                           ArchiveQueryTask.Info[] nnInfos)
Berechnet den Minimalstempel aller übergebenen Container-Infos

Parameters:
oaInfos -
onInfos -
naInfos -
nnInfos -
Returns:
der Minimalwert (bzgl. dem in der Spezifikation geforderten TimingType)

getAbsoluteMin

public long getAbsoluteMin(ArchiveQueryTask.Info[] infos)
Berechnet den Minimalstempel aller übergebenen Container-Infos

Parameters:
infos -
Returns:
der Minimalwert (bzgl. dem in der Spezifikation geforderten TimingType)

guessStartEnd

private long[] guessStartEnd(int anzahl)
Startwert für Relativanfrage raten, nebenbei fällt der Wert des Intervallendes, sowie das der minimale jemals archivierte Wert (bzgl. TT) ab

Parameters:
anzahl - Anzahl der gewünschten Datensätze
Returns:
erg[0] : start, erg[1] : end, erg[2] : absoluteMinimumEver

getAllTillMin

private long[] getAllTillMin(int i,
                             long minThisSpec,
                             ArchiveQueryTask.Info[] infos,
                             long end)
Anzahl der Datensätze bis zum gegebenen Minimalindex aus den entsprechenden Containern einer Datenart (spezifiziert durch Info[]) lesen und den Zähler inkrementieren

Parameters:
i - Zähler-Startwert (Container sind absteigend sortiert)
minThisSpec - bisheriger Minimalwert der Zeit / Index (abhängig vom TimingType)
infos - Infos zu Containern einer Datenart zur DID
Returns:
erg[0] : der neue Zählerwert, erg[1] : die Anzahl der Datensätze bis zum bisherigen Minimalwert

rephraseQuery

private void rephraseQuery()
Für Relativanfragen müssen von einem Endezeitpunkt an X vorherige Datensätze geliefert werden. Da Datensätze in chronologischer Reihenfolge ausgegeben werden müssen und das Archivsystem von-bis Anfragen performant beantwortet, wird hier die ursprüngliche Anfrage umgeschrieben. Es wird eine neue Anfrage erstellt, so dass von und bis genau X Antworten liefern.


getMin

private long getMin(long minThisSpec,
                    ArchiveQueryTask.Info info)
Minimalwert der Zeit / Index der Daten im Container, der durch Info spezifiziert ist (Zeit / Index wird nur angepasst, wenn der im TimingType spezifizierte Wert tatsächlich kleiner ist, als der, der mit minThisSpec übergeben wird)

Parameters:
minThisSpec -
info -
Returns:
minStempel, passend zum TimingType

getMin

private long getMin(ArchiveQueryTask.Info info)
Minimalwert der Zeit / Index der Daten im Container, der durch Info spezifiziert ist.

Parameters:
info -
Returns:
minStempel, passend zum TimingType

getMax

private long getMax(ArchiveQueryTask.Info info)

getInfo

private ArchiveQueryTask.Info[] getInfo(File[] containers)
Infos zu Containern aus den zugehörigen Files auslesen

Parameters:
containers -
Returns:

getInfoCurrent

public ArchiveQueryTask.Info getInfoCurrent(File container)
Infos zum spezifizierten Container auslesen

Parameters:
container -
Returns: