forked from googol/benchmark
49 lines
1.5 KiB
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; |