In Liste
Siehe auch: Ist Gleich
Der In Liste Vergleichstyp prüft im Kontext einer Objekt-Feld-Regel, ob die als Vergleichswert (Wert-Konfiguration rechts) definierte "Liste" (List, Set, Array) mindestens einen Eintrag enthält, der einen Ist Gleich-Vergleich mit dem Prüfwert (Wert-Konfiguration links) besteht.
Sofern es sich beim Vergleichswert (rechts) nicht um eine "Liste" (List, Set, Array) handelt, wird der Vergleichswert direkt verwendet.
Falls der Datentyp von Einträgen im Vergleichswert vom Datentyp des Prüfwerts abweicht, wird analog zum Ist Gleich-Vergleichstyp eine Typumwandlung in den Typ des Prüfwerts versucht. Dies betrifft auch den Fall, dass es sich beim Prüfwert um eine Liste handelt.
Für den Vergleich von Datenobjekten greift die Logik eines Ist Gleich-Vergleichs mit ausgeschalteter Option Objektinhalt vergleichen.
►WICHTIG◄ Der In Liste-Vergleichstyp setzt auf der Logik des Ist Gleich-Vergleichstyps auf. Ein robustes Verständnis für die Details und Eigenheiten des Ist Gleich-Vergleichstyps ist als Basis für den sicheren Gebrauch des In Liste-Vergleichstyps dringend zu empfehlen.
Konkrete Beispiele:
Prüfwert |
Vergleichswert |
Prüfergebnis |
Kommentar |
"DEF" |
["ABC","DEF","GHI"] |
|
Liste im Vergleichswert enthält den Prüfwert (direkt) |
4600 |
["3591","04600","39052"] |
|
Der zweite Listeneintrag im Vergleichswert wird in die als Prüfwert definierte Ganzzahl 4600 umgewandelt. |
32 |
["32.1608", "32.0"] |
|
Der zweite Listeneintrag im Vergleichswert wird in die als Prüfwert definierte Ganzzahl 32 umgewandelt. |
32 |
[31.999, 32.1608] |
|
Der zweite Listeneintrag im Vergleichswert wird in die als Prüfwert definierte Ganzzahl 32 umgewandelt. |
["EDME"] |
["LOWS", "EDME", "EDMQ"] |
|
Der dritte Listeneintrag im Vergleichswert wird in die als Prüfwert definierte Liste (mit einem Eintrag) umgewandelt. |
["EDME"] |
"EDME" |
|
Der Vergleichswert (String) wird in die Prüfwert definierte Liste (mit einem Eintrag) umgewandelt. |
["EDML", "EDMV", "EDMY"] |
["EDMV", "EDMY"] |
|
Keiner der Listeneinträge im Vergleichswert entspricht der als Prüfwert bereitgestellten Liste. |
["LEPA", "EDDM"] |
[["EDDM", "LOWI"], ["LEPA", "EDDM"]] |
|
Der zweite Listeneintrag im Vergleichswert entspricht der als Prüfwert definierten Liste mit zwei Einträgen. |
"[LEPA, EDDM]" |
[["EDDM", "LOWI"], ["LEPA", "EDDM"]] |
|
Der zweite Listeneintrag im Vergleichswert liefert als String-Abbild die als Prüfwert definierte Zeichenfolge. |
"[EDDM,LOWI]" |
[["EDDM", "LOWI"], ["LEPA", "EDDM"]] |
|
Keiner der Listeneinträge im Vergleichswert liefert als String-Abbild exakt die als Prüfwert definierte Zeichenfolge. |
Vergleich von "Client-Objekten": |
|||
{"name":"robinson"} |
[{"name":"friday"}, {"name":"robinson"}] |
Im Server-Kontext:
Im Client Workflow:
|
In einem serverseitigen Ausführungskontext (innerhalb von Ereignisbehandlungen, Zuordnungskriterien, usw.) werden Datenobjekte grundsätzlich inhaltlich, also anhand ihrer konkreten Feldwerte, verglichen. In einem Client Workflow wird ein "Client-Objekt" nur als "gleich" erkannt, wenn es sich um dasselbe "Client-Objekt" handelt. Ein inhaltlicher Vergleich findet nicht statt. |
Wir erzeugen die zwei "Client-Objekte" aus der Liste im Vergleichswert (oben) vorab und weisen sie zwei Variablen (mit den Namen robinson und friday) zu. |
|||
|
|
|
Da sich in diesem Beispiel die Listeneinträge per Referenz auf die vorab erstellten "Client-Objekte" beziehen, gilt der In Liste-Vergleich auch im Client Workflow als bestanden. Für den Client Workflow erscheint der Vergleich so:
|
|
|
Im Server-Kontext:
Im Client Workflow:
|
Der Server vergleicht inhaltlich und erkennt die Übereinstimmung an. Für den Client Workflow erscheint der Vergleich so:
Ob das Objekt-A inhaltlich mit Objekt-C übereinstimmt oder nicht, wird schlichtweg nicht untersucht. |
|
|
|
In dieser Variante wird das "Client-Objekt" im Prüfwert durch einen JSON aus Objekt erzeugen-Wertauflöser in einen String überführt. Wer erwartet, dass daraufhin die im Vergleichswert aufgelisteten "Client-Objekte" für den In Liste-Vergleich automatisch in JSON-Strings umgewandelt werden, liegt knapp daneben. Tatsächlich wird ein String-Abbild jedes "Client-Objekts" aus dem Vergleichswert für den Vergleich verwendet, das allerdings nicht das JSON-Format widerspiegelt. Die folgende Variante führt dagegen zum Ziel. |
|
|
|
Mit dieser Variante kann der inhaltliche Vergleich von "Client-Objekten" unabhängig vom Ausführungskontext (Client/Server) erzwungen werden, indem anstelle der beteiligten Objekte ihr Abbild im JSON-Format als Zeichenfolge verglichen wird. Die Liste von "Client-Objekten" im Vergleichswert wird durch den verketteten Sammle Werte-Wertauflöser in eine Liste von String-Werten umgewandelt, die die aufgelisteten Objekte in JSON-Notation abbilden. Der Wert zum Sammeln wird über den JSON aus Objekt erzeugen-Wertauflöser definiert, so dass sichergestellt ist, dass die Notation im Detail mit dem als Prüfwert generierten JSON-String übereinstimmt, wenn ein inhaltlich übereinstimmendes "Client-Objekt" im Vergleichswert gelistet ist. |
►ANMERKUNG◄ Eine Prüfung auf das Vorkommen eines inhaltlich mit dem Prüfwert übereinstimmenden "Client-Objekts" in einer Liste kann alternativ mit einer Regel-Konfiguration wie der folgenden erreicht werden:
Der In Liste-Vergleichstyp wird hier gezielt nicht beansprucht, damit die Prüfung der Liste unabhängig vom Ausführungskontext (Server/Client) dieselben Ergebnisse liefert:
Klingt furchtbar kompliziert, ist aber wirklich ganz einfach: Die Regel wird bestanden, wenn die Liste aus dem Eingabewert ein "Client-Objekt" als Eintrag enthält, das mit dem gesuchten Objekt inhaltlich übereinstimmt. Denn dann gilt dieses als Prüfwert für die äußere Objekt-Feld-Regel, was die not( Ist leer )-Bedingung erfüllt. |
|
Konfiguration
Die Wert-Konfigurationen für den Prüfwert und den Vergleichswert sind für den In Liste-Vergleichstyp nicht optional.
Sobald der In Liste-Vergleichstyp für eine Instanz der Objekt-Feld-Regel ausgewählt wird, erscheint - ggf. anstelle einer bestehenden Wert-Konfiguration für den Vergleichswert (rechts) - die rechts abgebildete Standard-Wert-Konfiguration für den Vergleichswert (ein Erzeuge Liste-Wertauflöser ohne Einträge). |
|
In dem automatisch hinzugefügten Erzeuge Liste-Wertauflöser können per Klick auf das Ein Klick auf das |
|
Anstelle der Standard-Wertkonfiguration kann aber jede beliebige andere Wert-Konfiguration eingesetzt werden, die zur Laufzeit einen oder mehrere geeignete Vergleichswerte bereitstellt. |
|
Beispiele
Einfaches Beispiel: Statische Positivliste für Werte einer Dynamischen Aufzählung
Ein Zuordnungskriterium (s. Zuordnungskriterien) soll im Kontext eines Benutzers (s. Benutzer) genau dann als bestanden gelten, wenn die Auswahl für das Feld "Sprache" (locale) in einer statisch hinterlegten Positivliste enthalten ist.
Konfiguration:
Das Zuordnungskriterium verwendet die rechts abgebildete UND-Verknüpfung zweier Regeln:
|
|
Komplexeres Beispiel: Könnte ich mich als Besitzer einer gegebenen Entität anmelden?
Ein Zuordnungskriterium (s. Zuordnungskriterien) soll im Kontext einer Entität eines beliebigen Typs genau dann als bestanden gelten, wenn der Besitzer dieser Entität eine Firma (s. Firmen) ist, die dem Benutzer der Session beim Anmelden einer Sitzung zur Verfügung steht.
Die Bedingung ist erfüllt, wenn der im Feld "Besitzer" (ownerId) der Entität angegebene Long-Wert als Eintrag im Listenfeld "Firmen" (companies) des betreffenden Benutzerkontos (s. Benutzer) zu finden ist.
Konfiguration:
Das Zuordnungskriterium verwendet die rechts abgebildete UND-Verknüpfung zweier Regeln:
|
|
Sofern das Zuordnungskriterium auch für Gastbenutzer sinnvoll ausgewertet werden können soll, muss noch berücksichtigt werden, dass einem Gastbenutzer keine Liste von Firmen zugeordnet werden kann. Das Gastbenutzerkonto verwendet anstelle des "Firmen"-Listenfelds ein Feld "Firma" (companyId) dem genau ein Long-Wert ausgewählt werden kann.
In der folgenden Konfigurationsvariante für den Vergleichswert nutzen wir den Umstand, dass der Vergleichswert für einen In Liste-Vergleich wahlweise eine Liste oder ein Einzelwert sein kann:
Falls es sich bei dem Benutzer der Session um einen Gastbenutzer handelt, liefern die mit der obigen Konfiguration identischen ersten drei Wertauflöser in der Kette "Kein Wert" ($null). Auf dieser Basis kann die spezifische Behandlung für Gastbenutzer über den an die Kette angehängten Standardwert-Wertauflöser geregelt werden. Wie die Abbildung rechts zeigt, ist die Wertauflöserkette in dessen Parameter Standardwert analog zur bisherigen Vorgehensweise aufgebaut:
►HINWEIS◄ Als Rückgabewert-Typ für die Kette erscheint weiterhin der Datentyp Long[], während für den Standardwert im Standardwert-Wertauflöser der Typ long erscheint. Das ändert allerdings nichts am Verhalten zur Laufzeit: Ein einzelner Vergleichswert wird vom In Liste-Vergleichstyp immer direkt mit dem Prüfwert verglichen. |
|
Der Zugriff auf das Feld "Firma" über den Objekt-Feld-Wertauflöser kann alternativ im Kontext eines Sammle Werte-Wertauflösers erfolgen. Da es sich beim als Eingabewert übergebenen Gastbenutzerkonto nicht um eine Liste handelt, wird wiederum nur ein Einzelwert ("Firma") gelesen. Allerdings wird dieser als einziger Eintrag in einer Liste zurückgegeben, sodass während der Konfiguration als Typ des Rückgabewerts einheitlich Long[] erscheint. Dieser zusätzliche Aufbereitungsschritt in der Wertauflöserkette schafft Transparenz in der Konfiguration, auch wenn sich an der effektiven Logik zur Laufzeit nichts ändert. ►ANMERKUNG◄ Die indirekte Fallunterscheidung per Standardwert-Wertauflöser innerhalb einer gemeinsamen Wertauflöserkette löst die Aufgabe zwar recht elegant und ergibt eine relativ kompakte Konfiguration. Zugunsten von mehr Transparenz und "Lesbarkeit" der Konfiguration könnte man stattdessen auch eine ausdrückliche Fallunterscheidung innerhalb einer Mit-Regel konfigurieren, die den Benutzer der Session ausgehend von einer Typprüfung wahlweise als "Benutzer" oder "Gastbenutzer" erkennt und daraufhin einen spezifischen Vergleich mit der "Besitzer"-ID der Entität anstellt. Dann muss der In Liste-Vergleichstyp nur für Benutzer bemüht werden, während für Gastbenutzer ein Ist Gleich-Vergleich ausreicht. |
|