--
-- Copyright 2021 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.

DROP VIEW IF EXISTS freq_slice;

CREATE VIEW freq_slice AS
SELECT
  counter.track_id AS track_id,
  track.name AS freq_name,
  ts,
  value AS freq_value,
  LEAD(ts, 1, (SELECT end_ts + 1 FROM trace_bounds))
  OVER (PARTITION BY track.id ORDER BY ts) - ts AS duration
FROM counter
LEFT JOIN track ON counter.track_id = track.id
WHERE track.name GLOB "* Frequency"
ORDER BY ts;

DROP VIEW IF EXISTS freq_total_duration;

CREATE VIEW freq_total_duration AS
SELECT
  track_id,
  freq_name,
  SUM(duration) AS total_duration
FROM freq_slice
WHERE duration > 0
GROUP BY track_id, freq_name;

DROP VIEW IF EXISTS dvfs_per_band_view;

CREATE VIEW dvfs_per_band_view AS
WITH
freq_duration AS (
  SELECT
    track_id,
    freq_name,
    CAST(freq_value AS int) AS freq_value,
    SUM(duration) AS duration_ns
  FROM freq_slice
  WHERE duration > 0
  GROUP BY track_id, freq_name, freq_value
)
SELECT
  freq_duration.track_id,
  freq_duration.freq_name,
  AndroidDvfsMetric_BandStat(
    'freq_value', freq_value,
    'percentage', duration_ns / (total_duration / 1e2),
    'duration_ns', duration_ns
  ) AS proto
FROM freq_duration
LEFT JOIN freq_total_duration
  USING(track_id)
ORDER BY freq_duration.freq_name, freq_duration.freq_value;

DROP VIEW IF EXISTS dvfs_per_freq_view;
CREATE VIEW dvfs_per_freq_view AS
SELECT
  AndroidDvfsMetric_FrequencyResidency(
    'freq_name', freq_total_duration.freq_name,
    'band_stat', (
      SELECT
        RepeatedField(proto)
      FROM dvfs_per_band_view
      WHERE dvfs_per_band_view.track_id = freq_total_duration.track_id
    )
  ) AS proto
FROM freq_total_duration
GROUP BY track_id, freq_name
ORDER BY freq_name;

DROP VIEW IF EXISTS android_dvfs_output;
CREATE VIEW android_dvfs_output AS
SELECT AndroidDVFSMetric(
    'freq_residencies', (
      SELECT
        RepeatedField(proto)
      FROM dvfs_per_freq_view
    )
  );
