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.

images/download/attachments/157876346/image-2023-11-7_15-59-3-version-1-modificationdate-1699369144404-api-v2.png

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:

  1. 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.

  2. 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).

HINWEISOptional können über Joins weitere Datenquellen in den Subselect eingebunden werden.

Spaltenprojektion
für den Subselect

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.

  • Wenn keine Spaltenprojektion für den Subselect definiert wird, liefert die Subselect Projektion den Long-Wert 1 als Rückgabewert. Es tritt also keine Fehlermeldung auf, wenn versehentlich vergessen wird eine Projektion festzulegen, außer der Datentyp Long kann im Kontext nicht verarbeitet werden.

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
und
Feld der Entität 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.

  • Die Pfad-Auswahl für das Feld für Join bezieht sich auf den Entitätstyp der übergeordneten Suche (_parentQuery).

  • Die Pfad-Auswahl für das Feld der Entität für Join bezieht sich auf den Entitätstyp im Subselect, den der Parameter Entität definiert.

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:

images/download/attachments/157876346/image-2023-11-9_10-16-19-version-1-modificationdate-1699521380383-api-v2.png

  • Die Parameter Feld für Join und Feld der Entität für Join fordern eine Übereinstimmung zwischen dem Feld "Besitzer" (ownerId) der übergeordneten Entität und dem Feld "ID" (id) des Firmenkontos.

  • Die Bedingung mit der Feld Einschränkung verhindert, dass der Subselect Daten einer "Gruppe" zurückgibt, die als "Besitzer" referenziert ist.

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.

  • Das Präfix _parentQuery in Feld-Pfaden der Konfiguration verweist -soweit erforderlich - auf die Entität aus der übergeordneten Suche.

  • Feld-Pfade ohne dieses Präfix beziehen sich auf den im Subselect gegebenen Kontext, also entweder auf Felder der Entität oder Pfade zu Feldern von über Joins im Subselect eingebundenen weiteren Entitäten.

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:

images/download/attachments/157876346/image-2023-11-9_10-20-36-version-1-modificationdate-1699521637361-api-v2.png

  • Im Prüfwert (links) wird das Präfix _parentQuery verwendet, um die Entität aus der übergeordneten Suche zu referenzieren.

  • Im Vergleichswert (rechts) greift die Feldprojektion ohne Präfix direkt auf das Feld "ID" (id) der Subselect-Entität zu.

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.

  • Der vordefinierte Name der Subselect Projektion lautet stets owner.

  • Der Parameter Entität bezieht sich immer auf den Entitätstyp "Firmenkonto" (CompanyAccount), die exklusiv "Besitzer" von Entitäten relevant ist.

  • Die vordefinierte Spaltenprojektion für Subselect verwendet eine Textverkettungsprojektion, um den Long-Wert aus dem Feld "ID" (id) über eine als Literale Projektion definierte Trennzeichenkette (Leer/Minus/Leer) mit einer Feldprojektion auf das Adressfeld "Name" (address.name1) zu verketten.

  • Die vordefinierte Beziehung zwischen dem Entitätstyp im Kontext verwendet die vereinfachte Notation für eine direkte Übereinstimmung zwischen zwei Feldern:

    • Als Feld für Join gilt immer das Feld "Besitzer" (ownerId) der Entität in der übergeordneten Suche.

    • Als Feld der Entität für Join gilt immer das Long-Feld "ID" (id), das das per Subselect einzubindende Firmenkonto identifiziert.

images/download/attachments/157876346/image-2023-11-13_16-0-17-version-1-modificationdate-1699887622896-api-v2.png

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:

images/download/attachments/157876346/image-2023-11-13_14-53-9-version-1-modificationdate-1699883595047-api-v2.png

  • 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.

  • Der vordefinierte Name der Subselect Projektion lautet stets numberOfAssociations.

  • Im Parameter Entität ist immer der für den Kontext relevante konkrete Entitätstyp vorbelegt, der auf die Basisklasse "Zuweisungsdetails" (BaseAssociation) zurückgeht.
    Hier: "Erfassungsmaske > Zuordnung" (EntityFormAssociation).

  • Die vordefinierte Spaltenprojektion für Subselect bezieht sich auf eine Aggregation mit Typ "Anzahl" für das Feld "ID" (id) als Projektion.

  • Die vordefinierte Beziehung zwischen dem Entitätstyp im Kontext - hier: "Erfassungsmaske" (EntityForm) verwendet die vereinfachte Notation für eine direkte Übereinstimmung zwischen zwei Feldern:

    • Als Feld für Join gilt immer die "ID" (id) der Entität in der übergeordneten Suche.

    • Als Feld der Entität für Join gilt immer das Long-Feld associatedObjectId, das die Basisklasse "Zuweisungsdetails" für die Referenz auf das Ziel einer Zuordnung vorsieht.

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.

images/download/attachments/157876346/image-2023-11-13_15-25-29-version-1-modificationdate-1699885534722-api-v2.png

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:

  • Der Subselect bezieht sich auf die Entität "Firmenkonto".

  • Als Spaltenprojektion für Subselect die eine Feldprojektion, die über den Pfad address.countryCode auf das Adressfeld "Land" der "Firmenkonto"-Enität zugreift.

  • Die Bedingung für den Subselect fordert eine Übereinstimmung zwischen dem Feld für Join "Firmen" (companies) der übergeordneten Entität "Benutzer" und dem Feld "ID" (id) der Subselect-Entität "Firma".

Diese Konfiguration liefert in einer Tupel-Suche alle Land-Werte aller "Firmen" für jeden Benutzer.

  • Beziehen sich mehrere Firmen eines Benutzers auf dasselbe Land, dann erscheint dieses Land mehrfach in der Collection.

    Beispiel: [DE, FR, DE, GB, US]

  • Ist für eine Firma kein "Land" angegeben, dann erscheint kein Hinweis darauf in der Collection.

images/download/attachments/157876346/image-2023-11-13_17-36-4-version-1-modificationdate-1699893369607-api-v2.png

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.

  • Das Gruppieren der Ergebnisse nach der einzigen Spaltenprojektion soll alle redundanten Werte eliminieren, sodass nur eindeutige Land-Werte als "Gruppennamen" als Rückgabewerte erscheinen.

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.

images/download/attachments/157876346/image-2023-11-13_18-0-9-version-1-modificationdate-1699894814757-api-v2.png

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.

images/download/attachments/157876346/image-2023-11-13_17-50-48-version-1-modificationdate-1699894254283-api-v2.png