Project

General

Profile

Bug #28175

Faire de order_by une liste plutôt qu'une chaîne

Added by Benjamin Dauvergne 6 months ago. Updated 5 months ago.

Status:
Solution déployée
Priority:
Normal
Start date:
20 Nov 2018
Due date:
% Done:

100%

Patch proposed:
Yes
Planning:
No

Description

Pour permettre le tri sur plusieurs colonnes (et dans le future un tri déscendant).

0001-schema-automatically-cast-scalar-value-to-list-value.patch View (836 Bytes) Benjamin Dauvergne, 20 Nov 2018 03:35 PM

0002-engine-make-Dimension.order_by-a-list-fixes-28175.patch View (12.8 KB) Benjamin Dauvergne, 20 Nov 2018 03:35 PM

0001-schema-automatically-cast-scalar-value-to-list-value.patch View (836 Bytes) Benjamin Dauvergne, 06 Dec 2018 05:49 PM

0002-engine-make-Dimension.order_by-a-list-fixes-28175.patch View (12.7 KB) Benjamin Dauvergne, 06 Dec 2018 05:49 PM

0001-schema-automatically-cast-scalar-value-to-list-value.patch View (836 Bytes) Benjamin Dauvergne, 09 Dec 2018 01:21 AM

0002-engine-make-Dimension.order_by-a-list-fixes-28175.patch View (14.2 KB) Benjamin Dauvergne, 09 Dec 2018 01:21 AM

Associated revisions

Revision df6a2e6e (diff)
Added by Benjamin Dauvergne 6 months ago

schema: automatically cast scalar value to list values (#28175)

Revision 0dce40e5 (diff)
Added by Benjamin Dauvergne 6 months ago

engine: make Dimension.order_by a list (fixes #28175)

History

#1 Updated by Benjamin Dauvergne 6 months ago

À appliquer au dessus de #27482 et #28191.

#2 Updated by Frédéric Péters 6 months ago

Un rebasage sans doute a laissé deux "import contextlib" dans engine.py.

#4 Updated by Emmanuel Cazenave 6 months ago

Je nage complet donc je me concentre sur les fondamentaux : beaucoup de code et très peu de changement dans les tests alors que t'as fait passer des patchs pour rendre le machin testable, est-ce bien raisonnable ?

Louperais-je quelque chose ?

#5 Updated by Benjamin Dauvergne 6 months ago

Emmanuel Cazenave a écrit :

Je nage complet donc je me concentre sur les fondamentaux : beaucoup de code et très peu de changement dans les tests alors que t'as fait passer des patchs pour rendre le machin testable, est-ce bien raisonnable ?

Louperais-je quelque chose ?

Effectivement le code demande quelques explications, initialement members() renvoyait simplement les valeurs extraites de la table associé à la première jointure d'une de dimension1 ce qui avait quelques limitations :
1. on ne pouvait pas avoir une dimension simple directement en colonne, ça devait forcément être une clé externe vers une table de mesure (il fallait minimum une jointure par dimension)
2. ça ne respectait pas la contrainte de la jointure (inner, left, right, outer) puisqu'on ajoutait pas la jointure dans l'expression
3. si la dimension dépendait d'une double jointure (scéma en flocon de neige ou "snowflake", ex.: formdata.formdef_id -> formdef.catagory_id -> category) par exemple pou son tri, l'expression de la jointure n'étant pas calculé on ne pouvait pas l'utiliser
4. dernière limitation, le tri se faisait forcément sur une colonne unique désigné soit par order_by ou value.

Ici je fais plusieurs chose:
1. au lieu de considérer que le FROM c'est forcément la première valeur dans join je calcule une vrai jointure via build_table_expression() ça m'a obligé à factoriser ce code et à y réintégrer le calcul du join_tree qui en fait aurait du en faire partie depuis le début (pour chaque jointure demandait par une dimension, j'ajoute ses dépendances en cascade, pour reprendre l'exemple plus haut, la catégorie nécessite de connaître le formdef, qui nécessite de connaître le formdata, 2 dépendances), si une dimension n'est qu'une simple colonne de la table de fait, maintenant ça fonctionne
2. pour obtenir la listes des membres je dois faire un GROUP BY sur la valeur et le label de la dimension, seulement si en plus je trie par une ou plusieurs colonnes, je dois ajouter ces colonnes au GROUP BY (toute colonne requété dans un group by doit apparaître dans le group by (c'est faux si le group by contient des clés primaires, mais comme on est pas capable de le détecter le mieux c'est de tout mettre)

Les modifications au schéma et aux test testent tout ça, même si ça parait court, la complexification d'order_by fait que la jointure devient nécessaire (sans elle l'ORDER BY foirerait et le test vérifie bien qu'on a un nouvel ordre qui dépend bien de l'ordre dans category et subcategory).

En attendant je constitue un jeu de test basé sur un export Grenoble, qui permettra d'avoir du vrai (je charge les données et les visus, et je vérifie que tout s'affiche bien, peut-être que je stockerai les résultats attendus pour voir quand ça bouge).

1 Voir la notion de schéma en étoile : https://fr.wikipedia.org/wiki/%C3%89toile_(mod%C3%A8le_de_donn%C3%A9es)

#6 Updated by Benjamin Dauvergne 6 months ago

avec quelques ajustements par rapport au dernier test grandeur nature poussé.

#7 Updated by Emmanuel Cazenave 6 months ago

  • Status changed from Solution proposée to Solution validée

Merci pour les explications, vas-y donc.

#8 Updated by Benjamin Dauvergne 6 months ago

  • Status changed from Solution validée to Résolu (à déployer)
  • % Done changed from 0 to 100

#12 Updated by Frédéric Péters 5 months ago

  • Status changed from Résolu (à déployer) to Solution déployée

Also available in: Atom PDF