-- 修改解析任务存储库表的task_source字段类型
-- 将task_source字段从VARCHAR(300)修改为JSONB类型

-- 开始事务
BEGIN;

-- 步骤1: 添加一个临时的JSONB字段
ALTER TABLE public.parse_task_repository 
ADD COLUMN task_source_new JSONB;

-- 步骤2: 将现有的VARCHAR数据转换并复制到新字段
-- 对于已经是JSON格式的字符串，直接转换
-- 对于普通字符串，包装成JSON对象
UPDATE public.parse_task_repository 
SET task_source_new = CASE 
    -- 尝试解析为JSON，如果成功则使用解析结果
    WHEN task_source::text ~ '^[\[\{].*[\]\}]$' THEN task_source::jsonb
    -- 如果不是JSON格式，包装成简单的JSON对象
    ELSE json_build_object('source', task_source, 'migrated', true)::jsonb
END;

-- 步骤3: 删除原有字段
ALTER TABLE public.parse_task_repository 
DROP COLUMN task_source;

-- 步骤4: 重命名新字段
ALTER TABLE public.parse_task_repository 
RENAME COLUMN task_source_new TO task_source;

-- 步骤5: 设置字段为NOT NULL (如果需要)
ALTER TABLE public.parse_task_repository 
ALTER COLUMN task_source SET NOT NULL;

-- 步骤6: 更新字段注释
COMMENT ON COLUMN public.parse_task_repository.task_source IS '任务来源，JSONB格式，包含详细的来源信息';

-- 提交事务
COMMIT;

-- 验证修改结果
SELECT 
    column_name, 
    data_type, 
    is_nullable,
    column_default
FROM information_schema.columns 
WHERE table_name = 'parse_task_repository' 
  AND column_name = 'task_source';

-- 显示一些示例数据以验证转换
SELECT 
    id,
    task_name,
    task_source,
    pg_typeof(task_source) as data_type
FROM public.parse_task_repository 
LIMIT 5; 