Attributprojektion
Projektion - Kurzfassung
Zweck: Liefert die Werte von allen Instanzen eines bestimmten Attributtyps für einen gegebenen oder explizit definierten Attributbesitzer (ohne expliziten Join).
Eine Attributprojektion durchsucht die Attribute des durch den Kontext oder einen explizit definierten Attributbesitzerpfad definierten Attributbesitzers nach Attributen eines per Parameter Attribut ausgewählten Attributtyps.
Abhängig von der optionalen Auswahl für das auszuwertende Feld erscheint im Rückgabewert der Attributprojektion entweder der komplette Attributwert oder der Wert im ausgewählten Feld.
Die Attributprojektion liefert die Attributwerte aller Instanzen des ausgewählten Attributtyps, sodass - im Unterschied zur Typisiertes-Attribut-Projektion - grundsätzlich von einem mehrwertigen Rückgabewert auszugehen ist.
Die Einsatzmöglichkeiten der Attributprojektion im Kontext unterschiedlicher Attributtypen verdeutlicht die folgende Fallunterscheidung:
Kardinalität |
Attributtyp ist |
Attributtyp ist typisiert |
|
konkreter |
alle |
||
"singulär" (≤1) |
Standardzugriff: |
|
Attributprojektion wertet Instanzen für alle singulären und pluralen Subtypen aus und liefert als Rückgabewert eine "flache" Liste (abhängig von der Auswahl für Feld) |
"plural" (≥1:) |
Attributprojektion ist der Standardzugriff |
Ein nicht-typisiertes Singuläres Attribut ist als Attribut auswählbar. Technisch bietet die Attributprojektion diese Möglichkeit. Die Singuläres-Attribut-Projektion liefert allerdings dasselbe Ergebnis.
Für ein nicht-typisiertes Plurales Attribut, z. B. die "Kommunikationsinformation" (AddressCommunicationInfo) für den Entitätstyp "Adresse" (Address), stellt eine Attributprojektion den Standardzugriff dar.
Bezieht sich die Attribut-Auswahl auf einen Attributtyp aus der Gruppe der Typisierten Attribute (z. B. "Textattribut" oder "Firmen- und Adressattribut"), liefert die Attributprojektion die Attributwerte aller singulären und pluralen Subtypen als "flache Liste".
Die Werte von Typisierten Attributen mit pluralem Subtyp erscheinen im Rückgabewert also nicht "gruppiert" bzw. "gebündelt" je Attributbesitzer und Subtyp, sondern als individuelle Werte (mit demselben Subtyp aber unterschiedlichem index-Wert.
►HINWEIS◄ Die Attributprojektion impliziert auf Datenbankebene einen optionalen LEFT OUTER JOIN auf die Datenbanktabelle für die Implementierung des Parameter Attribut ausgewählten Attributtyps. Sofern eine Suche mehrere Instanzen der Attributprojektion für diesen Attributtyp verwendet, wird derselbe JOIN mehrfach genutzt und nicht etwa redundant ausgeführt. Falls allerdings eine Attributprojektion und eine sinngemäß gleichwertige Singuläres-Attribut-Projektion auf dasselbe Singuläre Attribut zugreifen, ergibt dies zwei redundante JOINs.
Konfiguration
Parameter |
Typ |
Beschreibung |
Name |
String |
Der optionale Parameter Name kann verwendet werden, um der Projektion einen (Alias-)Namen zuzuweisen.
|
Attributbesitzerpfad |
Entität |
Ein Attributbesitzerpfad muss nur explizit durch die Konfiguration einer Projektion definiert werden, wenn die Entität im Kontext der Suche nicht der Besitzer der Attribute ist, die ausgewertet werden sollen. Dies ist z. B. in den folgenden Fällen relevant:
|
Attribut |
Klasse |
Im Auswahlfeld/Combobox-Element für den Parameter Attribut muss eine Auswahl aus den per Dropdown angebotenen Optionen für den Attributtyp erfolgen. Hier stehen nur die Attributtypen zur Auswahl, die der Entitätstyp des anwendbaren Attributbesitzers per Implementierung unterstützt. ►HINWEIS◄ Stehen für das Attribut keine Optionen zur Auswahl oder werden Optionen vermisst, dann wurde eventuell versäumt den Attributbesitzerpfad passend zu setzen (z. B. die "Adresse" eines Kontos, für das keine Attribute implementiert sind). |
Feld |
Feld |
Das Auswahlfeld/Combobox-Element für das Feld erlaubt eine optionale Einfachauswahl für eines der Felder des per Attribut ausgewählten Attributtyps.
Für Instanzen pluraler Attribute kann ein Zugriff auf das Indexfeld (index oder orderIndex) im Attributwert sinnvoll sein.
|
Beispiele
Typischer Anwendungsfall: Plurales Attribut auswerten
Eine Tupel-Suche soll alle greifbaren Instanzen des Entitätstyps "Adressbucheintrag" (AdressBookEntry, s. Adressbucheinträge) auswerten, die per Feld "Adresse" (address) jeweils genau eine Adresse (s. Adressen) referenzieren, und dabei einen Überblick über die dort über den Attributtyp "Kommunikationsinformation" (CommunicationInfo) hinterlegten Daten verschaffen.
Konkret soll je Adressbucheintrag genau ein Tupel ausgegeben werden, das unter anderem eine Liste (bzw. Collection) aller Kommunikationsinformationen enthält.
Konfiguration:
Der Screenshot rechts zeigt die für die Tupel-Suche konfigurierten Projektionen:
|
|
Laufzeitbeispiel:
<
core
:TupleSearchResult
maxResults
=
"100"
count
=
"33"
>
<
columns
>
<
name
>addressBookId</
name
>
<
name
>id</
name
>
<
name
>address.accMatchCode</
name
>
<
name
>COMMUNICATION_INFOS</
name
>
</
columns
>
<
result
>
...
<
row
>
<
item
xsi:type
=
"xsd:long"
>1051</
item
>
<
item
xsi:type
=
"xsd:long"
>953</
item
>
<
item
xsi:type
=
"xsd:string"
>EDDH</
item
>
<
item
xsi:type
=
"list"
>
<
entry
id
=
"12956"
...
orderIndex
=
"0"
communicationType
=
"EMAIL"
communicationContext
=
"noreply"
xsi:type
=
"base:AddressCommunicationInfo"
>
<
communicationValue
>noreply@ema.il</
communicationValue
>
</
entry
>
<
entry
id
=
"12955"
...
orderIndex
=
"1"
communicationType
=
"EMAIL"
communicationContext
=
"alternate"
xsi:type
=
"base:AddressCommunicationInfo"
>
<
communicationValue
>noreply2@doma.in</
communicationValue
>
</
entry
>
<
entry
id
=
"12957"
...
orderIndex
=
"2"
communicationType
=
"PHONE"
communicationContext
=
"info"
xsi:type
=
"base:AddressCommunicationInfo"
>
<
communicationValue
>+49 (40) 50750</
communicationValue
>
</
entry
>
</
item
>
</
row
>
<
row
>
<
item
xsi:type
=
"xsd:long"
>1051</
item
>
<
item
xsi:type
=
"xsd:long"
>952</
item
>
<
item
xsi:type
=
"xsd:string"
>EDDF</
item
>
<
item
xsi:type
=
"list"
>
<
entry
id
=
"12960"
...
orderIndex
=
"0"
communicationType
=
"PHONE"
communicationContext
=
"info"
xsi:type
=
"base:AddressCommunicationInfo"
>
<
communicationValue
>+49 (180) 6 3724636</
communicationValue
>
</
entry
>
</
item
>
</
row
>
<
row
>
<
item
xsi:type
=
"xsd:long"
>1051</
item
>
<
item
xsi:type
=
"xsd:long"
>951</
item
>
<
item
xsi:type
=
"xsd:string"
>EDDL</
item
>
<
item
xsi:type
=
"list"
>
<
entry
id
=
"12961"
...
orderIndex
=
"0"
communicationType
=
"PHONE"
communicationContext
=
"info"
xsi:type
=
"base:AddressCommunicationInfo"
>
<
communicationValue
>+49 (211) 4210</
communicationValue
>
</
entry
>
</
item
>
</
row
>
...
</
result
>
</
core
:TupleSearchResult>
Jedes row -Element ("Tupel") beinhaltet als viertes item eine Liste der dem Adressbucheintrag zugeordneten "Kommunikationsformationen".
Die Beispieldaten zeigen Attributwerte mit unterschiedlichem Kommunikationstyp (EMAIL, PHONE) und "Kontext" (info, alternate, noreply) zur Klassifikation der als "Wert" (communicationValue) angegebenen konkreten Informationen.
Variante: Um die "Kommunikationsinformationen" in einer CSV-Suche als möglichst direkt lesbaren Text zu "servieren", empfiehlt sich eine etwas andere Aufbereitung der Rückgabewerte aus der Attributprojektion:
Anstelle einer "Listenspalte" (Collection) in einem Tupel soll eine ggf. mehrzeilige Ausgabe der "Kommunikationsinformationen" mit Wiederholung der Kopfdaten des Adressbucheintrags erfolgen.
Die Nutzlast-Felder aus dem Attribut sollen auf einzelne Spalten verteilt werden.
Konfiguration:
Anstelle der Collection Projektion im vorherigen Beispiel kommen die im Screenshot (rechts) gezeigten vier Instanzen der Attributprojektion mit einer bis auf das Feld einheitlichen Parametrierung zum Einsatz:
►ANMERKUNG◄ Diese Projektionen können durch "Kopieren, Einfügen und Anpassen" recht schnell zusammengestellt werden. Wie oben abstrakt beschrieben führt dies nicht dazu, dass hier intern vier individuelle JOINS generiert und zur Laufzeit abgearbeitet werden. Vielmehr beziehen sich effektiv alle Instanzen der Attributprojektion automatisch auf denselben Join. ►HINWEIS◄ Da kein Name angegeben ist, erscheinen die internen Feldnamen als Beschriftung je Ausgabespalte. |
|
Laufzeitbeispiel:
Für denselben Ausschnitt der Beispieldaten liefert die CSV-Suche den unten dargestellten Text, in dem Adressbucheinträge (s. zweite Spalte, id) mit mehreren "Kommunikationsinformationen" mehrere Zeilen belegen.
addressBookId,id,address.accMatchCode,orderIndex,communicationType,communicationContext,communicationValue
...
1051,953,EDDH,0,EMAIL,noreply,noreply@ema.il
1051,953,EDDH,2,PHONE,info,+49 (40) 50750
1051,953,EDDH,1,EMAIL,alternate,noreply2@doma.in
1051,952,EDDF,0,PHONE,info,+49 (180) 6 3724636
1051,951,EDDL,0,PHONE,info,+49 (211) 4210
...
Besonderer Anwendungsfall: Typisierte Attribute eines Typs auswerten
Eine CSV-Suche soll den "Fortschritt" im Lebenszyklus von Sendungen durch eine Listenspalte visualisieren, die für jedes verwendete Datumsattribut dessen Datumstyp benennt.
Konfiguration:
Der Screenshot rechts zeigt die Konfiguration für Projektionen der CSV-Suche:
|
|
Laufzeitbeispiel:
id,DATE_ATTRIBUTES
...
4802,[DISPATCH_DATE_PLANNED]
4701,[ARRIVAL_PLANNED]
4651,[ARRIVAL_PLANNED]
4402,[]
4401,[]
4301,[ARRIVAL_PLANNED]
4253,[ARRIVAL_PLANNED]
4203,[]
4202,[ARRIVAL_PLANNED]
4201,[]
4151,[]
4101,"[VESSEL_DEPART, WAYPOINT_ARRIVAL_DATE, WAYPOINT_ARRIVAL_DATE, VESSEL_ARRIVAL, LOADING_DATE]"
4051,"[TEST_DATETYPE, ARRIVAL_PLANNED]"
4006,[]
...
►ANMERKUNGEN◄
Das Beispiel zeigt Sendungen mit Datumsattributen mit Subtypen, die singulär oder plural sein können.
Nur der Datumstyp WAYPOINT_ARRIVAL_DATE ist dabei eindeutig als plural zu erkennen, da er mehrfach in derselben Collection für eine Sendung erscheint.
Ob ein Datumstyp, der nur einfach erscheint, per Definition singulär ist, würde auch aus dem vollständigen Attributwert nicht hervorgehen. Auch für singuläre Attributwerte erscheint ein index-Feld mit dem Wert 0.
►WICHTIG◄ Die hier demonstrierte Vorgehensweise zur Auswertung von Attribut-Subtypen ist nur wirklich praxistauglich, wenn folgende Einschränkungen unproblematisch sind:
Die Einzelwerte in einer Collection Projektion können nicht sortiert werden. Die Datumstyp-Werte erscheinen auch nicht etwa in einer logischen bzw. chronologischen Reihenfolge (s. LOADING_DATE).
Die Attributprojektion berücksichtigt alle Attribute des ausgewählten Typs, also auch solche, die aktuell nicht "gefüllt" sind.
Exkurs;
Wenn ein Attributwert gelöscht wird, bleibt in der Regel nicht nur die zugehörige Attribut-Entität in den Daten der Attributbesitzer-Entität erhalten, sondern auch der Attributwert selbst, da dieser weiter auf den Subtyp verweist:<shp:ShipmentDate id="1852" ... >
<value dateType="TEST_DATETYPE"/>
</shp:ShipmentDate>
Die oben gezeigte Suche liefert in diesem Fall also den Datumstyp, obwohl der Attributwert keine weitere "Nutzlast" beinhaltet. Die Attributprojektion sieht auch keine Möglichkeit für eine entsprechende Einschränkung vor. Nur ein Attribut Join könnte das leisten.