Wenn ( Case ) Projektion
Projektion - Kurzfassung
Zweck: Liefert einen bedingten Rückgabewert per Fallunterscheidung mit einer variablen Anzahl von Zweigen.
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.
|
Zweige |
||
|
Initial beinhaltet die Wenn ( Case ) Projektion bereits einen Zweig, für den sofort eine Bedingung oder eine Projektion konfiguriert werden kann.
|
|
|
Die Reihenfolge (und damit Priorität) der Zweige kann über die Baumansicht (ganz links im Editor) per Drag & Drop angepasst werden.
►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 |
|
Das Raute-Symbol kennzeichnet den Platzhalter für die Konfiguration einer Bedingung innerhalb eines Zweigs.
►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 |
|
Das Menüsymbol (ganz links innerhalb der Projektion-Konfiguration) bietet per Kontextmenü Projektionen zur Auswahl an.
|
Beispiele
Typisches Beispiel: Bedingtes Aufbereiten von Adressdaten
|
Eine Tupel-Suche soll die Daten von Adressen so aufbereiten, dass drei Projektionen die "Textzeilen" für die Anschrift beim Postversand vorbereiten:
|
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.
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:
Die Feld Einschränkung in der Bedingung prüft ob das Feld "Postfach" (postboxNumber) "gefüllt" (!=null) ist.
Die Textverkettungsprojektion unterhalb verknüpft in diesem Fall wie gewünscht den Feldnamen als Literale Projektion (Details s. folgende Anmerkung) über ein Leerzeichen (Literale Projektion) mit dem Wert aus dem "Postfach"-Feld.
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:
|
|
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:
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:
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:
Die erste Feld Einschränkung vergleicht den "Besitzer" (ownerId) mit dem Wert aus dem id-Feld der Firma der Session, der als Konstante in die Datenbankabfrage eingeht.
Die zweite Feld Einschränkung verwendet eine Rollenregel, um festzustellen, ob als Rolle der Session die Rolle "Administrator" gilt.
Der boolesche Rückgabewert der Rollenregel wird über einen Regelwert-Wertauflöser als Literal in einer Literale Projektion definiert, da auf der linken Seite der Feld Einschränkung ausschließlich Projektionen definiert werden können.
Als Vergleichswert wird ein statischer boolescher Wert (true) gegenübergestellt.
Dei Feldprojektion für das Feld "Benutzer" (username) liefert den Namen im Klartext, wenn eine der ver-ODER-ten Einschränkungen zutrifft.
Ü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
...