@@ -191,7 +191,6 @@ async fn get_issue(
191191 )
192192 ) AS "data!: sqlx::types::Json<FileIssue>"
193193 FROM delphi_report_issues dri
194- LEFT JOIN delphi_report_issue_details drid ON dri.id = drid.issue_id
195194 WHERE dri.id = $1
196195 "# ,
197196 issue_id as DelphiReportIssueId ,
@@ -230,7 +229,7 @@ async fn get_report(
230229
231230 let row = sqlx:: query!(
232231 r#"
233- SELECT
232+ SELECT DISTINCT ON (dr.id)
234233 to_jsonb(dr)
235234 || jsonb_build_object(
236235 'file_id', to_base62(f.id),
@@ -256,8 +255,6 @@ async fn get_report(
256255 FROM delphi_reports dr
257256 INNER JOIN files f ON f.id = dr.file_id
258257 INNER JOIN versions v ON v.id = f.version_id
259- INNER JOIN delphi_report_issues dri ON dri.report_id = dr.id
260- LEFT JOIN delphi_report_issue_details drid ON drid.issue_id = dri.id
261258 WHERE dr.id = $1
262259 "# ,
263260 report_id as DelphiReportId ,
@@ -320,59 +317,67 @@ async fn search_projects(
320317 let mut rows = sqlx:: query!(
321318 r#"
322319 SELECT
323- m.id AS "project_id: DBProjectId",
324- t.id AS "project_thread_id: DBThreadId",
325- to_jsonb(dr)
326- || jsonb_build_object(
327- 'file_id', to_base62(f.id),
328- 'version_id', to_base62(v.id),
329- 'project_id', to_base62(v.mod_id),
330- 'file_name', f.filename,
331- 'file_size', f.size,
332- 'flag_reason', 'delphi',
333- 'issues', json_array(
334- SELECT
335- to_jsonb(dri)
336- || jsonb_build_object(
337- 'details', json_array(
338- SELECT jsonb_build_object(
339- 'id', drid.id,
340- 'issue_id', drid.issue_id,
341- 'key', drid.key,
342- 'file_path', drid.file_path,
343- -- ignore `decompiled_source`
344- 'data', drid.data,
345- 'severity', drid.severity
320+ project_id AS "project_id: DBProjectId",
321+ project_thread_id AS "project_thread_id: DBThreadId",
322+ report AS "report!: sqlx::types::Json<FileReport>"
323+ FROM (
324+ SELECT DISTINCT ON (dr.id)
325+ dr.id AS report_id,
326+ dr.created AS report_created,
327+ dr.severity AS report_severity,
328+ m.id AS project_id,
329+ t.id AS project_thread_id,
330+
331+ to_jsonb(dr)
332+ || jsonb_build_object(
333+ 'file_id', to_base62(f.id),
334+ 'version_id', to_base62(v.id),
335+ 'project_id', to_base62(v.mod_id),
336+ 'file_name', f.filename,
337+ 'file_size', f.size,
338+ 'flag_reason', 'delphi',
339+ 'issues', json_array(
340+ SELECT
341+ to_jsonb(dri)
342+ || jsonb_build_object(
343+ 'details', json_array(
344+ SELECT jsonb_build_object(
345+ 'id', drid.id,
346+ 'issue_id', drid.issue_id,
347+ 'key', drid.key,
348+ 'file_path', drid.file_path,
349+ -- ignore `decompiled_source`
350+ 'data', drid.data,
351+ 'severity', drid.severity
352+ )
353+ FROM delphi_report_issue_details drid
354+ WHERE drid.issue_id = dri.id
346355 )
347- FROM delphi_report_issue_details drid
348- WHERE drid.issue_id = dri.id
349356 )
350- )
351- FROM delphi_report_issues dri
352- WHERE dri.report_id = dr.id
353- )
354- ) AS "report!: sqlx::types::Json<FileReport>"
355- FROM delphi_reports dr
356- INNER JOIN files f ON f.id = dr.file_id
357- INNER JOIN versions v ON v.id = f.version_id
358- INNER JOIN mods m ON m.id = v.mod_id
359- INNER JOIN threads t ON t.mod_id = m.id
360- INNER JOIN delphi_report_issues dri ON dri.report_id = dr.id
361- LEFT JOIN delphi_report_issue_details drid ON drid.issue_id = dri.id
362-
363- -- filtering
364- LEFT JOIN mods_categories mc ON mc.joining_mod_id = m.id
365- LEFT JOIN categories c ON c.id = mc.joining_category_id
366- WHERE
367- -- project type
368- (cardinality($1::int[]) = 0 OR c.project_type = ANY($1::int[]))
357+ FROM delphi_report_issues dri
358+ WHERE dri.report_id = dr.id
359+ )
360+ ) AS report
361+ FROM delphi_reports dr
362+ INNER JOIN files f ON f.id = dr.file_id
363+ INNER JOIN versions v ON v.id = f.version_id
364+ INNER JOIN mods m ON m.id = v.mod_id
365+ INNER JOIN threads t ON t.mod_id = m.id
366+
367+ -- filtering
368+ LEFT JOIN mods_categories mc ON mc.joining_mod_id = m.id
369+ LEFT JOIN categories c ON c.id = mc.joining_category_id
370+ WHERE
371+ -- project type
372+ (cardinality($1::int[]) = 0 OR c.project_type = ANY($1::int[]))
373+ ) t
369374
370375 -- sorting
371376 ORDER BY
372- CASE WHEN $2 = 'created_asc' THEN created ELSE TO_TIMESTAMP(0) END ASC,
373- CASE WHEN $2 = 'created_desc' THEN created ELSE TO_TIMESTAMP(0) END DESC,
374- CASE WHEN $2 = 'severity_asc' THEN dr.severity ELSE 'low'::delphi_severity END ASC,
375- CASE WHEN $2 = 'severity_desc' THEN dr.severity ELSE 'low'::delphi_severity END DESC
377+ CASE WHEN $2 = 'created_asc' THEN t.report_created ELSE TO_TIMESTAMP(0) END ASC,
378+ CASE WHEN $2 = 'created_desc' THEN t.report_created ELSE TO_TIMESTAMP(0) END DESC,
379+ CASE WHEN $2 = 'severity_asc' THEN t.report_severity ELSE 'low'::delphi_severity END ASC,
380+ CASE WHEN $2 = 'severity_desc' THEN t.report_severity ELSE 'low'::delphi_severity END DESC
376381
377382 -- pagination
378383 LIMIT $3
0 commit comments