Projet

Général

Profil

Bug #18930

perfs : passer par la vue SQL globale pour l'API des demandes de l'utilisateur

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

Statut:
Fermé
Priorité:
Haut
Assigné à:
-
Version cible:
-
Début:
25 septembre 2017
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

        user_forms = []
        for formdef in formdefs:
            user_forms.extend(formdef.data_class().get_with_indexed_value(
                        'user_id', user.id))
        user_forms.sort(lambda x, y: cmp(x.receipt_time, y.receipt_time))

En mode SQL on devrait passer par la vue SQL globale.


Fichiers

Révisions associées

Révision 2cd42f04 (diff)
Ajouté par Frédéric Péters il y a plus de 6 ans

api: use sql global views to get all user forms (when appropriate) (#18930)

Historique

#1

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

  • Statut changé de Nouveau à En cours
--- a/wcs/api.py
+++ b/wcs/api.py
@@ -505,12 +505,17 @@ class ApiUserDirectory(Directory):
         return json.dumps(user_info)

     def get_user_forms(self, user):
-        formdefs = FormDef.select()
-        user_forms = []
-        for formdef in formdefs:
-            user_forms.extend(formdef.data_class().get_with_indexed_value(
-                        'user_id', user.id))
-        user_forms.sort(lambda x, y: cmp(x.receipt_time, y.receipt_time))
+        if get_publisher().is_using_postgresql() and not get_request().form.get('full') == 'on':
+            from wcs import sql
+            from qommon.storage import Equal
+            user_forms = sql.AnyFormData.select([Equal('user_id', str(user.id))], order_by='receipt_time')
+        else:
+            formdefs = FormDef.select()
+            user_forms = []
+            for formdef in formdefs:
+                user_forms.extend(formdef.data_class().get_with_indexed_value(
+                            'user_id', user.id))
+            user_forms.sort(lambda x, y: cmp(x.receipt_time, y.receipt_time))
         return user_forms

     def drafts(self):

Résultats préliminaires, en local, sur un site avec un nombre conséquent de demandes en cours (72).

Avant:      
  forms -- start 0.221204996109
    userforms -- start 0.230206012726
    userforms -- end 1.91249394417
  forms -- before json dumps 2.05286192894
  response -- finish 2.05432701111

Après:
  forms -- start 0.221588134766
    userforms -- start 0.233787059784
    userforms -- end 0.649307012558
  forms -- before json dumps 0.782056093216
  response -- finish 0.783752202988

À analyser plus avant demain, notamment en le testant en vrai sur la recette gnm.

#2

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

♥ et je ne doute pas des résultats. Et le code me parait déjà ok. Tu vois ça pour jeudi ? (si y'a des soucis de perfs actuellement, ça peut, je pense)

#3

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

Voilà le même sous forme de patch, j'ai regardé les tests et ils me semblent couvrir de manière plutôt sûre ces API (/api/user/forms & /api/user/drafts).

#5

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

Ack

#6

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

  • Statut changé de En cours à Résolu (à déployer)
commit 2cd42f04da80564d08bbc2cd9580a85807ed1a45
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Tue Sep 26 10:35:22 2017 +0200

    api: use sql global views to get all user forms (when appropriate) (#18930)
#7

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

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF