En utilisant l’explorateur de données, je me suis récemment demandé à quoi servait l’option « Inclure le plan de requête ». Je l’ai donc activée pour le découvrir, mais je n’ai remarqué aucun changement.
J’ai donc demandé à quelqu’un de qui j’ai beaucoup appris au fil des ans, et il a partagé une capture d’écran de ce à quoi cela devrait ressembler. J’étais curieux de savoir pourquoi cela ne fonctionnait pas, alors j’ai vérifié et j’ai remarqué que explain: true était inclus dans la requête envoyée[1], mais pas inclus dans la réponse[2]. J’ai donc essayé de comprendre où il avait été perdu. À un moment donné, j’ai demandé à ChatGPT parce que je n’étais pas sûr de l’endroit où chercher ensuite. Il a été très utile et m’a guidé tout au long du débogage. J’ai essayé la correction, après avoir ajouté explain: opts[:explain], le plan de requête est apparu. Bien que je doive admettre que je n’avais qu’une vague idée de ce que je faisais. C’est pourquoi j’ai demandé à ChatGPT d’écrire un résumé de nos conclusions pour le rapport de bug[3] :
Résumé du bug – `explain` manquant dans les résultats de requête (Explorateur de données Discourse) IA
Problème :
Le champ explain n’était pas inclus dans la réponse JSON du point de terminaison /run de l’Explorateur de données, même lorsque explain=true était passé dans la requête. Par conséquent, les plans de requête n’étaient pas visibles dans l’interface utilisateur frontale, bien que Postgres les renvoie correctement.
Cause profonde :
Bien que le backend ait correctement passé opts[:explain] = true dans la logique d’exécution de la requête et que la valeur result[:explain] était présente, cette valeur n’a pas été transmise au ResultFormatConverter. La méthode to_json dans ResultFormatConverter n’inclut la clé explain que si opts[:explain] == true. Cependant, cette option n’a pas été incluse dans l’appel convert.
Correction :
Ajoutez explain: opts[:explain] à l’appel de ResultFormatConverter.convert, comme suit :
render json:
ResultFormatConverter.convert(
:json,
result,
query_params: query_params,
download: params[:download],
+ explain: opts[:explain]
)
Résultat :
Une fois correctement transmis, le champ explain est inclus dans la réponse JSON et rendu correctement dans l’interface utilisateur frontale.


