trying to rework database migrations
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
-- Migration: Consolidate workflow_task_execution into execution table
|
||||
-- Description: Adds workflow_task JSONB column to execution table and migrates data from workflow_task_execution
|
||||
-- Version: 20260127212500
|
||||
|
||||
|
||||
-- ============================================================================
|
||||
-- STEP 1: Add workflow_task column to execution table
|
||||
-- ============================================================================
|
||||
|
||||
ALTER TABLE execution ADD COLUMN workflow_task JSONB;
|
||||
|
||||
COMMENT ON COLUMN execution.workflow_task IS 'Workflow task metadata (only populated for workflow task executions)';
|
||||
|
||||
-- ============================================================================
|
||||
-- STEP 2: Migrate existing workflow_task_execution data to execution.workflow_task
|
||||
-- ============================================================================
|
||||
|
||||
-- Update execution records with workflow task metadata
|
||||
UPDATE execution e
|
||||
SET workflow_task = jsonb_build_object(
|
||||
'workflow_execution', wte.workflow_execution,
|
||||
'task_name', wte.task_name,
|
||||
'task_index', wte.task_index,
|
||||
'task_batch', wte.task_batch,
|
||||
'retry_count', wte.retry_count,
|
||||
'max_retries', wte.max_retries,
|
||||
'next_retry_at', to_char(wte.next_retry_at, 'YYYY-MM-DD"T"HH24:MI:SS.US"Z"'),
|
||||
'timeout_seconds', wte.timeout_seconds,
|
||||
'timed_out', wte.timed_out,
|
||||
'duration_ms', wte.duration_ms,
|
||||
'started_at', to_char(wte.started_at, 'YYYY-MM-DD"T"HH24:MI:SS.US"Z"'),
|
||||
'completed_at', to_char(wte.completed_at, 'YYYY-MM-DD"T"HH24:MI:SS.US"Z"')
|
||||
)
|
||||
FROM workflow_task_execution wte
|
||||
WHERE e.id = wte.execution;
|
||||
|
||||
-- ============================================================================
|
||||
-- STEP 3: Create indexes for efficient JSONB queries
|
||||
-- ============================================================================
|
||||
|
||||
-- General GIN index for JSONB operations
|
||||
CREATE INDEX idx_execution_workflow_task_gin ON execution USING GIN (workflow_task)
|
||||
WHERE workflow_task IS NOT NULL;
|
||||
|
||||
-- Specific index for workflow_execution lookups (most common query)
|
||||
CREATE INDEX idx_execution_workflow_execution ON execution ((workflow_task->>'workflow_execution'))
|
||||
WHERE workflow_task IS NOT NULL;
|
||||
|
||||
-- Index for task name lookups
|
||||
CREATE INDEX idx_execution_task_name ON execution ((workflow_task->>'task_name'))
|
||||
WHERE workflow_task IS NOT NULL;
|
||||
|
||||
-- Index for retry queries (using text comparison to avoid IMMUTABLE issue)
|
||||
CREATE INDEX idx_execution_pending_retries ON execution ((workflow_task->>'next_retry_at'))
|
||||
WHERE workflow_task IS NOT NULL
|
||||
AND workflow_task->>'next_retry_at' IS NOT NULL;
|
||||
|
||||
-- Index for timeout queries
|
||||
CREATE INDEX idx_execution_timed_out ON execution ((workflow_task->>'timed_out'))
|
||||
WHERE workflow_task IS NOT NULL;
|
||||
|
||||
-- Index for workflow task status queries (combined with execution status)
|
||||
CREATE INDEX idx_execution_workflow_status ON execution (status, (workflow_task->>'workflow_execution'))
|
||||
WHERE workflow_task IS NOT NULL;
|
||||
|
||||
-- ============================================================================
|
||||
-- STEP 4: Drop the workflow_task_execution table
|
||||
-- ============================================================================
|
||||
|
||||
-- Drop the old table (this will cascade delete any dependent objects)
|
||||
DROP TABLE IF EXISTS workflow_task_execution CASCADE;
|
||||
|
||||
-- ============================================================================
|
||||
-- STEP 5: Update comments and documentation
|
||||
-- ============================================================================
|
||||
|
||||
COMMENT ON INDEX idx_execution_workflow_task_gin IS 'GIN index for general JSONB queries on workflow_task';
|
||||
COMMENT ON INDEX idx_execution_workflow_execution IS 'Index for finding tasks by workflow execution ID';
|
||||
COMMENT ON INDEX idx_execution_task_name IS 'Index for finding tasks by name';
|
||||
COMMENT ON INDEX idx_execution_pending_retries IS 'Index for finding tasks pending retry';
|
||||
COMMENT ON INDEX idx_execution_timed_out IS 'Index for finding timed out tasks';
|
||||
COMMENT ON INDEX idx_execution_workflow_status IS 'Index for workflow task status queries';
|
||||
|
||||
-- ============================================================================
|
||||
-- VERIFICATION QUERIES (for manual testing)
|
||||
-- ============================================================================
|
||||
|
||||
-- Verify migration: Count workflow task executions
|
||||
-- SELECT COUNT(*) FROM execution WHERE workflow_task IS NOT NULL;
|
||||
|
||||
-- Verify indexes exist
|
||||
-- SELECT indexname, indexdef FROM pg_indexes WHERE tablename = 'execution' AND indexname LIKE '%workflow%';
|
||||
|
||||
-- Test workflow task queries
|
||||
-- SELECT * FROM execution WHERE workflow_task->>'workflow_execution' = '1';
|
||||
-- SELECT * FROM execution WHERE workflow_task->>'task_name' = 'example_task';
|
||||
-- SELECT * FROM execution WHERE (workflow_task->>'timed_out')::boolean = true;
|
||||
Reference in New Issue
Block a user