DELIMITER //

CREATE OR REPLACE FUNCTION `gf_trans_json_v7` (
  p_source TEXT,
  p_actions VARCHAR(1)  -- C(reate) 或 U(pdate)
)
/*
  function   : 將 amis 傳入的字串, 轉為標準 json 格式後回傳給 orm_api(配合 mariadb)
               修改自 gf_trans_json(已不使用)
  description: 呼叫範例  SELECT gf_trans_json_v7('xxxx', 'C');
  build date : 2021/09/26
  
  modify history
    item who        date       modify docs
    ==== ========== ========== ================================================
    1    michael    2021/09/26 新增
    2    [改寫者]    2023/11/15 改寫為 MariaDB 版本並最佳化
*/
RETURNS TEXT
DETERMINISTIC
BEGIN
  DECLARE v_max INT; 
  DECLARE v_now INT; 
  DECLARE v_rets TEXT;
  DECLARE v_rows_pos INT;
  DECLARE v_rows_diff_pos INT;
    
  IF p_actions = 'C' THEN
    SET v_rets = SUBSTRING(p_source, 2, CHAR_LENGTH(p_source) - 1);
    
    -- step1: 先移除數字鍵 (最佳化：使用迴圈而非逐次檢查)
    SET v_now = 0;
    WHILE v_now <= 1000 DO
      IF INSTR(v_rets, CONCAT('"', v_now, '":')) > 0 THEN
        SET v_rets = REPLACE(v_rets, CONCAT('"', v_now, '":'), '');
      END IF;
      SET v_now = v_now + 1;
    END WHILE;
    
    -- 移除結尾多餘的 } 字符
    IF RIGHT(v_rets, 2) = '}}' THEN 
      SET v_rets = LEFT(v_rets, CHAR_LENGTH(v_rets) - 1);
    END IF;
    
    SET v_rets = CONCAT('{[', v_rets, ']}');
  ELSEIF p_actions = 'U' THEN
    -- 找出 rows 和 rowsDiff 的位置
    SET v_rows_pos = INSTR(p_source, '"rows":');
    SET v_rows_diff_pos = INSTR(p_source, '"rowsDiff":');
    
    -- 擷取 rows 內容並格式化
    SET v_rets = SUBSTRING(p_source, 1, v_rows_diff_pos - 3);
    SET v_rets = SUBSTRING(v_rets, v_rows_pos + 8, CHAR_LENGTH(v_rets));
    
    SET v_rets = CONCAT('{[', v_rets, ']}');
  END IF;
  
  RETURN v_rets;
END //

DELIMITER ;