From 9df7b4a7cde92fc470be28dd4f4c1fa0609a2d93 Mon Sep 17 00:00:00 2001 From: Nikolai Giman Date: Sat, 9 May 2026 17:28:21 +0200 Subject: [PATCH] fix: indexes --- api/src/migrations/taskview/migrate.json | 13 +++++++++ .../sql/1.47.0/0.analytics_indexes_v2.sql | 20 +++++++++++++ .../analytics/sections/SectionRegistry.ts | 28 +++++++++---------- 3 files changed, 47 insertions(+), 14 deletions(-) create mode 100644 api/src/migrations/taskview/sql/1.47.0/0.analytics_indexes_v2.sql diff --git a/api/src/migrations/taskview/migrate.json b/api/src/migrations/taskview/migrate.json index 6549230..ea13db0 100644 --- a/api/src/migrations/taskview/migrate.json +++ b/api/src/migrations/taskview/migrate.json @@ -494,5 +494,18 @@ "description": [ "Add analytics_can_view permission for project-level analytics access" ] + }, + "40": { + "version": "1.47.0", + "name": "Release 1.47.0", + "releaseDate": "20260509", + "scripts": [ + "/1.47.0/0.analytics_indexes_v2.sql" + ], + "description": [ + "Add indexes on tasks_auth.task_assignee, collaboration.users_to_goals, tasks.task_relations(to_task_id) for analytics joins", + "Add partial index on tasks.goals(organization_id) WHERE archive = 0 for analytics goal lookup", + "Add partial index on tasks.tasks(goal_id) WHERE complete IS NOT TRUE for open-task analytics queries" + ] } } \ No newline at end of file diff --git a/api/src/migrations/taskview/sql/1.47.0/0.analytics_indexes_v2.sql b/api/src/migrations/taskview/sql/1.47.0/0.analytics_indexes_v2.sql new file mode 100644 index 0000000..c4c8e0e --- /dev/null +++ b/api/src/migrations/taskview/sql/1.47.0/0.analytics_indexes_v2.sql @@ -0,0 +1,20 @@ +drop index if exists tasks_auth.idx_task_assignee_task_id; +create index idx_task_assignee_task_id on tasks_auth.task_assignee (task_id); + +drop index if exists tasks_auth.idx_task_assignee_user_task; +create index idx_task_assignee_user_task on tasks_auth.task_assignee (collab_user_id, task_id); + +drop index if exists collaboration.idx_users_to_goals_user_goal; +create index idx_users_to_goals_user_goal on collaboration.users_to_goals (user_id, goal_id); + +drop index if exists collaboration.idx_users_to_goals_goal_id; +create index idx_users_to_goals_goal_id on collaboration.users_to_goals (goal_id); + +drop index if exists tasks.idx_task_relations_to_task; +create index idx_task_relations_to_task on tasks.task_relations (to_task_id, from_task_id); + +drop index if exists tasks.idx_goals_org_active; +create index idx_goals_org_active on tasks.goals (organization_id) where archive = 0; + +drop index if exists tasks.idx_tasks_goal_id_open; +create index idx_tasks_goal_id_open on tasks.tasks (goal_id) where complete is not true; diff --git a/api/src/tv-modules/analytics/sections/SectionRegistry.ts b/api/src/tv-modules/analytics/sections/SectionRegistry.ts index 3fb74df..badc24d 100644 --- a/api/src/tv-modules/analytics/sections/SectionRegistry.ts +++ b/api/src/tv-modules/analytics/sections/SectionRegistry.ts @@ -4,16 +4,16 @@ import { CompletedTasksKpi } from './kpi/CompletedTasksKpi' import { OverdueKpi } from './kpi/OverdueKpi' import { CycleTimeKpi } from './kpi/CycleTimeKpi' import { ThroughputSection } from './productivity/ThroughputSection' -import { PriorityMixOverTimeSection } from './productivity/PriorityMixOverTimeSection' +// import { PriorityMixOverTimeSection } from './productivity/PriorityMixOverTimeSection' import { WorkloadByAssigneeSection } from './workload/WorkloadByAssigneeSection' -import { BlockedByDependenciesSection } from './workload/BlockedByDependenciesSection' -import { TimeInKanbanStatusSection } from './workload/TimeInKanbanStatusSection' -import { AgingOpenTasksSection } from './workload/AgingOpenTasksSection' +// import { BlockedByDependenciesSection } from './workload/BlockedByDependenciesSection' +// import { TimeInKanbanStatusSection } from './workload/TimeInKanbanStatusSection' +// import { AgingOpenTasksSection } from './workload/AgingOpenTasksSection' import { OverdueByAgeSection } from './quality/OverdueByAgeSection' -import { CycleTimeHistogramSection } from './quality/CycleTimeHistogramSection' +// import { CycleTimeHistogramSection } from './quality/CycleTimeHistogramSection' import { StaleTasksSection } from './quality/StaleTasksSection' -import { CycleTimePerProjectSection } from './quality/CycleTimePerProjectSection' -import { StatusDistributionSection } from './usage/StatusDistributionSection' +// import { CycleTimePerProjectSection } from './quality/CycleTimePerProjectSection' +// import { StatusDistributionSection } from './usage/StatusDistributionSection' import { ActiveProjectsSection } from './usage/ActiveProjectsSection' import { IncomeExpenseMonthSection } from './financial/IncomeExpenseMonthSection' import { IncomeExpensePerProjectSection } from './financial/IncomeExpensePerProjectSection' @@ -39,19 +39,19 @@ const builders: SectionBuilder[] = [ new AmountCoverageKpi(), // Productivity new ThroughputSection(), - new PriorityMixOverTimeSection(), + // new PriorityMixOverTimeSection(), // Workload new WorkloadByAssigneeSection(), - new BlockedByDependenciesSection(), - new TimeInKanbanStatusSection(), - new AgingOpenTasksSection(), + // new BlockedByDependenciesSection(), + // new TimeInKanbanStatusSection(), + // new AgingOpenTasksSection(), // Quality new OverdueByAgeSection(), - new CycleTimeHistogramSection(), + // new CycleTimeHistogramSection(), new StaleTasksSection(), - new CycleTimePerProjectSection(), + // new CycleTimePerProjectSection(), // Usage - new StatusDistributionSection(), + // new StatusDistributionSection(), new ActiveProjectsSection(), // Financial new IncomeExpenseMonthSection(),