WITH numbers AS (
SELECT 1 AS pos UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL
SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL
SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10
),
recursive_prefix AS (
SELECT
o.bucket,
substring_index(o.prefix, '/', n.pos) AS prefix,
o.size_bytes
FROM object_current_state o
CROSS JOIN numbers n
WHERE o.__deleted = 0
AND o.prefix IS NOT NULL
AND o.prefix != ''
AND n.pos <= (length(o.prefix) - length(replace(o.prefix, '/', '')) + 1)
)
SELECT
bucket,
prefix,
COUNT(1) AS total_object_count,
SUM(size_bytes) AS total_size_bytes
FROM recursive_prefix
GROUP BY bucket, prefix;