GlobalObjects
GlobalObjects Indexe

Grundsätzliches

Um das Finden von Objekten in der Objektdatenbank zu beschleunigen, sind alle Objekte automatisch über eine GloObjID indiziert.
Zusätzlich können für jede persistente Klasse individuelle Indexe, auch aus mehreren Attributen zusammengesetzt, definiert werden.
Mögliche Index-Attribut-Typen:


Da eine Klasse z.B. auch eingebettete und anderweitig referenzierte Klassen als Attribut haben kann, können die Attribute dieser Klassen auch zum indizieren genutzt werden. Voraussetzung ist, dass die referenzierten Klassen als dependent gekennzeichnet ist (eingebettet Klassen sind dieses automatisch).
Attributtypen die als Pfad zu einem Index-Attribut genutzt werden können:

Zu beachten
Ein zusammengesetzter Index aus referenzierten Klassen wird nur dann aktualisiert, wenn das Objekt der indizierten Klasse gespeichert wird (speichert seine als dependent gekennzeichneten Objekt ja mit). Sollte nur das referenzierte Objekt mit dem Indexattribut gespeichert werden, wird der Index des referenzierenden Objektes nicht aktualisiert.

Grundsätzlich werden die Indexe als Strings in einer entsprechenden Indexdatei abgespeichert.

Indexdeklaration im GloDevelloper

Um Objekte über Attributinhalte suchen zu können, ist eine Indexdefinition erforderlich. Ein Index kann auch aus mehreren Attributen bestehen (z.B. Nach- und Vorname). Solche Indexe von persistenten Klassen-Attributen können einfachst im GloDeveloper eingerichtet werden. Siehe dort unter Index anlegen / bearbeiten.

Index-Abfrage im AllSet

Es kann ein AllSet mit einem Index instantiiert bzw. es kann ein Index gesetzt werden (siehe GloTAllSet::setIndexName( const std::string & rsIndexName ) ), wenn ein Index im Schema definiert ist (siehe auch Definition im GlobalObjects-Schema). Es wird beim Iterieren durch die Objekte die Sortierung des gewählten Indexes genutzt.

Wenn ein Index gesetzt ist, ist es möglich beim Iterieren durch den AllSet die Ausgabe zu filtern (siehe GloTAllSet::setIndexFilter( const std::string & rsIndexFilter ), GloTAllSet::setIndexFilter( const std::string & rsIndexFilter, GloEnComparisionOp eComparisionOp )
und
GloTAllSet::setIndexFilter( const std::string & rsRangeStartIndexFilter, const std::string & rsRangeEndIndexFilter ).

Ein AllSet kann, wenn ein Index vorhanden ist (siehe auch GloTAllSet::getAvailableIndices() ), Ergebnismengen liefern, welch wie beim Filtern eingeschränkt sein können (siehe
GloTAllSet::getIndexedObjIds( std::list< GloObjID > & rObjIDList, const std::string & rsIndexSearchValue, EnQueryType eQuerryType ),
GloTAllSet::getIndexedObjIds( std::list< GloObjID > & rObjIDList, const std::string & rsIndexName, const std::string & rsIndexSearchValue, EnQueryType eQuerryType )
GloTAllSet::getIndexedObjIds( std::list< GloObjID > & rObjIDList, const std::string & rsIndexName, unsigned long ulIndexClassID, const std::string & rsIndexSearchValue, EnQueryType eQuerryType )
GloTAllSet::getIndexedObjIds( std::list< GloObjID > & rObjIDList, const std::string & rsIndexSearchValue, GloEnComparisionOp eComparisionOp ),
GloTAllSet::getIndexedObjIds( std::list< GloObjID > & rObjIDList, const std::string & rsIndexName, const std::string & rsIndexSearchValue, GloEnComparisionOp eComparisionOp )
GloTAllSet::getIndexedObjIds( std::list< GloObjID > & rObjIDList, const std::string & rsIndexName, unsigned long ulIndexClassID, const std::string & rsIndexSearchValue, GloEnComparisionOp eComparisionOp )
GloTAllSet::getIndexedObjIds( std::list< GloObjID > & rObjIDList, const std::string & rsRangeStartIndexSearchValue, const std::string & rsRangeEndIndexSearchValue ),
GloTAllSet::getIndexedObjIds( std::list< GloObjID > & rObjIDList, const std::string & rsIndexName, const std::string & rsRangeStartIndexSearchValue, const std::string & rsRangeEndIndexSearchValue )
GloTAllSet::getIndexedObjIds( std::list< GloObjID > & rObjIDList, const std::string & rsIndexName, unsigned long ulIndexClassID, const std::string & rsRangeStartIndexSearchValue, const std::string & rsRangeEndIndexSearchValue )
GloTAllSet::getIndexedOndemands( std::vector< GloTOndemand<T> > & rOndemandVector, const std::string & rsIndexSearchValue, EnQueryType eQuerryType ),
GloTAllSet::getIndexedOndemands( std::vector< GloTOndemand<T> > & rOndemandVector, const std::string & rsIndexName, const std::string & rsIndexSearchValue, EnQueryType eQuerryType )
GloTAllSet::getIndexedOndemands( std::vector< GloTOndemand<T> > & rOndemandVector, const std::string & rsIndexName, unsigned long ulIndexClassID, const std::string & rsIndexSearchValue, EnQueryType eQuerryType )
GloTAllSet::getIndexedOndemands( std::vector< GloTOndemand<T> > & rOndemandVector, const std::string & rsIndexSearchValue, GloEnComparisionOp eComparisionOp )
GloTAllSet::getIndexedOndemands( std::vector< GloTOndemand<T> > & rOndemandVector, const std::string & rsIndexName, const std::string & rsIndexSearchValue, GloEnComparisionOp eComparisionOp )
GloTAllSet::getIndexedOndemands( std::vector< GloTOndemand<T> > & rOndemandVector, const std::string & rsIndexName, unsigned long ulIndexClassID, const std::string & rsIndexSearchValue, GloEnComparisionOp eComparisionOp )
GloTAllSet::getIndexedOndemands( std::vector< GloTOndemand<T> > & rOndemandVector, const std::string & rsRangeStartIndex, const std::string & rsRangeEndIndex ).
GloTAllSet::getIndexedOndemands( std::vector< GloTOndemand<T> > & rOndemandVector, const std::string & rsIndexName, const std::string & rsRangeStartIndexSearchValue, const std::string & rsRangeEndIndexSearchValue ) und
GloTAllSet::getIndexedOndemands( std::vector< GloTOndemand<T> > & rOndemandVector, const std::string & rsIndexName, unsigned long ulIndexClassID, const std::string & rsRangeStartIndexSearchValue, const std::string & rsRangeEndIndexSearchValue )

Indexdeklaration im GlobalObjects-Schema

Nur für Interessierte! In der Regel wird die Indexdeklaration im GloDevelloper vorgenommen, der das GlobalObjects-Schema entsprechend anpasst.

Um Objekte über einen Index suchen zu können, ist im GlobalObjects-Schema ein Index-Sektion erforderlich. Ein Index kann aus mehreren Attributen bestehen (z.B. Nach- und Vorname).

Ein Index im GlobalObjects-Schema ist immer so aufgebaut: "Klassenbezeichnung.Attributbezeichnung[20]|". Wenn mehrere Attribute für einen zusammengesetzten Index genutzt werden sollen, sieht die Index-Deklaration z.B. so aus: "Klassenbezeichnung.Attribut_1_bezeichnung[20]|Klassenbezeichnung.Attribut_2_bezeichnung[15]|".

Die Klassenbezeichnung muss immer die der Klasse bzw. Oberklasse der zu indizierenden Klasse sein. Die Attributbezeichnung ist das Attribut, welches im Index mit der in eckigen Klammern angegebenen Anzahl von Zeichen genutzt wird.

Da eine Klasse z.B. auch eingebettete und anderweitig referenzierte Klassen als Attribut haben kann, sollen die Attribute dieser Klassen auch zum indizieren genutzt werden können.

Zu beachten
Es werden bei Pointern und std::shared_ptr die Attribute beim Speichern nur dann sicher berücksichtigt, wenn diese im Schema als dependent eingebunden sind.

Solch ein Index ist immer so aufgebaut:
"ErsteKlassenbezeichnung.ErsteAttributbezeichnung.1_Klassenbezeichnung.1_Attributbezeichnung[20]|"

Zu beachten
Ein abschliessendes '|' ist obligatorisch.

Die erste Klassenbezeichnung muss nach wie vor immer die der Klasse bzw. Oberklasse der zu indizierenden Klasse sein. Die erste Attributbezeichnung ist das Attribut, welches z.B. ein eingebettetes Objekt spezifiziert. Die 1_Klassenbezeichnung ist die Klassenbezeichnung der eingebetteten Klasse bzw. deren Oberklasse mit ihrem Attribut 1_Attributbezeichnung, welches im Index mit der in eckigen Klammern angebenen Anzahl von Zeichen genutzt wird.

Möglich wäre auch so etwas (kaskadierent): "ErsteKlassenbezeichnung.ErsteAttributbezeichnung.1_Klassenbezeichnung.1_Attributbezeichnung.2_Klassenbezeichnung.2_Attributbezeichnung[20]|"

Somit können tief verschachtelte Klassen indiziert werden.

Wenn mehrere Attribute als Index genutzt werden sollen, wird der Pfad zum nächsten Attribut einfach (beendet durch ein '|' ) angehängt. Z.B: "ErsteKlassenbezeichnung.ErsteAttributbezeichnung.1_Klassenbezeichnung.1_Attributbezeichnung[20]|ErsteKlassenbezeichnung.ZweitesAttributbezeichnung[10]|"
Eine kommentierte Beispiel-Schemadatei kann hier angesehen werden.