Changeset 106383 in spip-zone


Ignore:
Timestamp:
Sep 22, 2017, 1:17:29 PM (3 years ago)
Author:
marcimat@…
Message:

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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/formidable/trunk/formulaires/exporter_formulaire_reponses.php

    r106382 r106383  
    8585                        $titres[] = _T('formidable:reponse_statut');
    8686                }
     87
    8788                $saisies = saisies_lister_par_nom(unserialize($formulaire['saisies']), false);
    8889                foreach ($saisies as $nom => $saisie) {
     
    9899                        }
    99100                }
    100                 $saisies_noms = array_keys($saisies);
    101101
    102102                // On passe la ligne des titres de colonnes dans un pipeline
     
    108108                        )
    109109                );
     110
    110111                $reponses_completes[] = $titres;
    111112                $saisies_fichiers = array();
     
    115116                $auteurs = sql_allfetsel('id_auteur, nom', 'spip_auteurs', sql_in('id_auteur', $ids_auteurs));
    116117                $auteurs = array_column($auteurs, 'nom', 'id_auteur');
     118
     119                // Sélectionner toutes valeurs des réponses d’un coup. Éviten N requetes SQL...
     120                $ids_reponses = array_column($reponses, 'id_formulaires_reponse');
     121                $_reponses_valeurs = sql_allfetsel(
     122                        'id_formulaires_reponse, nom, valeur',
     123                        'spip_formulaires_reponses_champs',
     124                        array(
     125                                sql_in('id_formulaires_reponse', $ids_reponses),
     126                                //sql_in('nom', array_keys($saisies)) // ralentit la requête, et inutile
     127                        ),
     128                        '',
     129                        'id_formulaires_reponse ASC'
     130                );
     131
     132                // grouper par identifiant de réponse
     133                $reponses_valeurs = array();
     134                foreach ($_reponses_valeurs as $r) {
     135                        if (empty($reponses_valeurs[$r['id_formulaires_reponse']])) {
     136                                $reponses_valeurs[$r['id_formulaires_reponse']] = array();
     137                        }
     138                        $reponses_valeurs[$r['id_formulaires_reponse']][$r['nom']] = $r['valeur'];
     139                }
     140                unset($_reponses_valeurs);
    117141
    118142                // On parcourt chaque réponse
     
    138162                        $tenter_unserialize = charger_fonction('tenter_unserialize', 'filtre/');
    139163
    140                         // Liste de toutes les valeurs de cette réponse (en 1 seule requête).
    141                         $valeurs = sql_allfetsel(
    142                                 'nom, valeur',
    143                                 'spip_formulaires_reponses_champs',
    144                                 array(
    145                                         'id_formulaires_reponse = ' . intval($reponse['id_formulaires_reponse']),
    146                                         sql_in('nom', $saisies_noms)
    147                                 )
    148                         );
    149                         $valeurs = array_column($valeurs, 'valeur', 'nom');
     164                        // Liste de toutes les valeurs
     165                        $valeurs = $reponses_valeurs[$reponse['id_formulaires_reponse']];
    150166
    151167                        foreach ($saisies as $nom => $saisie) {
Note: See TracChangeset for help on using the changeset viewer.