benchmark/sql/method_api_depth.sql

49 lines
1.5 KiB
SQL

-- 插入数据
INSERT INTO method_api_depth (method_id, api_id, min_depth, max_depth, min_depth_path, max_depth_path)
WITH RECURSIVE call_chain (method_id, api_id, depth, PATH) AS (
-- 直接调用 API 的方法
SELECT
ac.caller_method_id,
ac.api_id,
1 AS depth,
CAST(ac.caller_method_id AS CHAR(8000)) AS PATH
FROM
api_call ac
UNION ALL
-- 向上追溯调用者
SELECT
mmc.caller_method_id,
cc.api_id,
cc.depth + 1,
CONCAT(mmc.caller_method_id, ' -> ', cc.path)
FROM
method_call mmc
JOIN
call_chain cc ON mmc.callee_method_id = cc.method_id
-- 递归深度限制
WHERE
INSTR(cc.path, mmc.caller_method_id) = 0 AND cc.depth < 5
),
ranked_paths AS (
SELECT
method_id,
api_id,
depth + 1 AS final_depth,
CONCAT(PATH, ' -> api(', api_id, ')') AS full_path,
ROW_NUMBER() OVER(PARTITION BY method_id, api_id ORDER BY (depth + 1) ASC, CONCAT(PATH, ' -> api(', api_id, ')') ASC) AS rn_asc,
ROW_NUMBER() OVER(PARTITION BY method_id, api_id ORDER BY (depth + 1) DESC, CONCAT(PATH, ' -> api(', api_id, ')') ASC) AS rn_desc
FROM
call_chain
)
-- 聚合结果
SELECT
method_id,
api_id,
MIN(final_depth) AS min_depth,
MAX(final_depth) AS max_depth,
MAX(CASE WHEN rn_asc = 1 THEN full_path END) AS min_depth_path,
MAX(CASE WHEN rn_desc = 1 THEN full_path END) AS max_depth_path
FROM
ranked_paths
GROUP BY
method_id, api_id;