Subselect Projektion
Projektion - Kurzfassung
Zweck: Bietet eine einfache Möglichkeit, einen einzelnen simplen Wert (bzw. in besonderen Fällen auch mehrere simple Werte) eines beliebigen Entitätstyps in den Kontext der übergeordneten Suche einzubinden.
Eine Subselect Projektion bietet eine einfache Möglichkeit, einen einzelnen simplen Wert (bzw. in besonderen Fällen auch mehrere simple Werte) aus den Daten von Entitäten eines beliebigen Entitätstyps in den Kontext der übergeordneten Suche (_parentQuery) einzubinden.
Der Begriff Subselect bezieht sich auf die Methodik zum Einbinden von Daten einer "fremden" Entität als "Unterabfrage", die konkrete Werte für unterschiedliche funktionale Abschnitte (z. B. Ausgabespalten oder Einschränkungen) der übergeordneten Suche bereitstellen kann.
Das Einsatzgebiet der Subselect Projektion weist Schnittmengen mit dem von Joins auf. Allerdings gibt es Konstellationen beim Einbinden oder Nachschlagen von Daten, die nur auf dem einen oder anderen Weg realisiert werden können.
Einerseits ist eine Subselect Projektion mit Blick auf die Performanz einer Suche oft "teurer", weil die Daten des eingebundenen Entitätstyps "zeilenweise" und daher oft wiederholt (und ggf. redundant) abgerufen werden.
Andererseits bietet die Subselect Projektion Freiheitsgrade für Nebenbedingungen und die Aufbereitung der eingebundenen Daten (z. B. Gruppierung und Aggregation), die im Kontext von Joins nicht verfügbar sind.
Beim Einsatz der Subselect Projektion sind folgende Einschränkungen zu beachten:
Als Spaltenprojektion für Subselect können nur Projektionen verwendet werden, die Werte liefern, die datenbankseitig "simpel" (durch genau eine Spalte) repräsentiert sind.
Beispiel: Aufzählungswerte
Ein Aufzählungswert wird auf der Datenbank-Ebene entweder als Long-Wert ("Ordinal") oder in Ausnahmefällen als String ("Name") gespeichert. Jedenfalls verwendet die Datenbank einen simplen Wert, auch wenn dieser im XML komplex erscheint.
Werte aus Dynamischen oder statischen Aufzählungen eignen sich daher problemlos als Spaltenprojektion für Subselect.
Beispiel: Datumswerte
Timestamp-Feld - z. B. das "Erstelldatum" (created) für eine beliebige Entität - eignet sich problemlos als Spaltenprojektion für Subselect.
Ein DateTime-Feld - z. B. das "Passwort Ablaufdatum" (passwordExpiryDate) für Benutzer - eignet sich nicht als Spaltenprojektion für Subselect, weil ein Datum/Uhrzeit-Feld auf der Datenbank-Ebene zwei "Spalten" (für UTC-Millisekunden und Zeitzone) beansprucht.
Die UTC-Millisekunden eines DateTime-Felds - z. B. das Feld "Passwort Ablaufdatum.Datumswert" (passwordExpiryDate.dateValue) für Benutzer - eignet sich problemlos als Spaltenprojektion für Subselect.
Beispiel: Listenfelder
Grundsätzlich können "Listenfelder" - z. B. "Übergeordnete Firmen" (parentCompanies) für Firmen - durchaus als Spaltenprojektion für Subselect verwendet werden.
Allerdings darf die Spaltenprojektion für Subselect nur mehrere Werte liefern, wo diese auch verarbeitet werden können:
Definiert die Subselect Projektion eine Ausgabespalte (in einer Tupel- oder CSV-Suche), dann ist nur ein Einzelwert als Rückgabewert zulässig. Mit einem "Listenfeld" als Spaltenprojektion für Subselect wird die Suche zur Laufzeit mit Fehler abgebrochen, sobald das Listenfeld mehrere Werte für dieselbe Ergebniszeile liefert.
Wo "mehrwertiger" Inhalt zulässig ist - z. B. auf der rechten Seite einer Feld Einschränkung mit dem in-Vergleichstyp - kann ein "Listenfeld" problemlos als Spaltenprojektion für Subselect verwendet werden.
►WICHTIG◄ Der Einsatz einer Collection Projektion als Spaltenprojektion für Subselect innerhalb einer Subselect Projektion um eine Liste in eine Ausgabespalte zu projizieren ist aus technischen Gründen nicht sinnvoll möglich.
Allerdings ist der umgekehrte Weg zielführend: Eine Subselect Projektion mit einem "Listenwert" als Spaltenprojektion für Subselect kann in einer Collection Projektion eingesetzt werden, um Werte für eine Collection bereitzustellen.
Die Subselect Projektion darf nur genau ein Ergebnis liefern, sofern der Kontext nicht ausdrücklich auf eine Liste abzielt.
Nur in der übergeordneten Suche kann man die Eindeutigkeit des Ergebnisses erzwingen, indem man dem Parameter "Maximale Ergebnisse" den Wert 1 einstellt. Die Subselect Projektion kennt dagegen kein "Limit" für die Anzahl der "Ergebniszeilen", also kann man auch nicht einfach das "erste Ergebnis" als Rückgabewert definieren.
Ggf. kann eine Aggregation in der Spaltenprojektion für Subselect genutzt werden, um z. B. den Minimal- oder Maximalwert aus mehreren Werten auszuwählen.
Innerhalb Collection Projektion
►WICHTIG◄ Im Unterschied zur übergeordneten Suche greifen für den Subselect keine Zugriffbeschränkungen. Falls sich der Parameter Entität auf denselben Entitätstyp wie die übergeordnete Suche bezieht, berücksichtigt der Subselect grundsätzlich alle existierenden Instanzen dieses Typs, während die übergeordnete Suche nur eine echte oder unechte Teilmenge zurückgibt, nämlich die Entitäten, für die im Ausführungskontext Lesezugriff besteht.
Konfiguration
Parameter |
Typ |
Beschreibung |
Name |
String |
Der optionale Parameter Name kann verwendet werden, um der Projektion einen (Alias-)Namen zuzuweisen. |
Entität |
Entitätstyp |
Die Auswahl für den Parameter Entität bestimmt die primäre Datenquelle für den Subselect. Es können nur die im Dropdown angebotenen Entitätstypen ausgewählt werden. Für den Subselect können dabei auch Entitätstypen ausgewählt werden, die in der übergeordneten Suche nicht direkt als "Entität" verfügbar sind (z. B. Attribute). ►HINWEIS◄ Optional können über Joins weitere Datenquellen in den Subselect eingebunden werden. |
Spaltenprojektion |
Projektion |
Die Spaltenprojektion für den Subselect definiert den Rückgabewert (bzw. die Rückgabewerte) der Sub-Suche. Hier können beliebige Projektionen verwendet werden, solange diese Werte liefern, die datenbankseitig "simpel" - also durch genau eine Spalte repräsentiert - sind.
|
Joins |
Join |
Dem Subselect können über Joins weitere Datenquellen hinzugefügt werden, die dann für Projektionen in anderen Bereichen innerhalb der Subselect Projektion zur Verfügung stehen. |
Feld für Join |
Feld-Pfade |
Die Parameter Feld für Join und Feld der Entität für Join können optional genutzt werden, um die Beziehung zwischen den Entitätstypen im Subselect und der übergeordneten Suche per Übereinstimmung (==) zwischen zwei Feldern zu definieren.
Sofern die Übereinstimmung zweier Felder als einzige Bedingung für die Zuordnung von Daten per Subselect ausreicht, kann auf die Konfiguration einer Bedingung komplett verzichtet werden. Wird zusätzlich eine Bedingung formuliert, wird eine über die Parameter Feld für Join und Feld der Entität für Join definierte "Übereinstimmung" wie in einer UND-Verknüpfung gemeinsam mit der Bedingung berücksichtigt. Beispiel: In einer übergeordneten Suche für einen beliebigen Entitätstyp soll ein Subselect Informationen aus dem Konto der Firmenwert "nachschlagen", laut der übergeordneten Suche als "Besitzer" (ownerId) der jeweiligen Entität gilt. Allerdings sollen dabei keine Informationen für Firmenkonten "weitergegeben" werden, die über das Feld "Metatyp" (metaType) dem Firmen-Metatyp "Gruppe" (GROUP) zugeordnet sind:
|
Bedingung |
Einschränkung |
Der Parameter Bedingung ermöglichst die Konfiguration von Einschränkungen für die Zuordnung von Instanzen der Entität im Subselect zu Entitäten in der übergeordneten Suche.
Die folgende alternative Konfiguration für das obige Beispiel demonstriert, wie die obige Beziehung als Bedingung formuliert werden kann, ohne die Parameter Feld für Join und Feld der Entität für Join zu verwenden:
|
Gruppierung |
Projektion |
Der Subselect Projektion können optional Projektionen für die Gruppierung von Ergebnissen zugewiesen werden. Das "Gruppieren" von Ergebnissen zielt typischerweise entweder darauf auf, die Ausgabe redundanter Ergebnisse zu verhindern oder per Aggregation Teilergebnisse je Gruppe zu ermitteln. ►WICHTIG◄ Wenn eine Subselect Projektion gruppierte Ergebnisse im Kontext einer Collection Projektion als Ausgabespalte bereitstellen soll, muss unter Gruppierung aus technischen Gründen immer auch eine Projektion für den Pfad _parentQuery.id konfiguriert sein. |
Beispiele
Typisches Beispiel: Firmennamen für die "Besitzer" Spalte in einer Übersicht nachschlagen
Jede Entität in Lobster Data Platform / Orchestration verfügt über ein Feld "Besitzer" (ownerId) in dem ein Long-Wert als Referenz auf die "ID" (id) einer Firma (s. Firmen) gespeichert werden kann.
Der praktische Nutzen von solchen rein-numerischen "Zeigerwerten" als Referenz ist begrenzt. Damit in Übersichten für Entitäten (z. B. Benutzer) erkennbar ist, welche Firma sich hinter einem internen ownerId-Wert versteckt, wird die Referenz in der Spalte "Besitzer" per Standard durch einen Subselect Projektion aufgelöst, die neben der "ID" (id) das Adressfeld "Name" (address.name1) ausgibt, ohne dass dafür das komplette Firmenkonto per Join oder Einbetten herangezogen werden müsste.
Konfiguration:
Über den Ribbon-Pfad "Einstellungen > Liste: Bearbeiten" gelangt man ausgehend von einer Liste mit einer "Besitzer"-Spalte mit wenigen Klicks zu den zugehörigen Datengrid-Einstellungen. Dort findet man auch die vordefinierte Konfiguration für die Subselect Projektion, auf der diese Spalte immer beruht.
|
|
►HINWEIS◄ Die generischen Spalten für die Angaben "Erstellt von" (creatorId) und "Zuletzt geändert von" (lastModifierId) verwenden nach dem hier vorgestellten Prinzip je eine Subselect Projektion, um das Feld "Benutzername" (username) aus dem referenzierten Benutzerkonto einzubinden.
Komplexeres Beispiel: "Zuordnungen" zählen per Aggregation
Viele Typen von Konfigurationselementen in Lobster Data Platform / Orchestration hängen direkt oder indirekt von der Auswertung von ihnen zugewiesenen Zuordnungskriterien ab, wenn es um Auswahlentscheidungen für ein situationsabhängiges Erscheinungsbild, die Zugriffkontrolle oder die "Anwendbarkeit" von bestimmten Elementen geht.
Welche Zuordnungskriterien Einfluss auf welche Konfigurationen haben bzw. haben können, regeln mehr oder weniger spezifische Entitätstypen für "Zuordnungen". Übersichten für "zuordnungspflichtige" Entitäten enthalten meistens eine Standardspalte "Zuordnungen", die die Anzahl der bestehenden Zuordnungen anzeigen und das Anlegen und Entfernen von Zuordnungen ermöglichen.
Laufzeitbeispiel:
In einer Liste von Erfassungsmasken für Benutzer gibt die Spalte "Zuordnungen" an, ob und falls ja wie viele Zuordnungskriterien mit der jeweiligen Maske verknüpft sind.
Der konkrete Zahlenwert ist nicht Bestandteil der für die Erfassungsmaske gespeicherten Daten, sondern wird beim Anzeigen der Übersicht durch eine Subselect Projektion immer neu ermittelt.
Konfiguration:
Über den Ribbon-Pfad "Einstellungen > Liste: Bearbeiten" gelangt man ausgehend von einer Liste mit einer "Zuordnungen"-Spalte mit wenigen Klicks zu den zugehörigen Datengrid-Einstellungen. Dort findet man auch die vordefinierte Konfiguration für die Subselect Projektion, auf der diese Spalte immer beruht.
Wir stellen hier beispielhaft die Definition für "Zuordnungen" für den Entitätstyp "Erfassungsmaske" (EntryForm) vor.
Effektiv unterscheiden sich die vordefinierten Projektionen für die Spalte "Zuordnung" nur durch die Auswahl für die Entität, die immer auf den Kontext abgestimmt sein muss. ►HINWEIS◄ Einige zuordnungspflichtige Konfigurationen (z. B. Eigene Übersichten und "Datengrid-Einstellungen") werden nur als Typen innerhalb der gemeinsamen Klasse "Client-Einstellungen" (ClientPreferences) behandelt, sodass sich diese auch die Klasse "Client-Einstellungen > Zuordnung" (ClientPreferencesAssociation) für die "Zuweisungsdetails" teilen. Innerhalb der Subselect Projektion muss der Typ dabei nicht geprüft werden, da die associatedObjectId auch ohne Bezug zum Typ eindeutig ist und diese damit impliziert. |
|
Komplexeres Beispiel: Länderkennzeichen der Firmen je Benutzer "einsammeln"
Eine Tupel-Suche für die Entität Benutzer soll für jeden Benutzer in einer "Listenspalte" aller Länder benennen, die Sitz von Firmen sind, in deren Kontext sich der Benutzer anmelden kann.
Konfiguration:
Die rechts abgebildete Konfiguration zeigt die Konfiguration einer Collection Projektion (ca_countries), in der als Feld der Collection eine Subselect Projektion verwendet wird:
Diese Konfiguration liefert in einer Tupel-Suche alle Land-Werte aller "Firmen" für jeden Benutzer.
|
|
Die folgende Anpassung der Konfiguration soll die mehrfache Nennung desselben Land-Werts innerhalb der Collection verhindern:
Die Feldprojektion in der Spaltenprojektion für Subselect wurde in die Zwischenablage kopiert und unter Gruppierung eingefügt.
Allerdings tritt beim Ausführen der Suche mit dieser Variante der Subselect Projektion ein Fehler wie der folgende auf: ERROR: column "t0.id" must appear in the GROUP BY clause or be used in an aggregate function Die im Fehler referenzierte Spalte "t0.id" bezeichnet das "ID"-Feld der Entität in der übergeordneten Suche, das aus technischen Gründen in der Subselect-Gruppierung vorliegen muss, damit diese im Kontext der übergeordneten Collection Projektion verwendet werden kann.
Mit dieser Ergänzung - Feldprojektion für den Pfad _parentQuery.id als zusätzliche Projektion innerhalb der Gruppierung funktioniert die Suche. ►ANMERKUNG◄ Die zusätzliche Feldprojektion wurde hier als oberstes Gruppierungskriterium eingefügt, das ist nicht erforderlich, aber logisch sinnvoller, als an der untergeordneten zweiten Position. |
|