Sortierung

images/download/attachments/167860729/image-2024-2-1_16-59-51-version-1-modificationdate-1706803191069-api-v2.png

Alle Sucharten können optional eine Liste von Suchkriterien für eine hierarchische Sortierung der Ergebnisse vorgeben.

Konfigurierte Suchkriterien werden in der Regel direkt auf den ORDER BY-Abschnitt in erzeugten SELECT-Anweisungen abgebildet.

HINWEIS◄ Die Sortierung wird auf die Ergebnisliste der Suche grundsätzlich angewendet, bevor die Parameter "Erstes Ergebnis" und "Maximale Ergebnisse" wirken. Per Sortierung kann also gesteuert werden, welche Teilmenge von Treffern als Suchergebnis gilt.

Konfiguration

Das Datenobjekt der Suche bietet ein Listenfeld Sortierung (orders) an, das als Listenwerte Datenobjekte des Typs "Suchreihenfolge" (SearchOrder) erwartet:

  • Per Standard (s. Screenshot oben) ist die Liste Sortierung leer.

  • Per Klick auf das images/s/-95e2zf/9012/8yg2g7/_/images/icons/emoticons/add.svg -Symbol kann der Liste ein Sortierkriterium (SearchOrder-Instanz) hinzugefügt werden.

  • Ein bestehendes Sortierkriterium kann per Klick auf das Mülltonne-Symbol entfernt werden.

  • Soweit der Kontext eine Baumstruktur für die Darstellung der Suche bereitstellt, kann die Reihenfolgeposition von Sortierkriterien und damit deren Rang innerhalb der Hierarchie per Drag & Drop angepasst werden.

Jedes SearchOrder-Datenobjekt verfügt über genau zwei Eigenschaften (s. a. Platzhalter-Struktur im Screenshot oben):

Beschriftung

Datenfeld

Datentyp

Bedeutung

Aufsteigend

asc

Boolean 
  • Mit dem Wert true (Standard) verwendet das Sortierkriterium eine aufsteigende Sortierung.

  • Mit dem Wert false verwendet das Sortierkriterium eine absteigende Sortierung.

Projektion

projection

Projektion
(Entität)

Technisch können über die Projektionskonfiguration alle Typen von Projektionen eingefügt werden.

  • Eine Literale Projektion oder eine Collection Projektion sind als Sortierkriterium kaum sinnvoll einsetzbar.

  • Nicht jeder Rückgabewert einer Projektion eignet sich aufgrund des Datentyps wirklich als Sortierkriterium.


WICHTIG◄ Für eine Aggregation im Kontext der Sortierung sind ggf. Einschränkungen zu beachten:

  • Aggregationsfunktionen (s. Aggregation) sind nur anwendbar, wenn alle Ausgabespalten entweder aggregiert oder gruppiert sind.

  • Berechnungsfunktionen (s. Aggregation), die Werte nur umwandeln und nicht aggregieren, können uneingeschränkt zur Sortierung verwendet werden.

Beispiele

Einfacher Anwendungsfall: Einstufige Sortierung

Eine CSV Suche für Benutzer soll aufsteigend nach dem String-Feld "Benutzername" (username) sortiert werden.

Konfiguration:

Der Screenshot rechts zeigt die Konfiguration für die Sortierung mit einem Suchkriterium:

  • Die Option Aufsteigend wurde ausgehend vom Standard als ausgewählt beibehalten.

  • Als Projektion dient eine Feldprojektion für das Feld "Benutzername" (username).

Datenbankseitig erzeugt diese Konfiguration den Sortierausdruck
ORDER BY username ASC.

images/download/attachments/167860729/image-2024-2-2_10-1-1-version-1-modificationdate-1706864461709-api-v2.png

Laufzeitbeispiel: ... mit genau einer Ausgabespalte, die der Feldprojektion aus der Sortierung entspricht ...

username
========
admin
test
tEST
TEST
test0
test1
test2
TEST2

Die Beispieldaten links legen nahe, dass die Sortierung Groß- und Kleinbuchstaben unterscheidet, aber den Groß/Klein-Unterschied vergleichsweise niedrig gewichtet:

"test" < "TEST" < "test0"

HINWEIS◄ Im Wesentlichen wird aus den Sortierkriterien eine ORDER BY-Klausel für eine SELECT-Anweisung erzeugt. Lobster Data Platform / Orchestration definiert also nur Projektion und Sortierrichtung je Suchkriterium. Die effektive Sortierlogik hängt damit ausschließlich von der verwendeten Datenbank und ggf. spezifischen Einstellungen für die Implementierung (Sprache/Gebietsschema, Unterscheidung von Groß-/Kleinschreibung, usw.) ab.

Komplexerer Anwendungsfall: Mehrstufige Sortierung

Das vorherige Beispiel soll wie folgt erweitert werden:

  • Ein zusätzliche Ausgabespalte soll neben dem "Benutzernamen" (username) die interne "ID" (id) angeben, also den eindeutigen Long-Wert, der Datenbankseitig als Primärschlüssel für Entitäten gilt.

  • Die Sortierung für das Feld "Benutzername" (username) soll ohne Rücksicht auf Groß-/Kleinschreibung erfolgen.

  • Als zusätzliches (nachrangiges) Sortierkriterium soll allerdings die interne "ID" (id) berücksichtigt werden.

Konfiguration:

Der Screenshot rechts zeigt die beiden Projektionen:

  • Die erste Feldprojektion für das username-Feld wurde aus der bestehenden Konfiguration übernommen.

  • Die zweite Feldprojektion greift auf as id-Feld zu.

images/download/attachments/167860729/image-2024-2-2_11-47-37-version-1-modificationdate-1706870857607-api-v2.png

Die Sortierung wird wie recht dargestellt angepasst:

  • Das erste Sortierkriterium bezieht sich nach wie vor auf eine Feldprojektion für das username-Feld. Allerdings wird diese jetzt innerhalb einer Aggregation vorm Typ "Klein" umgesetzt, sodass der username in Kleinbuchstaben umgewandelt wird, bevor er in die Sortierung eingeht. Diese Umwandlung macht die Sortierung "blind" bzw. indifferent für Unterschiede in der Groß-/Kleinschreibung.

  • Das zweite Sortierkriterium wird effektiv nur dann wirksam, wenn das erste Sortierkriterium mehrere Werte als gleichwertig einstuft. Die Feldprojektion bezieht sich dann auf das id-Feld, das definitionsgemäß einen eindeutigen Long-Wert liefert.

images/download/attachments/167860729/image-2024-2-2_11-58-9-version-1-modificationdate-1706871489244-api-v2.png

Laufzeitbeispiel:

username,id
===========
admin,
TEST,6851
test,7552
tEST,7553
test0,7183
test1,7184
test2,7302
TEST2,7551

Für die Reihenfolge der Benutzer "TEST", "test" und "tEST" gibt nicht mehr die im vorherigen Laufzeitbeispiel wirksame alphanumerische Sortierung, sondern der Long-Wert aus dem id-Feld den Ausschlag.

Auch die Sortierung von "test2" vs. "TEST2" beruht nun auf den id-Werten, auch wenn sie sich dadurch effektiv nicht geändert hat.

ANMERKUNG◄ Ohne die Aggregation für das erste Sortierkriterium wäre die Reihenfolge ausgefallen wie im vorherigen Laufzeitbeispiel. Das id-Feld hätte dann effektiv keinen Einfluss, weil die username-Strings bei Berücksichtigung von Groß-/Kleinschreibung ausnahmslos unterschiedlich sind. Dies ist nicht zuletzt für die Verwendung als Kennung beim Login ja auch unbedingt erforderlich.

Komplexerer Anwendungsfall: Mehrstufige Sortierung mit spezifischer Behandlung für NULL-Werte

Konfiguration: (bedingt tauglicher Lösungsansatz)

Der Screenshot rechts zeigt die Konfiguration für eine hierarchische Sortierung mit zwei Sortierkriterien:

  • Das erste Sortierkriterium verwendet eine Typisiertes-Attribut-Projektion für den Attributbesitzerpfad address, die als Rückgabewert den Kennzeichenwert des Kennzeichenattributs "Vip" (VIP) liefert. Die Aufsteigend-Option wurde abgewählt, damit die VIP-Benutzer zuerst erscheinen.

  • Das zweite Sortierkriterium greift über eine Feldprojektion direkt auf das Feld "Benutzername" (username) zu. Die Sortierung soll Aufsteigend erfolgen.


images/s/-95e2zf/9012/8yg2g7/_/images/icons/emoticons/warning.svg ACHTUNG images/s/-95e2zf/9012/8yg2g7/_/images/icons/emoticons/warning.svg Diese Konfiguration ist nur zielführend wenn das VIP-Attribut für alle relevanten Adressen explizit angelegt ist, sodass darauf der "Kennzeichenwert" entweder true oder false gelesen werden kann.

Falls Benutzer existieren, in deren Adresse das VIP-Kennzeichenattribut nicht vorkommt, liefert die Typisiertes-Attribut-Projektion den Wert $null. Die Sortierung unterscheidet zwischen true, false und $null und bildet daher im Ergebnis ggf. drei statt zwei Gruppen mit alphabetischer Sortierung nach dem username (s. Laufzeitbeispiel).

images/download/attachments/167860729/image-2024-2-2_16-24-55-version-1-modificationdate-1706887495582-api-v2.png

Laufzeitbeispiel: (Gruppen bzgl. VIP-Kennzeichnung wurden nachträglich künstlich separiert durch eine Leerzeile)

VIP_flag,username
========================
false,tEST
false,TEST
false,test0
false,test1
false,test2
false,TEST2

true,bcollins
true,mpolo
true,TEST_VIP
false,fbeutel
false,ftuscania
false,test
  • Für die ersten sechs Benutzer in der Liste links existiert das VIP-Kennzeichenattribut in der Adresse nicht, sodass die Sortierung anstelle des Kennzeichenwerts "Kein Wert" ($null) berücksichtigt.

    HINWEISBoolean-Ausgabespalten unterliegen in einer CSV Suche oder einer Tupel-Suche eine automatischen Typumwandlung, bei der $null durch false ersetzt wird. Dadurch erscheint hier false in der Spalte VIP_flag auch für die erste Gruppe.

  • Für die nächste drei Benutzer existiert das VIP-Kennzeichenattribut in der Adresse und liefert den Kennzeichenwert true.

  • Für die letzten drei Benutzer in der Liste links existiert das VIP-Kennzeichenattribut in der Adresse, liefert aber den Kennzeichenwert false.

Variante:

In unserem Anwendungsfall soll die Umwandlung von $null zu false nicht nur für die Ausgabespalte, sondern auch für die Sortierung wirken.

Konfiguration:

Die Projektion für das erste Sortierkriterium weist über eine Fallunterscheidung per Wenn ( Case ) Projektion und eine Literale Projektion den Wert false explizit als Rückgabewert zu, falls die Typisiertes-Attribut-Projektion "Kein Wert" ($null) anstelle des Kennzeichenwerts (flagValue) liefert.

Falls die Typisiertes-Attribut-Projektion einen Kennzeichenwert (flagValue) zurückgibt, wird dieser als Rückgabewert für die Sortierung verwendet.

images/download/attachments/167860729/image-2024-2-2_16-1-40-version-1-modificationdate-1706886100848-api-v2.png

Laufzeitbeispiel: (Gruppen bzgl. VIP-Kennzeichnung wurden nachträglich künstlich separiert durch eine Leerzeile)

VIP_flag,username
========================
true,bcollins
true,mpolo
true,TEST_VIP
false,fbeutel
false,ftuscania
false,test
false,tEST
false,TEST
false,test0
false,test1
false,test2
false,TEST2

Die Ergebnisliste enthält jetzt nur noch zwei Gruppen:

  • Die ersten drei Benutzer sind ausdrücklich als VIP gekennzeichnet.

  • Alle anderen Benutzer sind nicht als VIP gekennzeichnet. Ob das Kennzeichenattribut fehlt oder false "meldet" wird nicht unterschieden.

Komplexerer Anwendungsfall: CSV-Suche mit Gruppierung nach Aggregationsergebnis sortieren

Eine CSV Suche für Benutzer soll je Benutzerkonto den "Benutzernamen" (username) und die Anzahl der zugewiesenen "Rollen" (roles) angeben und die Liste wie folgt mehrstufig sortieren:

  • Zunächst soll nach der Anzahl der Rollen je Benutzer absteigend sortiert werden.

  • Benutzer mit derselben Anzahl von Rollen sollen aufsteigend nach dem "Benutzernamen" sortiert werden.

Konfiguration:

Die Ausgabespalten für die Tupel-Suche werden wie rechts abgebildet konfiguriert:

  • Die erste Ausgabespalte (count_roles) wendet eine Aggregation vom Typ "Anzahl" auf eine Feldprojektion für das Feld "Rollen" (roles) des Benutzerkontos an.

  • Die zweite Ausgabespalte greift per Feldprojektion auf das Feld "Benutzername" (username) zu.

HINWEIS◄ Diese Projektionen müssen nachfolgend auch für die "Gruppierung" und "Sortierung" verwendet werden. Dabei wählen wir für die Aggregation zwecks Transparenz willkürlich denselben Namen wie für die Ausgabespalte (count_roles), auch wenn das funktional nicht erforderlich ist.

images/download/attachments/167860729/image-2024-2-5_16-24-14-version-1-modificationdate-1707146654977-api-v2.png

Damit die Aggregationsfunktion "Anzahl" innerhalb der Aggregation anwendbar ist, muss eine Gruppierung bestellt werden, die wie rechts abgebildet per Feldprojektion das Feld "Benutzername" als einziges Gruppierungskriterium benennt.

images/download/attachments/167860729/image-2024-2-5_16-32-33-version-1-modificationdate-1707147153769-api-v2.png

Die gewünschte Sortierung verwendet zwei Sortierkriterien:

  • Das erste Sortierkriterium reproduziert die Projektion für die erste Ausgabespalte (count_roles). Die Aggregation liefert die Anzahl der Rollen je Benutzer, nach der absteigend (Aufsteigend abgewählt) sortiert werden soll.

  • Das zweite Sortierkriterium reproduziert die zweite Ausgabespalte und greift per Feldprojektion auf das Feld "Benutzername" (username) zu, um Benutzer mit derselben Anzahl von Rollen Aufsteigend zu sortieren.

ANMERKUNG◄ Die Reihenfolge der Ausgabespalten muss nicht zwingend der Hierarchie der Sortierkriterien entsprechen. Aus technischer Sicht ist es nicht einmal notwendig, dass die in der Sortierung verwendeten Projektionen überhaupt als Ausgabespalten angelegt sind. Es erleichtert allerdings die Interpretation der Ergebnisse.

images/download/attachments/167860729/image-2024-2-5_16-36-35-version-1-modificationdate-1707147395090-api-v2.png

Laufzeitbeispiel:

count_roles,username
====================
5,admin
3,TEST_VIP
2,bcollins
2,fbeutel
2,mpolo
1,ftuscania
1,test
...

Die Beispieldaten (links) verdeutlichen, dass zunächst absteigend nach dem Ergebnis in der count_roles-Spalte sortiert wird, während die username-Spalte als nachrangiges Sortierkriterium dafür sorgt, dass Benutzer mit derselben Rollen-Anzahl alphabetisch aufsteigend nach dem Benutzernamen sortiert werden.

Komplexerer Anwendungsfall: Komplette Entitäten nach Aggregationsergebnis sortieren

Als Variante zum vorherigen Beispiel soll eine Suche für Benutzer eine Liste kompletter Benutzerkonten zurückgeben, deren Reihenfolge durch dieselbe zweistufige Sortierung definiert wird:

  • Zunächst soll nach der Anzahl der Rollen je Benutzer absteigend sortiert werden.

  • Benutzer mit derselben Anzahl von Rollen sollen aufsteigend nach dem "Benutzernamen" sortiert werden.

Konfiguration:

Da eine Suche (im Unterschied zur CSV Suche im vorherigen Beispiel) keine "Gruppierung" unterstützt, kann die Sortierung eine "Anzahl"-Aggregation nicht direkt als Projektion verwenden.

Der folgende Trick löst dieses Problem, wenn auch zu Lasten der Performanz der Abfrage:

Wie definiert die Sortierung zwei Sortierkriterien:

  • Das erste Sortierkriterium definiert eine Subselect Projektion, die sich nicht etwa auf die Entität "Rolle" bezieht, sondern auf die Entität "Benutzer".

    • Die Parameter Feld für Join und Feld der Entität für Join beziehen sich jeweils auf das Feld "ID" (id) eines Benutzerkontos, wobei für die Zuordnung von Daten zum Benutzer in der übergeordneten Suche gefordert wird, dass diese IDs übereinstimmen. Das lässt auf den ersten Blick wenig Mehrwert vermuten, da so jedem Benutzerkonto dasselbe Benutzerkonto noch einmal "zugeschlüsselt" wird.

    • Allerdings ermöglicht diese 1:1-Zuordnung eine Aggregation innerhalb der Spaltenprojektion für Subselect: Per Typ "Anzahl" können wir hier das Zählen der "Rollen" (Feldprojektion roles) je Benutzer-ID veranlassen, was direkt in der übergeordneten Suche mangels "Gruppierung" nicht möglich ist. Der Subselect wird für jede ID in der übergeordneten Suche abgearbeitet. Dabei kann die Aggregationsfunktion "Anzahl" im Subselect alle gefunden Rollen-Werte zusammenzählen, ohne dass eine Gruppierung definiert sein muss. Diese Anzahl kann als Sortierkriterium (count_roles) verwendet werden.

    • Die Option Aufsteigend ist für dieses Kriterium abgewählt, damit die Benutzerkonten mit absteigender Rollen-Anzahl erscheinen.

  • Als zweites Sortierkriterium dient wie im vorigen Beispiel eine Feldprojektion für das Feld "Benutzername" (username). Benutzern mit derselben Rollen-Anzahl werden nach dem Benutzernamen alphabetisch Aufsteigend sortiert.

images/download/attachments/167860729/image-2024-2-5_17-32-27-version-1-modificationdate-1707150747106-api-v2.png