Den Bereich fuer die Sortierung rekursiv suchen, nicht in zwei Spruengen
Der Ausdruck stieg mit zwei `left join` nach oben, weil der Baum als hoechstens vierstufig galt. `unit_type` ist aber nur ein Etikett, und die Organisation kann beliebig tief sein: bei Manner sind es sieben Ebenen. Fuer 317 der 784 Personen lag der Bereich drei oder vier Spruenge ueber der eigenen Einheit, der Ausdruck lieferte null, und diese 317 rutschten beim Sortieren nach Bereich/Team nicht unter ihre Bereiche, sondern allesamt in einen Block am Ende der Liste. Der Aufstieg haelt beim ersten Bereich an, nimmt also den naechsten und nicht den obersten -- sonst stuende bei fast allen "CEO", weil diese Einheit ueber den sechs C-Level-Bereichen liegt und selbst einer ist. Dieselbe Regel gilt in lib/reports-data.ts, das von der Wurzel absteigt und den letzten Treffer nimmt; dort gab es den Fehler nicht. Gegen den Bestand geprueft: vorher 467 von 784 mit Bereich, jetzt 784.
This commit is contained in:
@@ -199,16 +199,17 @@ describe("das erzeugte SQL", () => {
|
||||
// selbst — sonst stünde in der Spalte etwas anderes als sortiert wird.
|
||||
expect(sql).toContain("unit_type = 'Bereich'");
|
||||
|
||||
// Und über *alle drei* Ebenen: wer in einem Team sitzt, hat den Bereich
|
||||
// zwei Sprünge über sich. Bliebe nur die eigene Einheit übrig, stünden
|
||||
// alle Teammitglieder ohne Bereich da und rutschten ans Listenende.
|
||||
//
|
||||
// Dass drei Ebenen reichen, ist eine Aussage über die Daten (der
|
||||
// Aufzählungstyp org_unit_type kennt genau vier Stufen) und lässt sich
|
||||
// hier nicht prüfen — dass sie überhaupt abgefragt werden, schon.
|
||||
expect(sql).toContain("ou.unit_type = 'Bereich'");
|
||||
expect(sql).toContain("e1.unit_type = 'Bereich'");
|
||||
expect(sql).toContain("e2.unit_type = 'Bereich'");
|
||||
// Und über beliebig viele Ebenen, nicht über eine feste Zahl von
|
||||
// Sprüngen. Vorher standen hier zwei `left join`; bei sieben Ebenen lag
|
||||
// der Bereich für 317 von 784 Personen ausserhalb ihrer Reichweite, und
|
||||
// diese 317 rutschten ohne Bereich ans Listenende.
|
||||
expect(sql).toContain("with recursive");
|
||||
expect(sql).toContain("join org_units o on o.id = k.parent_id");
|
||||
|
||||
// Der Aufstieg hält beim ersten Bereich an. Ohne das Anhalten liefe er
|
||||
// bis zur obersten Einheit weiter, und bei fast allen stünde „CEO".
|
||||
expect(sql).toContain("k.unit_type <> 'Bereich'");
|
||||
expect(sql).toContain("order by tiefe limit 1");
|
||||
});
|
||||
|
||||
it("sortiert den Standort nach seinem Namen, nicht nach seiner Kennung", () => {
|
||||
|
||||
Reference in New Issue
Block a user