Durante l’utilizzo dell’esplora dati, mi sono recentemente chiesto a cosa servisse “Includi piano di query”. Quindi l’ho abilitato per scoprirlo, ma non ho notato alcun cambiamento.
Così ho chiesto a qualcuno da cui ho imparato molto nel corso degli anni e lui ha condiviso uno screenshot di come dovrebbe apparire. Ero curioso di sapere perché non funzionasse, così ho controllato e ho notato che explain: true è incluso nella richiesta inviata[1], ma non è incluso nella risposta[2]. Quindi ho cercato di capire dove si fosse perso. A un certo punto ho chiesto a ChatGPT perché non ero sicuro di dove guardare dopo. È stato molto utile e mi ha guidato attraverso tutto il debug. Ho provato la correzione, dopo aver aggiunto explain: opts[:explain] è apparso il piano di query. Anche se devo ammettere che ho solo una vaga idea di quello che stavo facendo. Ecco perché ho chiesto a ChatGPT di scrivere un riassunto delle nostre scoperte per il bug report[3]:
Riepilogo Bug – `explain` mancante nei Risultati Query (Discourse Data Explorer) AI
Problema:
Il campo explain non veniva incluso nella risposta JSON dell’endpoint /run del Data Explorer, anche quando explain=true veniva passato nella richiesta. Di conseguenza, i piani di query non erano visibili nell’interfaccia utente frontend, sebbene Postgres li restituisse correttamente.
Causa principale:
Mentre il backend passava correttamente opts[:explain] = true nella logica di esecuzione della query e il valore result[:explain] era presente, questo valore non veniva inoltrato a ResultFormatConverter. Il metodo to_json in ResultFormatConverter include la chiave explain solo se opts[:explain] == true. Tuttavia, questa opzione non era inclusa nella chiamata convert.
Correzione:
Aggiungere explain: opts[:explain] alla chiamata a ResultFormatConverter.convert, in questo modo:
render json:
ResultFormatConverter.convert(
:json,
result,
query_params: query_params,
download: params[:download],
+ explain: opts[:explain]
)
Risultato:
Una volta passato correttamente, il campo explain viene incluso nella risposta JSON e reso correttamente nell’interfaccia utente frontend.


