Collection Projektion
Projektion - Kurzfassung
Zweck: Sammelte Werte für das Feld der Collection und bindet diese über das Feld für Join in die Suche ein.
Eine Collection Projektion liefert eine Liste von Werten aus der Projektion im Parameter Feld der Collection, die in einer über den Parameter Feld für Join definierten Beziehung zur Suche stehen.
Liefert die als Feld der Collection konfigurierte Projektion "Kein Wert" ($null), dann wird der Collection kein Eintrag hinzugefügt. Die Collection beinhaltet also ggf. weniger Einträge als die Datenquelle für das Feld für Join bereitstellt. Diese Charakteristik entspricht der für den Sammle Werte-Wertauflöser.
►HINWEIS◄ Weil die Collection $null-Werte ignoriert, kann eine Wenn ( Case ) Projektion kann im Kontext der Konfiguration für das Feld der Collection nützlich sein, um die folgenden Ziele (ggf. auch gleichzeitig) zu erreichen:Anstelle eines $null-Werts in den Originaldaten kann ein konkreter Ersatzwert zugewiesen werden, der innerhalb der Collection "Leerstellen" (bzw. unbestimmte Werte) kennzeichnet.
Umgekehrt können konkrete Werte abhängig von einer Bedingung durch "Kein Wert" ($null) ersetzt werden, sodass die Collection nur eine Teilmenge der eigentlich verfügbaren Werte auflistet.
Als Feld für Join ist per Standard das Feld "ID" (id) vorbelegt, da die Collection Projektion typischerweise verwendet wird, um Daten zu sammeln, die in unmittelbarem Bezug zur gesuchten Entität stehen.
Um die Werte für die Collection zu "sammeln" erfolgt intern eine zusätzliche Datenbankabfrage, die Werte für das Feld der Collection in Verbindung mit Schlüsselwerten für das Feld für Join auflistet. Aus dieser "Master-Sammlung" wird über das Feld für Join jeder Entität in der Suche eine bestimmte Teilmenge als Wertliste zugeschlüsselt.
►WICHTIG◄ Die im Kontext der Collection Projektion ausgeführte Abfrage zum "Sammeln" von Werten erfolgt ohne Rücksicht auf Zugriffbeschränkungen, die im Kontext einer direkten Suche nach denselben Daten greifen würden. Intern besteht also (wie bei einem vollwertigen Join) Vollzugriff auf alle Instanzen der gesuchten Entität.
Was bedeutet das?
Solange für das Feld für Join der Standardwert "ID" (id) ausgewählt ist oder keine Auswahl besteht, ist dies unkritisch, da die Collection Projektion effektiv nur Daten von Instanzen der gesuchten Entität "ausliefert", die auch direkt abgerufen werden könnten.
Wenn ein anderes Feld für Join als "ID" (id) ausgewählt wird, kann die Collection Projektion auch Daten von Instanzen "enthüllen", für die kein direkter Zugriff aber eine Beziehung zu einer abrufbaren Entität über das Feld für Join besteht.
Beispiel: Eine Suche für Firmen verwendet eine Collection Projektion, in der als Feld für Join das Feld "Besitzer" (ownerId) ausgewählt ist. Für jede direkt abrufbare Firma werden dann Werte (aus der als Feld der Collection definierten Projektion) als Liste zugeordnet, die in Verbindung mit irgendeiner Firma gesammelt wurden, die denselben "Besitzer" hat wie die direkt abrufbare Firma (mehr Details s. "Beispiele" unten).
Konfiguration
Parameter |
Typ |
Beschreibung |
Name |
String |
Der optionale Parameter Name kann verwendet werden, um der Projektion einen (Alias-)Namen zuzuweisen.
|
Feld für Join |
String |
Das Feld für Join bestimmt über welches Feld die als Collection bereitgestellten Werte in den Kontext der Suche eingebunden werden sollen. Der Parameter Feld für Join definiert einen Pfad zu einem Feld als Zeichenfolge, die per Direkteingabe oder Auswahl aus dem Dropdown festgelegt werden kann (Details s. Feldprojektion, Parameter "Feld"). Ohne Auswahl für das Feld für Join, wird das Feld "ID" (id) verwendet. Dieses Feld ist auch als Standardwert vorbelegt. |
Feld der Collection |
Projektion |
Für den Parameter Feld der Collection können beliebige Projektionen eingesetzt werden. Die Projektion bestimmt, welche Werte gesammelt und dann über das Feld für Join im Kontext der Suche zugeordnet werden. |
Beispiele
Einfaches Beispiel: Auflisten der zugeordneten Rollen je Benutzer
Eine Tupel-Suche für Benutzer soll für jeden Benutzer in Verbindung mit dem Feld "Benutzername" (username) eine Liste der im Benutzerkonto zugewiesenen Rollen ausgegeben werden.
Konfiguration:
Der Screenshot zeigt die Konfiguration für die Projektionen der Tupel-Suche:
►HINWEIS◄ Wir verzichten auf ausdrückliche Zuordnungen für den Parameter Name in beiden Projektionen, sodass die Feldnamen username und roles die Spalten identifizieren. |
|
Laufzeitbeispiel:
Das Ergebnis der Tupel-Suche (rechts) zeigt neben dem Textwert (username) einen Listenwert (roles), der für unterschiedliche Benutzer eine unterschiedlich umfangreiche Auswahl an Rollen über Long-Werte referenziert. Jedem Benutzer werden die ihm zugewiesenen Rollen zugeordnet. ►ANMERKUNG◄ Mehr Information zur Rolle bietet das Benutzerkonto selbst nicht an. Per Datenobjekt Join könnten Detaildaten der Rolle einbezogen und dann auch in der Collection Projektion per Feld der Collection berücksichtigt werden. ►HINWEIS◄ Das XML-Format verdeutlicht auch, dass die Reihenfolge der entry-Elemente für Listeneinträge "unsortiert" erscheinen. Tatsächlich besteht auch keine Möglichkeit zum Sortieren der in einer Collection-Spalte gesammelten Werte innerhalb der Abfrage. Bei Bedarf muss das Ergebnis also nachträglich aufbereitet werden, soweit möglich. |
<core:TupleSearchResult maxResults="100" count="43"> ... |
Einfaches Beispiel: Auflisten aller Benutzer mit demselben Besitzer
Eine Tupel-Suche für Benutzer soll in Verbindung mit dem Feld "Benutzername" (username) eine Liste der Benutzernamen aller Benutzer erscheinen, deren Konten sich auf dasselbe Firmenkonto als "Besitzer" (ownerId) beziehen, wie der betreffende Benutzer.
Der Screenshot rechts zeigt die Projektionen für eine Tupel-Suche:
|
|
Laufzeitbeispiel:
Das Ergebnis der Tupel-Suche (rechts) zeigt neben dem Textwert (username) einen Listenwert (SAME_OWNER), der für unterschiedliche Benutzer die Name aller Benutzer angibt, für die die "Besitzer"-Firma des Benutzers ebenfalls als "Besitzer" gilt. ►HINWEIS◄ Wie die Beispieldaten veranschaulichen sollen, taucht der in der username-Spalte ausgegebene Benutzername zwangsläufig immer auch in der Collection auf. Das kann im Kontext der Collection Projektion auch nicht verhindert werden, da die Konfiguration neben dem Feld für Join keine Nebenbedingungen für die Zuordnung der gesammelten Daten vorsieht. Allerdings kann die Collection Projektion durchaus verwendet werden, um zu erreichen, dass in der SAME_OWNER-Spalte nur andere Benutzernamen erscheinen, als der in der username-Spalte genannte. Wie das geht, zeigt das folgende etwa komplexere Beispiel. |
<core:TupleSearchResult maxResults="100" count="3"> |
Komplexeres Beispiel: Auflisten aller anderen Benutzer mit demselben Besitzer
Abweichend vom vorherigen Beispiel soll erreicht werden, dass der in der username-Spalte ausgegebene "Benutzername" in der zugehörigen Liste in der SAME_OWNER-Spalte nicht erneut genannt wird. Die Liste soll also alle anderen Benutzer mit derselben "Besitzer"-Firma (ownerId) haben.
Konfiguration:
Da innerhalb der Collection Projektion keine beliebigen Bedingungen für die Zuordnung der gesammelten Daten formuliert werden können, müssen wir in unserer Suche einen Datenobjekt Join einrichten, der explizit dazu dient, die anderen Benutzer mit demselben Besitzer zu identifizieren. Der Datenobjekt Join wird wie rechts abgebildet konfiguriert:
|
|
Der Screenshot rechts zeigt, die Projektionen, mit denen das gewünschte Ergebnis erzielt werden kann:
|
|
Laufzeitbeispiel:
Mit denselben Beispieldaten wie im vorherigen Beispiel, enthält die in der SAME_OWNER-Spalte ausgegebene Liste nun jeweils einen Eintrag weniger, weil der Haupt-Benutzer nun ausschließlich in der username-Spalte erscheint. Das Ergebnis erscheint in einer CSV-Suche deutlich übersichtlicher:
►HINWEIS◄ Auch in diesem Beispiel ist erkennbar, dass die Reihenfolge der Listeneinträge innerhalb des SAME_OWNER-Felds "unsortiert" wirkt. Es besteht keine Möglichkeit auf die Reihenfolge innerhalb der Collection Einfluss zu nehmen. Auch eine Sortierung nach der einer Feldprojektion wie u2.username ist nicht hilfreich. Im Gegenteil: Die Collection Projektion liefert weiterhin unsortiert und die Sortierung multipliziert die Ausgabezeilen (Benuzter x u2) obwohl im Datenobjekt Join (u2) die Option Optional ausgewählt ist (s. o.). |
<core:TupleSearchResult maxResults="100" count="3"> |
Komplexeres Beispiel: Je Benutzer, die Kontonummern der Firmen auflisten, die beim Anmelden auswählbar sind
Eine Tupel-Suche für Benutzer soll in einer Listenspalte je Benutzer die Kontonummern aller beim Anmelden als Firma der Session auswählbaren Firmen angeben.
Konfiguration:
Die Benutzer-Suche verwendet einen Datenobjekt Join für die Entität "Firmenkonto", der unter dem Alias-Namen ca (für CompanyAccount) jedem Benutzerkonto die im Feld "Firmen" (companies) referenzierten Firmenkonten zuordnet.
Aus den Daten der per Datenobjekt Join zugeordneten Firmenkonten wird das Adressfeld "Kontonummer" (address.accountNumber) per Collection Projektion in eine Liste überführt:
Die rechts abgebildete Collection Projektion für die Listenspalte mit Name "CA_ACC_NUMBERS") greift über eine Feldprojektion mit dem im Parameter Feld für Join angegebenen Pfad ca.address.accNumber unmittelbar auf das "Kontonummer"-Feld jeder Firma zu, die der Datenobjekt Join (ca), dem jeweiligen Benutzerkonto zuordnet. Die Collection zeigt mit dieser Konfiguration keine Hinweise auf Firmen, für die keine Angabe zur "Kontonummer" vorliegt. |
|
Die Collection Projektion soll nun noch so angepasst werden, dass im Feld CA_ACC_NUMBERS der Text "UNIDENTIFIED_ACCOUNT" erscheint, falls einem Benutzer eine Firma ohne Kontonummer zugeordnet ist:
Konkret soll die "Kontonummer" als ausgefüllt gelten, wenn sie mindestens ein beliebiges Zeichen beinhaltet. Innerhalb einer Wenn ( Case ) Projektion für das Feld der Collection definiert eine Feld Einschränkung dafür die Bedingung "like _%".
Gilt die "Kontonummer" als ausgefüllt (linker Zweig der Fallunterscheidung), wird der Rückgabewert (wie oben bereits) direkt aus der Feldprojektion für den Pfad ca.address.accNumber weitergegeben.
Gilt die "Kontonummer" als nicht ausgefüllt (rechter Zweig der Fallunterscheidung), wird über eine Literale Projektion der statische Text UNIDENTIFIED_ACCOUNT als Rückgabewert zugewiesen.
Ausgehend von der bestehenden Konfiguration soll nun noch verhindert werden, dass die Collection in der Listenspalte CA_ACC_NUMBERS Firmenkonten berücksichtigt, in deren Konto das Feld "Metatyp" auf den Firmen-Metatyp "Gruppe" (GROUP) verweist.
Die "Gruppen"-Firmenkonten soll hier ausdrücklich nicht schon im Datenobjekt Join ausgefiltert werden, damit deren Daten in der Collection Projektion für eine weitere Listenspalte gesondert ausgegeben werden können.
Der folgende Screenshot zeigt einen zusätzlichen Zweig in der Wenn ( Case ) Projektion für das Feld der Collection, in dem vor allen anderen Bedingungen der "Metatyp" der Firma (ca.metaType) ausgewertet wird, um "Kein Wert" ($null) zuzuweisen, wenn der Firmen-Metatyp "Gruppe" (GROUP) vorliegt.
Wenn "Kein Wert" ($null) als Rückgabewert zugewiesen wird, taucht in der Collection weder eine ggf. zugeordnete "Kontonummer" noch der Hinweistext "UNIDENTIFIED_ACCOUNT" auf.