Feldprojektion
Projektion - Kurzfassung
Zweck: Gibt den Wert eines Felds einer Entität aus dem Kontext der Abfrage zurück.
Eine Feldprojektion gibt den Wert eines Felds einer Entität zurück, sofern der Zugriff auf das ausgewählte Feld technisch darstellbar ist.
Die Feldprojektion ist die wichtigste Projektion, um Werte für Ausgabespalten, Einschränkungen sowie für die Gruppierung und Sortierung von Suchergebnissen aus der Datenbank zu beziehen.
Im Unterschied zur Collection Projektion liefert die Feldprojektion in der Regel Einzelwerte. Sofern ein Feld ausgewählt wird, das die n-Seite in einer (1:n)-Relation betrifft, generiert der Zugriff per Feldprojektion (mindestens intern) eine Zeile für jeden Wert der n-Seite.
Abhängig vom Datentyp des Felds, der in der Typdefinition für die betreffende Entität festgelegt ist, kann es sich bei einem Feldwert um einen simplen Wert oder ein mehr oder weniger komplexes Datenobjekt handeln.
►WICHTIG◄ Um bequem auf die Felder von Attributen einer Entität zuzugreifen, bietet sich im Allgemeinen die Verwendung eine der folgenden spezialisierten Projektionen an:
Typisiertes-Attribut-Projektion für den Zugriff auf Typisierte Attribute für einen bestimmten (Sub-)Typ
Attributprojektion für den Zugriff auf nicht-typisierte Attribute
Beide Projektionen bieten einen Parameter Feld an, über den optional auf ein bestimmtes Feld im Wert des Attributs zugegriffen werden kann.
►HINWEIS◄ Wenn die Feldprojektion eine Ausgabespalte (in einer CSV- oder Tupel-Suche) definiert, unterliegt der Feldwert ggf. einer gewissen "Aufbereitung"
Beispiele:
Ein Dynamischer Aufzählungswert wird in der Datenbank im Allgemeinen als Long-Wert (ordinal) persistiert, während in einer CSV-Ausgabespalte sein interner "Name" (name) erscheint und in einer Tupel-Suche ein DynamicEnumValue-Objekt (mit dem XML-Attribut name).
Wenn eine Feldprojektion in einer Suche für Benutzer oder Firmen das Feld address "liest", liefert die Ausgabe in einer CSV-Suche das String-Abbild der Adresse-Entität (z. B. 21052:de.lobster.scm.base.address.Address@1c6bbbc7), also wenig "benutzerfreundliche" Information abgesehen von der vorangestellten ID (hier: 21052). Dagegen liefert eine Tupel-Suche die "Adresse"-Entität komplett als komplexen Wert, sodass aus dem Suchergebnis im Nachgang sämtliche Details "gewonnen" werden können.
Konfiguration
Parameter |
Typ |
Beschreibung |
Name |
String |
Der optionale Parameter Name kann verwendet werden, um der Projektion einen (Alias-)Namen zuzuweisen.
|
Feld |
String
|
Rein technisch handelt es sich beim Parameter Feld um einen String, der im Kontext der Suche als Pfad zu einem Feld einer im Kontext der Abfrage enthaltenen Entitätstypen interpretierbar sein muss, sonst tritt beim Ausführen der Suche ein Fehler auf. In der Benutzeroberfläche erscheint für das Feld ein Auswahlfeld/Combobox-Element mit Suchfunktion, das per Dropdown alle möglichen im Kontext verfügbaren Pfade zu Feldern zur Auswahl anbietet. Soweit verfügbar werden neben den für den Pfad ausschlaggebenden internen Namen auch Lokalisierungstexte verwendet. ►HINWEISE◄
|
Beispiele
Einfaches Beispiel: Feld Einschränkung für einer Suche
Die Bedingung einer Suche für einen beliebigen Entitätstyp soll diejenigen Instanzen für die Entität herausfiltern, die im Feld "Änderungsdatum" (lastModified) denselben Zeitstempel aufweisen wie im "Erstelldatum" (created)
Die Suche listet also sämtliche Entitäten des gewählten Typs auf, die bisher genau einmal gespeichert wurden - beim "Erstellen" (s. Allgemein (Ereignisse) und deren Datenstand sich seitdem nicht mehr geändert hat.
Konfiguration:
Der Screenshot zeigt die Konfiguration für die Bedingung in einer Suche:
Der Name ist hier unerheblich, da er im Suchergebnis nicht erscheinen wird. ►HINWEIS◄ Wie im Screenshot zu sehen, erscheint der Feldname in beiden Fällen mit einem Stern (*). Es handelt sich also um indizierte Felder. |
|
►WICHTIG◄ Beim Konfigurieren der Feld Einschränkung ist zu beachten, dass das Kontextmenü für den Prüfwert (links) ausschließlich Projektionen zur Auswahl anbietet. Dagegen können für den Vergleichswert wahlweise Projektionen oder Wertauflöser (für konstante Werte) eingesetzt werden. Die Projektionen erscheinen im Kontextmenü für den Vergleichswert (rechts) in einer eigenen Kategorie "Suche".
Einfaches Beispiel: "Ausgabespalten" für Felder in einer Tupel- oder CSV-Suche
Im Kontext einer Tupel- oder CSV-Suche müssen alle "Ausgabespalten" ausdrücklich durch Projektionen definiert sein.
Im Ergebnis einer Suche für Benutzer sollen der "Benutzername" (username) und die zugeordnete(n) Rolle(n) erscheinen.
Konfiguration:
Im Kontext einer CSV-Suche für den Entitätstyp "Benutzer" (s. Benutzer) definieren wir zwei Ausgabenspalten:
►ANMERKUNG◄ Wie das folgende Laufzeitbeispiel zeigt, wäre die Beschriftung "ROLES" irreführend. |
|
Laufzeitbeispiel:
Wie das Abfrageergebnis (rechts) zeigt, erscheinen mehrere Zeilen für denselben USER, wenn diesem mehr als eine Rolle zur Auswahl steht. Die Feldprojektion auf das "mehrwertige" roles-Feld führt hier also zur Multiplikation der Benutzerdaten (hier: USER) je Rolle. Die ROLE-Spalte gibt immer nur genau eine ID einer Rolle aus. |
USER,ROLE |
►ANMERKUNG◄ Um mehrere Rollen innerhalb derselben USER-Zeile auszugeben, könnte man eine Collection Projektion verwenden.
Komplexeres Beispiel: "Rollennamen" anstelle der ID per JOIN beschaffen
Ausgehend vom vorherigen Beispiel soll die Rolle nicht mehr anhand der ID sondern über den Rollennamen (roleName) identifiziert werden.
Da im Benutzerkonto nur die Long-Referenz enthalten ist, müssen wir jede referenzierte Rolle-Entität in den Kontext der CSV-Suche ausdrücklich hinzuziehen, um auf den Rollennamen zugreifen zu können.
Dies können wir z. B. über einen Datenobjekt Join bewerkstelligen.
Konfiguration:
Der CSV-Suche aus der vorherigen Beispiel fügen wir einen Datenobjekt Join hinzu, der wie rechts abgebildet parametriert wird:
►HINWEIS◄ Da sich die Join Bedingung auf ein "mehrwertiges" Feld der Entität bezieht, wird die Bedingung gegen alle im Feld "Rollen" aufgeführten Einzelwerte geprüft. Der Join ordnet jedem roles-Eintrag die referenzierte Rolle (r) zu. |
|
|
Sobald der Datenobjekt Join konfiguriert ist, erweitert sich das Angebot für Pfade im Kontext unserer Projektionen:
|
|
Laufzeitbeispiel: USER,ROLE |
Die bestehenden Projektionen verwenden wir jetzt noch als Grundlage für eine Sortierung der Ergebnisliste Eine Feldprojektion für eine Projektion kann dazu über das Kontextmenü (s. Menü-Symbol links oben innerhalb der Feldprojektion) in die Zwischenablage kopiert und im Kontext der Sortierung wiederum über das Kontextmenü als per Wie im Screenshot zu sehen, soll unsere Sortierung zunächst nach dem Rollennamen und danach nach dem Benutzernamen erfolgen. ►HINWEIS◄ Ein Bezug zu einer bereits definierten "Ausgabespalte" über den Spalten-Alias (hier: ROLE, USER) kann ausgehend von der Sortierung (und auch Gruppierung) nicht hergestellt werden. Dieselbe Projektion muss bei Bedarf (wie in unserem Beispiel) also mehrfach angelegt werden. Der verwendete Name ist dabei unerheblich, wurde hier aber beim Kopieren "mitgenommen". |
|
Laufzeitbeispiel: USER,ROLE |