Datenobjekt Join

images/download/attachments/167859497/image-2024-1-22_11-41-32-version-1-modificationdate-1705920092333-api-v2.png

Ein Datenobjekt Join bindet anhand der Join Bedingung zugeordnete Instanzen des als Datenobjekt ausgewählten Entitätstyps unter dem als Join Alias angegebenen Namen in eine Suche ein.

Im Unterschied zu allen anderen Joins stützt sich der Datenobjekt Join ausschließlich auf die im Join Alias explizit formulierte Bedingung. Anderweitige Beziehungen zwischen Entitäten in der Suche und den hinzugezogenen Instanzen werden dabei weder erwartet noch berücksichtigt.

Die Beziehung zum als Datenobjekt ausgewählten Entitätstyp kann über die Join Bedingung also völlig willkürlich definiert werden.


WICHTIG◄ Für den Zugriff auf Instanzen des als Datenobjekt ausgewählten Entitätstyps greifen die für die Haupt-Entität einer Suche ggf. anwendbaren Zugriffsbeschränkungen aufgrund von Besitz, Beteiligung und Firmenfreigaben kategorisch nicht.


Konfiguration

Parameter

Datentyp

Beschreibung

Spezifische Parameter

Datenobjekt

Entitätstyp

Als Datenobjekt kann ein beliebiger Entitätstyp ausgewählt werden. Das Auswahlfeld/Combobox bietet dabei auch Optionen an, die als (Haupt-)"Entität" für eine Suche nicht auswählbar sind. Beispiel:

images/download/attachments/167859497/image-2024-1-22_12-6-26-version-1-modificationdate-1705921587052-api-v2.png

Generische Parameter

Join Alias

String

Als Join Alias muss eine Zeichenfolge angegeben werden, die die Identifikation der durch den Join bereitgestellten Datenobjekts als Präfix im Datenfeldpfad eindeutig identifiziert.

images/download/attachments/167859497/image-2024-1-22_12-9-48-version-1-modificationdate-1705921788267-api-v2.png ... ermöglicht ... images/download/attachments/167859497/image-2024-1-22_12-38-51-version-1-modificationdate-1705923531520-api-v2.png

Für einen Join Alias unzulässige Zeichen (etwa das Leerzeichen oder der Punkt) werden automatisch durch je einen Unterstrich ersetzt:

images/download/attachments/167859497/image-2024-1-22_13-9-43-version-1-modificationdate-1705925383386-api-v2.png ... wird ersetzt durch ... images/download/attachments/167859497/image-2024-1-22_13-10-26-version-1-modificationdate-1705925426296-api-v2.png

images/s/-95e2zf/9012/8yg2g7/_/images/icons/emoticons/warning.svg ACHTUNGimages/s/-95e2zf/9012/8yg2g7/_/images/icons/emoticons/warning.svg Wenn als Join Alias der interne Name eines Datenfelds angegeben wird, dann übersteuert der Join Alias für den Kontext der Suche diesen Feldnamen. Solange innerhalb der Suche keine Zugriffe auf das betreffende Datenfeld erfolgen ist die unkritisch und bleibt deshalb ggf. solange unbemerkt bis ein entsprechender Zugriff versucht wird.

Join Typ

Aufzählungswert

Per Standard ist der Join Typ "Left" (LEFT) vorbelegt, sodass der Datenobjekt Join auch dann keine einschränkende Wirkung auf die Suche hat, falls die Join Bedingung keine Treffer liefert.

Der Join Typ "Inner" (INNER) kann als Einschränkung für die Suche wirken, wenn die Option Optional abgewählt ist. Im Suchergebnis erscheinen dann nur Ergebnisse, für die der Datenobjekt Join anhand der Join Bedingung mindestens einen Treffer "beigesteuert" hat.

Optional

Boolean

Per Standard ist die Option Optional ausgewählt. Dann wird der betreffende Join zur Laufzeit nur in die Datenbankabfrage übernommen, soweit Projektionen dies erfordern.

HINWEIS◄ Solange ein als Optional definierter Join mangels Notwendigkeit zur Laufzeit nicht ausgeführt wird, können auch ggf. vorhandene Fehler in seiner Konfiguration nicht auffallen. So kann der irreführende Eindruck entstehen, dass eine bestimmte Join Bedingung nur in einem optionalen Join "funktioniert". Tatsächlich findet der "optionale" Join datenbankseitig aber ggf. überhaupt nicht statt.

Join Bedingung

Einschränkung

Die Join Bedingung definiert optional welches Kriterium (s. Einschränkungen) erfüllt sein muss, damit ein Join Daten zum Suchergebnis beisteuern kann. Typischerweise setzt die Join Bedingung Daten von Entitäten, die aus Sicht des Joins "Kandidaten" für eine Zuordnung sind, in Beziehung zu Daten von Entitäten, die ggf. das Ziel der Zuordnung sind. Projektionen für "Kandidaten" verwenden dabei den Join Alias als Präfix.

Falls keine Join Bedingung angegeben wird, ordnet der Datenobjekt Join alle Instanzen des per Datenobjekt ausgewählten Entitätstyps zu. Abhängig von weiteren Parametern in der Suche kann deren Anzahl die Anzahl der Ergebniszeilen der Suche multiplikativ erhöhen.


HINWEIS◄ Im Sprachgebrauch für den Join Typ (LEFT, INNER, RIGHT) stehen die "Kandidaten" immer auf der "rechten Seite" der durch den Join begründeten Beziehung. Die Positionierung innerhalb einer ggf. verwendeten Feld Einschränkung als Prüfwert oder Vergleichswert spielt diesbezüglich keine Rolle:

images/download/attachments/167859497/image-2024-1-22_13-36-23-version-1-modificationdate-1705926983154-api-v2.png ist austauschbar mit images/download/attachments/167859497/image-2024-1-22_13-37-29-version-1-modificationdate-1705927049580-api-v2.png

Beispiele

Einfacher Anwendungsfall: Zugriff auf das Besitzer-Konto eines Benutzers

Wie jeder Entitätstyp verwenden auch Benutzer ein Long-Feld "Besitzer" (ownerId), über das auf das Feld "ID" (id) einer Firma verwiesen werden kann, die als "Besitzer" eines bestimmten Benutzers gelten soll.

Das Datenmodell der Entität (hier: Benutzer) beinhaltet dabei nur den Long-Wert der Referenz, sodass Detaildaten zur Besitzer-Firma bei Bedarf per Join in eine Suche einbezogen werden müssen.

Konkret soll eine CSV-Suche die Felder "Benutzername" (username) und "Besitzer" (ownerId) aus dem Benutzerkonto mit dem Adressfeld "Kontonummer" (address.accNumber) der Besitzer-Firma kombinieren.

Konfiguration:

Der Screenshot rechts zeigt die Konfiugration für die CSV Suche mit Projektionen und Joins:

  • Die erste Feldprojektion greift direkt auf das Feld "Benutzername" (username) im Benutzerkonto zu.

  • Die zweite Feldprojektion greift direkt auf das Feld "Besitzer"(ownerId) im Benutzerkonto zu.

  • Die dritte Feldprojektion bezieht sich per Join Alias cmp auf die "Besitzer"-Firma, um deren Adressfeld "Kontonummer" (address.accNumber) zurückzugeben.

Die Zuordnung der "Besitzer"-Firma je Benutzer regelt der Datenobjekt Join:

  • Als Datenobjekt ist der Entitätstyp "Firmenkonto" (CompanyAccount) ausgewählt.

  • Als Join Alias wurde willkürlich der Name cmp (als Kürzel für "Company") zugeordnet. In weniger übersichtlichen Szenarien wäre sicherlich ein aussagekräftigerer Alias-Name (z. B. ownerCompany) empfehlenswert.

  • Als Join Typ ist "Inner" ausgewählt, da unsere Liste nur Benutzer enthalten soll, für die die Join Bedingung erfüllt ist.

  • Die Optional-Option wurde abgewählt, damit der "Inner"-Join auch dann einschränkend wirkt, falls sich keine der Ausgabespalten ausdrücklich auf den cmp-Alias bezieht (s. "Variante" unten).

  • Die Join Bedingung verlangt, dass die Referenz im Feld "Besitzer" (ownerId) mit der "ID" einer Firma (cmp.id) übereinstimmen muss, damit diese im Suchergebnis dem Benutzer zugeordnet wird.

images/download/attachments/167859497/image-2024-1-22_14-9-23-version-1-modificationdate-1705928963170-api-v2.png

Eine Besonderheit bei diesem Anwendungsfall ist, dass der Join für jeden Benutzer nur exakt einen oder keinen Treffer unter den Firmenkonten liefern kann und nicht mehrere,

Es gibt zwei Fälle, in denen der Join kein Firmenkonto liefert:

  • Das als "Besitzer" referenzierte Firmenkonto existiert nicht mehr, weil es gelöscht wurde.

  • Für einen Benutzer wird "kein Besitzer" referenziert. In diesem Fall wird dem Feld "Besitzer" (ownerId) automatisch der Wert -1 zugewiesen, den kein Firmenkonto verwenden kann.

In beiden Fällen kommt keine Zuordnung zustande, was hier (in Verbindung mit dem Join Typ "Inner") dazu führt, dass der betreffende Benutzer nicht in der Ergebnisliste erscheint.

Variante:

Anstelle einer CSV-Suche soll eine "normale" Suche ausgeführt werden, die komplette Benutzer-Instanzen auflistet, denen erfolgreich ein "Besitzer"-Konto zugeordnet wurde.

Im Abfragekonfigurator kann man für die bestehende Konfiguration den "Suchtyp" von CSV Suche auf Suche umstellen. Dadurch fallen die Projektionen weg und es verbleibt nur der rechts abgebildete Datenobjekt Join:

  • Da wir die Optional-Option abgewählt haben, wirkt der Join Typ "Inner" auch ohne Vorhandensein einer Projektion, die sich auf den Alias cmp bezieht, einschränkend für die Suche als Ganzes. In der Ergebnisliste erscheinen nur Benutzerkonten, die sich auf eine konkrete "Besitzer"-Firma beziehen.

  • Würde die Optional-Option ausgewählt, dann könnten in der Ergebnisliste ggf. auch Benutzer enthalten sein, denen kein "Besitzer" zugeordnet ist oder die sich auf ein Firmenkonto als "Besitzer" beziehen, das nicht (mehr) existiert. In diesem Fall hätte der Datenobjekt Join dann auch keinerlei Einfluss mehr auf das Ergebnis, da er weder Projektionen "füttert" noch als Einschränkung wirkt. Er wird deshalb datenbankseitig auch nicht abgebildet, obwohl er in der Konfiguration enthalten ist.

images/download/attachments/167859497/image-2024-1-22_14-56-12-version-1-modificationdate-1705931772823-api-v2.png

Besonderer Anwendungsfall: SELF JOIN zum Suchen von Duplikaten

Viele Konfigurationen wie Zuordnungskriterien oder Ereignisbehandlungen verfügen über ein Feld "Name" (name), in dem ein Text eintragen werden kann, der das betreffende Konfigurationselement angemessen präzise identifiziert sollte, um ein schnelle Identifikation (etwa in einer Übersicht oder einem Dropdown) zu ermöglichen.

Es ist dabei keineswegs zwingend notwendig, dass der zugewiesene "Name" innerhalb des jeweiligen Entitätstyps eindeutig ist, da diese Konfigurationen systemseitig - wie alle Entitäten - anhand ihrer eindeutigen und automatisch zugewiesenen "ID" (id) identifiziert werden.

Damit eine gewisse Transparenz gewahrt bleibt, kann es nicht schaden, z. B. periodisch oder anlassbezogen nach mehrfach vergebenen Namen im Kontext einer Implementierung zu suchen.

Im folgenden Beispiel soll eine CSV-Suche solche "Duplikate" für Zuordnungskriterien ermitteln.

Konfiguration:

Als minimalen Informationsumfang sollte die CSV-Suche drei Projektionen für Ausgabespalten beinhalten:

  • Die erste Feldprojektion bezieht sich auf das "Name" (name) Feld, also den Schlüsselwert für die Erkennung von "Duplikaten".

  • Die zweite Feldprojektion gibt die "ID" (id) des Zuordnungskriteriums an, das in der Ergebniszeile als Original gewertet wird.

  • Die dritte Feldprojektion soll die alternative "ID" (alias.id) eines identifizierten "Duplikats" mit demselben Namen angeben. Die Duplikatsuche stützt sich hier auf einen Datenobjekt Join mit dem Join Alias alias.

    • Man könnte den Datenobjekt Join als "SELF JOIN" bezeichnen, da er sich im Parameter Datenobjekt auf denselben Entitätstyp bezieht, den die Suche selbst adressiert (hier: Zuordnungskriterium).

    • Der Join Typ "Inner" stellt in Verbindung mit der abgewählten Optional-Option sicher, dass im Ergebnis nur Zeilen ausgegeben werden, für die der alias einen Wert beisteuert.

    • Die Join Bedingung (Details s. unten) soll sicherstellen, dass der Join jedem Zuordnungskriterium alle anderen Zuordnungskriterien zuordnet, für die derselbe "Name" (name) angegeben ist.

images/download/attachments/167859497/image-2024-1-22_17-18-59-version-1-modificationdate-1705940339748-api-v2.png

Der Screenshot rechts zeigt die Join Bedingung, die das Kriterium für für die Zuordnung von Duplikaten als Such-Verknüpfung, mit einer UND-Verknüpfung aus zwei Instanzen der Feld Einschränkung abbildet:

  • Die erste Feld Einschränkung stellt sicher, dass ein Abgleich für das Feld "ID" (id vs. alias.id) keine Übereinstimmung (!=) ergibt. Sonst würde der SELF JOIN jedes Zuordnungskriterium als Duplikat von sich selbst ausweisen.

  • Die zweite Feld Einschränkung stellt sicher, dass das Feld "Name" (name vs. alias.name) übereinstimmt.

Nur wenn beide Bedingungen erfüllt sind soll der alias-Datensatz dem übergeordneten Datensatz zugeordnet werden.


WICHTIG◄ Soweit die Suche in einem Kontext ausgeführt wird, in dem Zugriffsbeschränkungen für das Lesen (="Suchen") von Zuordnungskriterien anwendbar sind, ist zu berücksichtigen, dass diese nur die Hauptebene der Suche (also die "linke" Seite des Joins) betreffen. Der Abgleich erfolgt also nicht nach dem Schema "alle Zuordnungskriterien" vs. "alle (anderen) Zuordnungskriterien". Vielmehr wird nur geprüft, ob es für alle lesbaren Zuordnungskriterien irgendwelche Duplikate (alias) hinsichtlich des Namens gibt. Da für die alias-Seite des Vergleichs ("rechts" im Join) keine Zugriffseinschränkungen berücksichtigt werden, weist die Suche ggf. auch Duplikate aus, die "nicht lesbare" Zuordnungskriterien betreffen.

images/download/attachments/167859497/image-2024-1-22_17-19-44-version-1-modificationdate-1705940384530-api-v2.png