Sortierung
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
-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 |
|
Projektion |
projection |
Projektion |
Technisch können über die Projektionskonfiguration alle Typen von Projektionen eingefügt werden.
►WICHTIG◄ Für eine Aggregation im Kontext der Sortierung sind ggf. Einschränkungen zu beachten:
|
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:
Datenbankseitig erzeugt diese Konfiguration den Sortierausdruck |
|
Laufzeitbeispiel: ... mit genau einer Ausgabespalte, die der Feldprojektion aus der Sortierung entspricht ...
username |
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 Sortierung wird wie recht dargestellt angepasst:
|
|
Laufzeitbeispiel:
username,id |
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:
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). |
|
Laufzeitbeispiel: (Gruppen bzgl. VIP-Kennzeichnung wurden nachträglich künstlich separiert durch eine Leerzeile)
VIP_flag,username |
|
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.
Laufzeitbeispiel: (Gruppen bzgl. VIP-Kennzeichnung wurden nachträglich künstlich separiert durch eine Leerzeile)
VIP_flag,username |
Die Ergebnisliste enthält jetzt nur noch zwei Gruppen: |
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:
►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. |
|
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. |
|
Die gewünschte Sortierung verwendet zwei Sortierkriterien:
►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. |
|
Laufzeitbeispiel:
count_roles,username |
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:
|
|