Development #5931
Permettre des clauses déclaratives dans la méthode select()
0%
Description
Pour le moment le paramètre clause de la méthode select() attend un callable, ça rend l'affaire impossible à convertir en SQL.
Fichiers
Demandes liées
Historique
Mis à jour par Frédéric Péters il y a plus de 9 ans
- Statut changé de Nouveau à En cours
- Patch proposed changé de Non à Oui
Mon idée c'est qu'on va se trouver à devoir combiner différents critères dans les pages de listing ou statistiques (aujourd'hui il y a d'un côté un statut et de l'autre une période horaire, ça pourrait être combiné, et puis ça pourra gagner des critères sur les autres champs).
Ce serait dommage de tout faire en Python quand on est en mode SQL, mais aujourd'hui on a du code qui est plutôt de cet ordre :
values = formdef.data_class().select(lambda x: x.status != 'draft') values = [x for x in values if x.receipt_time >= period_start] values = [x for x in values if x.receipt_time <= period_end]
Pour transformer ça en SQL, il faut un mode déclaratif pour les critères :
values = formdef.data_class().select([('status', '!=', 'draft'), ('receipt_time', '>=', period_start), ('receipt_time', '<=', period_end)])
Ce qui peut alors se traduire en SQL.
Le patch proposé ajoute un début de gestion de cela, qui pourra par la suite être étendu au fur et à mesure des besoins.
Le code SQL est aujourd'hui trop naïf, il faut notamment le changer pour laisser à postgresql le soin de faire la substitution de variable, pour éviter les injections bêtes, mais je voulais valider l'idée avant d'aller plus loin.
Mis à jour par Frédéric Péters il y a plus de 9 ans
Mis à jour par Frédéric Péters il y a plus de 9 ans
- Fichier 0001-storage-add-declarative-clauses-to-select-5931.patch 0001-storage-add-declarative-clauses-to-select-5931.patch ajouté
Version alternative, qui utilise des objets pour les clauses.
- Avant :
[('id', '<', 25), ('id', '>=', 10)]
- Après :
[st.Less('id', 25), st.GreaterOrEqual('id', 10)]
(sur l'idée que ça sera plus facile à faire évoluer).
Il y a aussi depuis le patch précédent la modification du côté SQL pour utiliser des paramètres au SELECT.
Mis à jour par Frédéric Péters il y a plus de 9 ans
- Fichier 0001-storage-add-declarative-clauses-to-select-5931.patch 0001-storage-add-declarative-clauses-to-select-5931.patch ajouté
- Fichier 0002-storage-handle-datetime-in-criterias-5931.patch 0002-storage-handle-datetime-in-criterias-5931.patch ajouté
- Fichier 0003-storage-add-NotEqual-criteria-5931.patch 0003-storage-add-NotEqual-criteria-5931.patch ajouté
Le premier patch repris pour ne pas avoir d'sql dans le fichier wcs/qommon/storage.py; les deux autres pour 1) ajouter la gestion des datetime, 2) ajouter un opérateur "!=".
Il y a des tests unitaires et avec #5997 une utilisation dans l'appli.
Mis à jour par Frédéric Péters il y a plus de 9 ans
- Fichier 0001-storage-add-Contains-and-NotContains-operators-5931.patch 0001-storage-add-Contains-and-NotContains-operators-5931.patch ajouté
Opérateurs supplémentaires 'IN' et 'NOT IN'.
Mis à jour par Frédéric Péters il y a plus de 9 ans
- Statut changé de En cours à Résolu (à déployer)
Voilà, c'est poussé.
commit d19b4ce3be989f92395b074a8420c7d0ccff95e1 Author: Frédéric Péters <fpeters@entrouvert.com> Date: Sat Nov 22 13:13:38 2014 +0100 storage: add 'Contains' and 'NotContains' operators (#5931) commit 2f6916644202a97f1e9560997c341ed5ea62f741 Author: Frédéric Péters <fpeters@entrouvert.com> Date: Sat Nov 22 11:30:49 2014 +0100 storage: add 'NotEqual' criteria (#5931) commit 2257f0819382b7c5b16416b7496440ff56fd8d7c Author: Frédéric Péters <fpeters@entrouvert.com> Date: Sat Nov 22 11:20:49 2014 +0100 storage: handle datetime in criterias (#5931) commit 251be76550a182472144c6d396f2401559eb4a94 Author: Frédéric Péters <fpeters@entrouvert.com> Date: Thu Nov 13 21:05:05 2014 +0100 storage: add declarative clauses to select() (#5931)