Projet

Général

Profil

Development #5931

Permettre des clauses déclaratives dans la méthode select()

Ajouté par Frédéric Péters il y a plus de 9 ans. Mis à jour il y a plus de 9 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
13 novembre 2014
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

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

Précède w.c.s. - Development #5997: Utiliser les critères de select() pour le calcul des statsFermé22 novembre 2014

Actions

Historique

#1

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.

#3

Mis à jour par Frédéric Péters il y a plus de 9 ans

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.

#4

Mis à jour par Frédéric Péters il y a plus de 9 ans

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.

#6

Mis à jour par Benjamin Dauvergne il y a plus de 9 ans

Ack de mon coté.

#7

Mis à jour par Thomas Noël il y a plus de 9 ans

Ack pour moi aussi.

#8

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)
#9

Mis à jour par Thomas Noël il y a plus de 9 ans

  • Statut changé de Résolu (à déployer) à Fermé

Formats disponibles : Atom PDF