--
-- Copyright 2022 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 RUN_METRIC("android/android_cpu_agg.sql");

DROP VIEW IF EXISTS p_state_cpu_idle_counter;
CREATE PERFETTO VIEW p_state_cpu_idle_counter AS
SELECT
  ts,
  ts - LAG(ts) OVER (
    PARTITION BY track_id
    ORDER BY
      ts
  ) AS dur,
  cpu,
  iif(value = 4294967295, -1, cast(value AS int)) AS idle_value
FROM
  counter c
JOIN cpu_counter_track t ON c.track_id = t.id
WHERE
  t.name = "cpuidle";

CREATE VIRTUAL TABLE p_state_sched_freq_idle USING span_join(
  cpu_freq_sched_per_thread PARTITIONED cpu,
  p_state_cpu_idle_counter PARTITIONED cpu
);

CREATE OR REPLACE PERFETTO FUNCTION p_state_over_interval(
  start_ns LONG, end_ns LONG)
RETURNS TABLE(cpu INT, freq_khz INT, idle_value INT, dur_ns INT)
AS
WITH sched_freq_idle_windowed AS (
  SELECT
    freq_khz,
    idle_value,
    cpu,
    IIF(ts + dur <= $end_ns, ts + dur, $end_ns) - IIF(ts >= $start_ns, ts, $start_ns) AS dur
  FROM
    p_state_sched_freq_idle
  WHERE
    ts + dur > $start_ns
    AND ts < $end_ns
)
SELECT
  cast(cpu AS int) AS cpu,
  cast(freq_khz AS int) AS freq_khz,
  cast(idle_value AS int) AS idle_value,
  cast(sum(dur) AS int) AS dur_ns
FROM
  sched_freq_idle_windowed
WHERE
  freq_khz > 0
GROUP BY
  cpu,
  freq_khz,
  idle_value;
