From cfcbfcf7315d193f3b45b34eac23d9d1898ecda6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 22 Nov 2025 15:59:57 +0000 Subject: [PATCH 1/4] Initial plan From 98611698c7a7eb6c5ce4d32f374ec990db34bca8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 22 Nov 2025 16:03:00 +0000 Subject: [PATCH 2/4] Fix N+1 query issue by using category lookup hash Co-authored-by: merefield <35533304+merefield@users.noreply.github.com> --- .../workflow_visualisation_controller.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/controllers/discourse_workflow/workflow_visualisation_controller.rb b/app/controllers/discourse_workflow/workflow_visualisation_controller.rb index eb74b7c..7d0316d 100644 --- a/app/controllers/discourse_workflow/workflow_visualisation_controller.rb +++ b/app/controllers/discourse_workflow/workflow_visualisation_controller.rb @@ -16,9 +16,13 @@ def network # Preload steps + options (and their workflow_option) to avoid extra queries when iterating steps = workflow.workflow_steps.order(:position).includes(workflow_step_options: :workflow_option) + # Build category lookup hash to avoid N+1 queries + category_ids = steps.map(&:category_id).uniq + categories_by_id = Category.where(id: category_ids).index_by(&:id) + # Lanes: unique categories in order of step position lanes = steps.map do |step| - category = Category.find(step.category_id) + category = categories_by_id[step.category_id] { name: category.name, link: "/c/#{step.category_id}" @@ -27,7 +31,7 @@ def network # Nodes: one per step nodes = steps.map do |step| - category_name = Category.find(step.category_id).name + category_name = categories_by_id[step.category_id].name { id: step.name, From 729cb39d0f7d2dfc8f26f8b939e8903459716724 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 22 Nov 2025 16:03:57 +0000 Subject: [PATCH 3/4] Add nil checks for category lookups Co-authored-by: merefield <35533304+merefield@users.noreply.github.com> --- .../workflow_visualisation_controller.rb | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/controllers/discourse_workflow/workflow_visualisation_controller.rb b/app/controllers/discourse_workflow/workflow_visualisation_controller.rb index 7d0316d..5c6a599 100644 --- a/app/controllers/discourse_workflow/workflow_visualisation_controller.rb +++ b/app/controllers/discourse_workflow/workflow_visualisation_controller.rb @@ -23,22 +23,25 @@ def network # Lanes: unique categories in order of step position lanes = steps.map do |step| category = categories_by_id[step.category_id] + next unless category + { name: category.name, link: "/c/#{step.category_id}" } - end.uniq { |lane| lane[:name] } + end.compact.uniq { |lane| lane[:name] } # Nodes: one per step nodes = steps.map do |step| - category_name = categories_by_id[step.category_id].name + category = categories_by_id[step.category_id] + next unless category { id: step.name, - lane: lanes.find_index { |lane| lane[:name] == category_name }, + lane: lanes.find_index { |lane| lane[:name] == category.name }, active: step.id == workflow_state.workflow_step_id } - end + end.compact # Links: from each step via its options links = [] From 41948b11df05073083bf3ca1ac6a581105693265 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 22 Nov 2025 16:04:32 +0000 Subject: [PATCH 4/4] Filter nil category_ids before database query Co-authored-by: merefield <35533304+merefield@users.noreply.github.com> --- .../discourse_workflow/workflow_visualisation_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/discourse_workflow/workflow_visualisation_controller.rb b/app/controllers/discourse_workflow/workflow_visualisation_controller.rb index 5c6a599..3ce3e7f 100644 --- a/app/controllers/discourse_workflow/workflow_visualisation_controller.rb +++ b/app/controllers/discourse_workflow/workflow_visualisation_controller.rb @@ -17,7 +17,7 @@ def network steps = workflow.workflow_steps.order(:position).includes(workflow_step_options: :workflow_option) # Build category lookup hash to avoid N+1 queries - category_ids = steps.map(&:category_id).uniq + category_ids = steps.map(&:category_id).compact.uniq categories_by_id = Category.where(id: category_ids).index_by(&:id) # Lanes: unique categories in order of step position