Changeset 110993 in spip-zone for _plugins_/formidable


Ignore:
Timestamp:
Jul 4, 2018, 7:33:11 AM (12 days ago)
Author:
cedric@…
Message:

Report de r106383 : L’export de 1000 réponses passe de 1000 requêtes à 9 requêtes SQL, et 10s de travail.
C'est encore très long.

Location:
_plugins_/formidable/branches/v2
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/formidable/branches/v2

  • _plugins_/formidable/branches/v2/formulaires/exporter_formulaire_reponses.php

    r110992 r110993  
    6868                        $titres[] = _T('formidable:reponse_statut');
    6969                }
     70
    7071                $saisies = saisies_lister_par_nom(unserialize($formulaire['saisies']), false);
    7172                foreach ($saisies as $nom => $saisie) {
     
    7576                        }
    7677                }
    77 
    78                 $saisies_noms = array_keys($saisies);
    7978
    8079                // On passe la ligne des titres de colonnes dans un pipeline
     
    8685                        )
    8786                );
     87
    8888                $reponses_completes[] = $titres;
    8989
     
    9292                $auteurs = sql_allfetsel('id_auteur, nom', 'spip_auteurs', sql_in('id_auteur', $ids_auteurs));
    9393                $auteurs = array_column($auteurs, 'nom', 'id_auteur');
     94
     95                // Sélectionner toutes valeurs des réponses d’un coup. Éviten N requetes SQL...
     96                $ids_reponses = array_column($reponses, 'id_formulaires_reponse');
     97                $_reponses_valeurs = sql_allfetsel(
     98                        'id_formulaires_reponse, nom, valeur',
     99                        'spip_formulaires_reponses_champs',
     100                        array(
     101                                sql_in('id_formulaires_reponse', $ids_reponses),
     102                                //sql_in('nom', array_keys($saisies)) // ralentit la requête, et inutile
     103                        ),
     104                        '',
     105                        'id_formulaires_reponse ASC'
     106                );
     107
     108                // grouper par identifiant de réponse
     109                $reponses_valeurs = array();
     110                foreach ($_reponses_valeurs as $r) {
     111                        if (empty($reponses_valeurs[$r['id_formulaires_reponse']])) {
     112                                $reponses_valeurs[$r['id_formulaires_reponse']] = array();
     113                        }
     114                        $reponses_valeurs[$r['id_formulaires_reponse']][$r['nom']] = $r['valeur'];
     115                }
     116                unset($_reponses_valeurs);
    94117
    95118                // On parcourt chaque réponse
     
    113136                        // Ensuite tous les champs
    114137
    115                         // Liste de toutes les valeurs de cette réponse (en 1 seule requête).
    116                         $valeurs = sql_allfetsel(
    117                                 'nom, valeur',
    118                                 'spip_formulaires_reponses_champs',
    119                                 array(
    120                                         'id_formulaires_reponse = ' . intval($reponse['id_formulaires_reponse']),
    121                                         sql_in('nom', $saisies_noms)
    122                                 )
    123                         );
    124                         $valeurs = array_column($valeurs, 'valeur', 'nom');
     138                        // Liste de toutes les valeurs
     139                        $valeurs = $reponses_valeurs[$reponse['id_formulaires_reponse']];
    125140
    126141                        foreach ($saisies as $nom => $saisie) {
Note: See TracChangeset for help on using the changeset viewer.