GlobalObjects
|
Um das Finden von Objekten in der Objektdatenbank zu beschleunigen, sind alle Objekte automatisch über eine glo::ObjID 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:
Grundsätzlich werden die Indexe als Strings in einer entsprechenden Indexdatei abgespeichert.
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.
Es kann ein AllSet mit einem Index instantiiert bzw. es kann ein Index gesetzt werden (siehe glo::TAllSet::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 glo::TAllSet::setIndexFilter( const std::string & rsIndexFilter ), glo::TAllSet::setIndexFilter( const std::string & rsIndexFilter, glo::EnComparisionOp eComparisionOp )
und
glo::TAllSet::setIndexFilter( const std::string & rsRangeStartIndexFilter, const std::string & rsRangeEndIndexFilter ).
Ein AllSet kann, wenn ein Index vorhanden ist (siehe auch glo::TAllSet::getAvailableIndices() ), Ergebnismengen liefern, welch wie beim Filtern eingeschränkt sein können (siehe
glo::TAllSet::getIndexedObjIds( std::list< glo::ObjID > & rObjIDList, const std::string & rsIndexSearchValue, glo::EnQueryType eQuerryType ),
glo::TAllSet::getIndexedObjIds( std::list< glo::ObjID > & rObjIDList, const std::string & rsIndexName, const std::string & rsIndexSearchValue, glo::EnQueryType eQuerryType ),
glo::TAllSet::getIndexedObjIds( std::list< glo::ObjID > & rObjIDList, const std::string & rsIndexName, unsigned long ulIndexClassID, const std::string & rsIndexSearchValue, glo::EnQueryType eQuerryType ),
glo::TAllSet::getIndexedObjIds( std::list< glo::ObjID > & rObjIDList, const std::string & rsIndexSearchValue, glo::EnComparisionOp eComparisionOp ),
glo::TAllSet::getIndexedObjIds( std::list< glo::ObjID > & rObjIDList, const std::string & rsIndexName, const std::string & rsIndexSearchValue, glo::EnComparisionOp eComparisionOp ),
glo::TAllSet::getIndexedObjIds( std::list< glo::ObjID > & rObjIDList, const std::string & rsIndexName, unsigned long ulIndexClassID, const std::string & rsIndexSearchValue, glo::EnComparisionOp eComparisionOp ),
glo::TAllSet::getIndexedObjIds( std::list< glo::ObjID > & rObjIDList, const std::string & rsRangeStartIndexSearchValue, const std::string & rsRangeEndIndexSearchValue ),
glo::TAllSet::getIndexedObjIds( std::list< glo::ObjID > & rObjIDList, const std::string & rsIndexName, const std::string & rsRangeStartIndexSearchValue, const std::string & rsRangeEndIndexSearchValue ),
glo::TAllSet::getIndexedObjIds( std::list< glo::ObjID > & rObjIDList, const std::string & rsIndexName, unsigned long ulIndexClassID, const std::string & rsRangeStartIndexSearchValue, const std::string & rsRangeEndIndexSearchValue ),
glo::TAllSet::getIndexedOndemands( std::vector< glo::TOndemand<T> > & rOndemandVector, const std::string & rsIndexSearchValue, glo::EnQueryType eQuerryType ),
glo::TAllSet::getIndexedOndemands( std::vector< glo::TOndemand<T> > & rOndemandVector, const std::string & rsIndexName, const std::string & rsIndexSearchValue, glo::EnQueryType eQuerryType ),
glo::TAllSet::getIndexedOndemands( std::vector< glo::TOndemand<T> > & rOndemandVector, const std::string & rsIndexName, unsigned long ulIndexClassID, const std::string & rsIndexSearchValue, glo::EnQueryType eQuerryType ),
glo::TAllSet::getIndexedOndemands( std::vector< glo::TOndemand<T> > & rOndemandVector, const std::string & rsIndexSearchValue, glo::EnComparisionOp eComparisionOp ),
glo::TAllSet::getIndexedOndemands( std::vector< glo::TOndemand<T> > & rOndemandVector, const std::string & rsIndexName, const std::string & rsIndexSearchValue, glo::EnComparisionOp eComparisionOp ),
glo::TAllSet::getIndexedOndemands( std::vector< glo::TOndemand<T> > & rOndemandVector, const std::string & rsIndexName, unsigned long ulIndexClassID, const std::string & rsIndexSearchValue, glo::EnComparisionOp eComparisionOp ),
glo::TAllSet::getIndexedOndemands( std::vector< glo::TOndemand<T> > & rOndemandVector, const std::string & rsRangeStartIndex, const std::string & rsRangeEndIndex ),
glo::TAllSet::getIndexedOndemands( std::vector< glo::TOndemand<T> > & rOndemandVector, const std::string & rsIndexName, const std::string & rsRangeStartIndexSearchValue, const std::string & rsRangeEndIndexSearchValue ),
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 bezeichnet 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, können die Attribute dieser Klassen auch zum indizieren genutzt werden.
Solch ein Index ist immer so aufgebaut:
"ErsteKlassenbezeichnung.ErsteAttributbezeichnung.1_Klassenbezeichnung.1_Attributbezeichnung[20]|"
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 angegebenen 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.ZweiteAttributbezeichnung[10]|"
Eine kommentierte Beispiel-Schemadatei kann hier angesehen werden.