blob: 74bd271e2893f5eb13a8864342dcf485317a113c [file] [log] [blame]
--
-- Copyright 2023 The Android Open Source Project
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- https://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
SELECT IMPORT('common.counters');
SELECT IMPORT('common.timestamps');
SELECT CREATE_VIEW_FUNCTION(
'INTERNAL_NUMBER_GENERATOR(to INT)',
'num INT',
'WITH NUMS AS
(SELECT 1 num UNION SELECT num + 1
from NUMS
WHERE num < $to)
SELECT num FROM NUMS;'
);
--
-- Get durations for percentile
--
-- All percentiles (range 1-100) for counter track ID in a given time range.
--
-- Percentiles are calculated by:
-- 1. Dividing the sum of duration in time range for each value in the counter
-- by duration of the counter in range. This gives us `percentile_for)value` (DOUBLE).
-- 2. Fetching each percentile by taking floor of each `percentile_for_value`, grouping by
-- resulting `percentile` and MIN from value for each grouping. As we are rounding down,
-- taking MIN assures most reliable data.
-- 3. Filling the possible gaps in percentiles by getting the minimal value from higher
-- percentiles for each gap.
--
-- @arg counter_track_id INT Id of the counter track.
-- @arg start_ts LONG Timestamp of start of time range.
-- @arg end_ts LONG Timestamp of end of time range.
-- @column percentile All of the numbers from 1 to 100.
-- @column value Value for the percentile.
SELECT CREATE_VIEW_FUNCTION(
'COUNTER_PERCENTILES_FOR_TIME_RANGE(counter_track_id INT, start_ts LONG, end_ts LONG)',
'percentile INT, value DOUBLE',
'WITH percentiles_for_value AS (
SELECT
value,
(CAST(SUM(dur) OVER(ORDER BY value ASC) AS DOUBLE) /
($end_ts - MAX($start_ts, EARLIEST_TIMESTAMP_FOR_COUNTER_TRACK($counter_track_id)))) * 100
AS percentile_for_value
FROM COUNTER_FOR_TIME_RANGE($counter_track_id, $start_ts, $end_ts)
ORDER BY value ASC
),
with_gaps AS (
SELECT
CAST(percentile_for_value AS INT) AS percentile,
MIN(value) AS value
FROM percentiles_for_value
GROUP BY percentile
ORDER BY percentile ASC)
SELECT
num AS percentile,
IFNULL(value, MIN(value) OVER (ORDER BY percentile DESC)) AS value
FROM INTERNAL_NUMBER_GENERATOR(100) AS nums
LEFT JOIN with_gaps ON with_gaps.percentile = nums.num
ORDER BY percentile DESC
'
);
-- All percentiles (range 1-100) for counter track ID.
--
-- @arg counter_track_id INT Id of the counter track.
-- @column percentile All of the numbers from 1 to 100.
-- @column value Value for the percentile.
SELECT CREATE_VIEW_FUNCTION(
'COUNTER_PERCENTILES_FOR_TRACK(counter_track_id INT)',
'percentile INT, value DOUBLE',
'SELECT * FROM COUNTER_PERCENTILES_FOR_TIME_RANGE($counter_track_id, TRACE_START(), TRACE_END());'
);
-- Value for specific percentile (range 1-100) for counter track ID in time range.
--
-- @arg counter_track_id INT Id of the counter track.
-- @arg percentile INT Any of the numbers from 1 to 100.
-- @arg start_ts LONG Timestamp of start of time range.
-- @arg end_ts LONG Timestamp of end of time range.
-- @ret DOUBLE Value for the percentile.
SELECT CREATE_FUNCTION(
'COUNTER_TRACK_PERCENTILE_FOR_TIME(counter_track_id INT, percentile INT, start_ts LONG, end_ts LONG)',
'DOUBLE',
'SELECT value
FROM COUNTER_PERCENTILES_FOR_TIME_RANGE($counter_track_id, $start_ts, $end_ts)
WHERE percentile = $percentile;'
);
-- Value for specific percentile (range 1-100) for counter track ID.
--
-- @arg counter_track_id INT Id of the counter track.
-- @arg percentile INT Any of the numbers from 1 to 100.
-- @ret DOUBLE Value for the percentile.
SELECT CREATE_FUNCTION(
'COUNTER_TRACK_PERCENTILE(counter_track_id INT, percentile INT)',
'DOUBLE',
'SELECT COUNTER_TRACK_PERCENTILE_FOR_TIME($counter_track_id, $percentile, TRACE_START(), TRACE_END());'
);