Wenn ( Case ) Projektion

Projektion - Kurzfassung

Zweck: Liefert einen bedingten Rückgabewert per Fallunterscheidung mit einer variablen Anzahl von Zweigen.

images/download/attachments/106963020/image-2023-11-3_11-7-46-version-1-modificationdate-1699006081485-api-v2.png


Die Wenn ( Case ) Projektion liefert einen bedingten Rückgabewert per Fallunterscheidung mit einer variablen Anzahl von Zweigen, für die unterschiedliche Projektionen konfiguriert werden können.

Je Zweig kann eine Bedingung (über Einschränkungen) definiert werden. Die Bedingungen werden von links nach rechts nach folgendem Schema "durchgeprüft":

  • Ist die vorhandene Bedingung erfüllt oder existiert keine Bedingung, bestimmt die Projektion im zugehörigen Zweig den Rückgabewert für die Wenn ( Case ) Projektion. Weitere Zweige sind dann irrelevant.

  • Ist eine Bedingung vorhanden aber nicht erfüllt ist, dann wird der nächste Zweig geprüft. Existiert kein weiterer Zweig wird "Kein Wert" ($null) zurückgegeben.


WICHTIG◄ Wenn eine Wenn ( Case ) Projektion mehr als einen Zweig verwendet, müssen alle konfigurierten Projektionen denselben Datentyp liefern, sonst kommt es datenbankseitig zu Fehlern. Lediglich "Kein Wert" ($null) ist mit allen anderen Datentypen kompatibel.


Konfiguration

Parameter

Typ

Beschreibung

Name

String

Der optionale Parameter Name kann verwendet werden, um der Projektion einen (Alias-)Namen zuzuweisen.

  • Wenn kein Name angegeben ist, erscheint ggf. der Text null als Spaltenname. Es wird also ausnahmsweise nicht auf Spaltennamen von konfigurierten Projektionen (in den Zweigen) zugegriffen.

Zweige

images/download/attachments/106963020/image-2023-11-3_14-45-28-version-1-modificationdate-1699019127906-api-v2.png

Initial beinhaltet die Wenn ( Case ) Projektion bereits einen Zweig, für den sofort eine Bedingung oder eine Projektion konfiguriert werden kann.

  • Das Menüsymbol (ganz links oben im Screenshot) wird je Zweig wiederholt. Es beinhaltet u. a. Funktionen zum Kopieren und Einfügen (für ganze Zweige).

  • Über das images/s/-95e2zf/9012/8yg2g7/_/images/icons/emoticons/add.svg -Symbol (rechts im Screenshot) kann ein zusätzlicher Zweig neu erstellt oder aus der Zwischenablage eingefügt werden.



images/download/attachments/106963020/image-2023-11-3_15-37-26-version-1-modificationdate-1699022245481-api-v2.png

Die Reihenfolge (und damit Priorität) der Zweige kann über die Baumansicht (ganz links im Editor) per Drag & Drop angepasst werden.

  • Der Screenshot (links) zeigt ein Beispiel mit zwei Zweigen, die der Baum im caseWhens-Knoten anzeigt.

  • Drag & Drop-Aktionen für die Elemente im caseWhens-Knoten ändern unmittelbar die Reihenfolge der Zweige.

HINWEIS◄ Häufig enthält eine Fallunterscheidung einen "Sonst"-Zweig ohne Bedingung. Wenn man diesen an eine frühere Position verschiebt, werden nachfolgende Zweige unwirksam.

Bedingung


images/download/attachments/106963020/image-2023-11-3_14-54-0-version-1-modificationdate-1699019639795-api-v2.png


Das Raute-Symbol kennzeichnet den Platzhalter für die Konfiguration einer Bedingung innerhalb eines Zweigs.

  • Über das images/s/-95e2zf/9012/8yg2g7/_/images/icons/emoticons/add.svg -Symbol kann der Konfiguration die erste von ggf. mehreren Einschränkungen hinzugefügt werden.

  • Wird keine Bedingung definiert, wird der Zweig so behandelt, als wäre eine Bedingung erfüllt.

HINWEIS◄ Die Symbolik für Regeln (s. Regeln und Werte) sieht aus gutem Grund ähnlich aus . Allerdings kann man für die Bedingung innerhalb einer Suche keine Regeln verwenden. Die Bedingung muss datenbankseitig ausgewertet werden können. Regeln und Werte sind allerdings nur unmittelbar in Lobster Data Platform / Orchestration auswertbar. In besonderen Anwendungsfällen kann es trotzdem sinnvoll sein, Ergebnisse von Regeln oder Werten über Einschränkungen in die Logik der Bedingung einzubinden. Solche Ergebnisse können allerdings nur als Konstanten in die von der Suche generierte Datenbankabfrage eingehen.

Projektion


images/download/attachments/106963020/image-2023-11-3_15-25-36-version-1-modificationdate-1699021535687-api-v2.png


Das Menüsymbol (ganz links innerhalb der Projektion-Konfiguration) bietet per Kontextmenü Projektionen zur Auswahl an.

  • Ist keine Projektion definiert, liefert der Zweig "Kein Wert" ($null), falls sein Rückgabewert gefragt sein sollte.

Beispiele

Typisches Beispiel: Bedingtes Aufbereiten von Adressdaten

images/download/attachments/106963020/image-2023-11-3_16-56-52-version-1-modificationdate-1699027011263-api-v2.png

Eine Tupel-Suche soll die Daten von Adressen so aufbereiten, dass drei Projektionen die "Textzeilen" für die Anschrift beim Postversand vorbereiten:

  • Die erste Zeile (ADDRESS_LINE_1) soll den Text im Feld "Name" (name1) direkt wiedergeben.

  • Die zweite Zeile (ADDRESS_LINE_2) soll nach folgender Fallunterscheidung befüllt werden:

    • Wenn das Feld "Postfach" (postboxNumber) gefüllt ist, soll der englisch lokalisierte Feldname über ein Leerzeichen mit dem Wert verkettet werden.

    • Anderenfalls soll das Feld "Straße" (street1) über ein Leerzeichen mit dem Feld "Hausnummer" (streetNo) verkettet werden.

  • Die dritte Zeile (ADDRESS_LINE_3) soll eine statische Textverkettung nach folgendem Schema ausgeben:

    • "Land" (countryCode) gefolgt von einem Minuszeichen als Trennzeichen

    • "Postleitzahl" (zipcode) gefolg von einem Leerzeichen als Trennzeichen

    • "Ort" (city)

Laufzeitbeispiel:

<core:TupleSearchResult maxResults="100" count="84">
<columns>
<name>ADDRESS_LINE_1</name>
<name>ADDRESS_LINE_2</name>
<name>ADDRESS_LINE_3</name>
</columns>
<result>
<row>
<item xsi:type="xsd:string">fixIT Ltd.</item>
<item xsi:type="xsd:string">Uphill 247</item>
<item xsi:type="xsd:string">IE-X64GB Array on Byte</item>
</row>
<row>
<item xsi:type="xsd:string">MEGATRUST Inc.</item>
<item xsi:type="xsd:string">Postbox no. XYZ0815</item>
<item xsi:type="xsd:string">MT-SCM Smart City</item>
</row>
...
</result>
</core:TupleSearchResult>

Konfiguration:

Als Anwendungsbeispiel für die Wenn ( Case ) Projektion ist vor allem die Definition für die zweite Adresszeile (ADDRESS_LINE_2) relevant, da der Inhalt abhängig von einer Bedingung aufbereitet werden soll.

images/download/attachments/106963020/image-2023-11-3_17-20-32-version-1-modificationdate-1699028432033-api-v2.png

Die Wenn ( Case ) Projektion wird wie im Screenshot gezeigt konfiguriert:

  • Als Name für die Ausgabespalte wird der Text ADDRESS_LINE_2 direkt eingetragen.

  • Wir richten zwei Zweige für die beiden zu unterscheidenden Fälle ein:

    • Der erste Zweig (links) soll den Fall betreffen, dass ein "Postfach" angegeben ist:

    • Der zweite Zweig (rechts) regelt den Standardfall (kein "Postfach" angegeben) über eine weitere Textverkettungsprojektion.

      • Es ist keine Bedingung konfiguriert, also greift dieser Zweig immer dann, wenn die Bedingung für den ersten Zweig nicht erfüllt ist.

HINWEIS◄ Der Fallunterscheidung könnten weitere Zweige hinzugefügt werden, z. B. um die Aufbereitung mit und ohne "Hausnummer" zu differenzieren oder das optionale zweite Feld für die Straße (street2) einzubeziehen. Natürlich is es auch möglich, eine weitere Instanz der Wenn ( Case ) Projektion innerhalb einer Projektionen zu verwenden, um einen hierarchischen "Entscheidungsbaum" darzustellen.

ANMERKUNG◄ Das Präfix (Feldname) für das "Postfach" innerhalb der im ersten Zweig konfigurierten Textverkettungsprojektion liefert eine Literale Projektion, deren Literal einen Wert aus Sprachverwaltung-Wertauflöser mit folgender Konfiguration verwendet:

  • Das Bundle referenzieren wir über den Klasse-Wertauflöser, für den die Klasse "Adresse" (Address) ausgewählt ist.

  • Als Resource ist der interne Feldname postboxNumber angegeben.

  • Wenn die Option Statisch ausgewählt ist, kann man im Parameter Sprache per Auswahlfeld/Combobox die gewünschte Sprache statisch auswählen. Hier wählen wir "Englisch", so dass mit Standard-Lokalisierung immer das Präfix "Postbox no." erscheint.

images/download/attachments/106963020/image-2023-11-3_17-31-33-version-1-modificationdate-1699029092700-api-v2.png

Komplexeres Beispiel: Bedingte Auswertung für ein Firmen- und Adressattribut

Innerhalb eine Suche soll geprüft werden, ob die Empfängeradresse einer Sendung (s. Sendungen) sich auf ein Land bezieht, das in einer "schwarzen Liste" für die Belieferung aufgeführt ist.

  • Die "schwarze Liste" ist im Kontext durch eine Variable blacklist gegeben, die eine Liste von Dynamischen Aufzählungswerten vom Typ Land enthält.

  • Die Empfängeradresse der Sendung wird über das "Firmen- und Adressattribut" mit dem (Sub-)Typ "Empfänger" (CNE) definiert:

    • Wenn für das CNE-Attribut eine explizite "Adresse" (address) angegeben ist, soll diese ausschlaggebend sein.

    • Wenn keine explizite "Adresse" (address) angegeben ist, sollte das Attribut per Konvention stattdessen eine "Firma" (company) referenzieren, deren Adresse (company.address) dann in die Prüfung eingehen soll.

Konfiguration:

images/download/attachments/106963020/image-2023-11-6_9-57-49-version-1-modificationdate-1699261071690-api-v2.png

Wir beschränken uns hier auf die Feld Einschränkung, die als "Bestanden" gelten soll, wenn das "Empängerland" nicht in der "schwarzen Liste" enthalten ist.

  • Im Prüfwert (links) kommt eine Verkettete Projektion zum Einsatz, die es uns ermöglicht beim "Auflösen" des Firmen- und Adressattributs auf der Ebene der Adresse eine Fallunterscheidung einzusetzen:

    • Die Typisiertes-Attribut-Projektion greift zunächst nur auf den kompletten Attributwert zu:

      • Der Parameter Attribut spezifiziert, dass es um den Attributtyp "Firmen- und Adressattribut" gehen soll.

      • Der Parameter Typ spezifiziert den gesuchten (Sub-)Typ "Empfänger" (CNE) aus der Dynamischen Aufzählung Firmentyp für den Attributtyp "Firmen- und Adressattribut".

      • Für den Parameter Feld erfolgt keine Angabe, damit die Entscheidung über das ausschlaggebende Feld in der nächsten Stufe der Verkettung getroffen werden kann.

    • Innerhalb der Wenn ( Case ) Projektion sind zwei Zweige konfiguriert:

      • Der erste Zweig stellt per Feld Einschränkung als Bedingung fest, ob das address-Feld des Attributs gefüllt (nicht $null) ist. und gibt in diesem Fall die angegebene Adresse (address) an die folgende Stufe der Verkettung weiter.

      • Der zweite Zweig verwendet keine Bedingung. Er kommt genau dann zum Zug, falls das address-Feld nicht gefüllt ist und gibt dann die Firmenadresse (company.address) an die folgende Stufe der Verkettung weiter.

    • Die abschließende Feldprojektion bezieht sich auf das auszuwertende Feld "Land" (countryCode), das im Listenwert der blacklist-Variable nicht gefunden werden soll.

  • Den Vergleichswert (rechts) stellt die Variable blacklist, in Form einer hier nicht konkretisierten Liste von Land-Werten.

HINWEIS◄ Die Verkettete Projektion und die Wenn ( Case ) Projektion könnten "vermieden" werden, indem man stattdessen sinngemäß folgende Logik prüft:
(<CNE>.address.countryCode not in blacklist) OR ((<CNE>.address.countryCode == $null) AND (<CNE>.company.address,countryCode not in blacklist))
Dieses logische Aggregat kann durch Verknüpfen von mehreren Instanzen der Feld Einschränkung umgesetzt werden. Der oben gezeigte Lösungsansatz vermeidet im Unterschied dazu über die Verkettete Projektion den wiederholten Zugriff auf das Typisierte Attribut (im Aggregat symbolisch als <CNE> bezeichnet) und durch die innerhalb eingesetzte Wenn ( Case ) Projektion den redundanten Bezug zur Listenvariable (blacklist) als Vergleichswert.

ANMERKUNG◄ Auf Sonderfälle ("Attribut existiert nicht", "Keine Firma referenziert", "Firma referenziert keine Adresse", "Adresse spezifiziert kein Land") wird hier nicht eingegangen. Wir unterstellen, dass die Feld Einschränkung in einem Kontext ausgeführt ist, in dem diese Fälle bereits ausgeschlossen sind.

Sonderfall: Auswerten einer Regel in der Bedingung einer Wenn ( Case ) Projektion

Eine CSV-Suche für Benutzer soll neben der internen "ID" (id) das Feld "Benutzername" (username) als Projektion lesbar ausgeben, wenn mindestens eine der folgenden Bedingungen erfüllt ist:

  • Im Ausführungskontext verweist auf eine bestimmte Rolle ("Administrator") als Rolle der Session.

  • Der "Besitzer" (ownerId) eines aufgelisteten Benutzerkontos ist die Firma der Session.

Trifft keine der beiden Bedingungen zu, soll anstelle des Benutzernamens der statische Text ************ erscheinen.

Konfiguration:

images/download/attachments/106963020/image-2023-11-6_11-24-51-version-1-modificationdate-1699266294014-api-v2.png

Die bedingte Ausgabe für das Feld "Benutzername" (username) wird durch eine Wenn ( Case ) Projektion wie folgt erreicht:

  • Als Name für die Ausgabespalte weisen wir den internen Feldnamen (username) zu, um zu vermeiden, dass null als Spaltentitel erscheint.

  • Die Wenn ( Case ) Projektion verwendet zwei Zweige:

    • Der erste Zweig beinhaltet die auszuwertende Bedingung mit zwei Instanzen der Feld Einschränkung in einer ODER-Verknüpfung:

    • Über den zweiten Zweig der Fallunterscheidung liefert eine Literale Projektion ohne explizite Bedingung den statischen Text ************, der ausgegeben wird, wenn die Bedingung im ersten Zweig nicht erfüllt ist.

Laufzeitbeispiel:

Im Kontext einer Anmeldung ohne die Rolle "Administrator" und mit einer Firma der Session, deren "ID" (id) 1902 lautet, liefert die Suche z. B. folgende Werte:

id,ownerId,username
51,501,************
151,502,************
4201,1902,jdsmith0815
4202,1902,jmmustermann
4203,1902,jmustermann
4204,1902,mjmartinez123
...