-- Copyright 2023 The Chromium Authors
-- Use of this source code is governed by a BSD-style license that can be
-- found in the LICENSE file.

INCLUDE PERFETTO MODULE chrome.speedometer_2_1;

INCLUDE PERFETTO MODULE chrome.speedometer_3;

CREATE PERFETTO FUNCTION _chrome_speedometer_version()
RETURNS STRING AS
WITH
  num_measures AS (
    SELECT
      '2.1' AS version,
      count(*) AS num_measures
    FROM chrome_speedometer_2_1_measure
    UNION ALL
    SELECT
      '3' AS version,
      count(*) AS num_measures
    FROM chrome_speedometer_3_measure
  )
SELECT
  version
FROM num_measures
ORDER BY
  num_measures DESC
LIMIT 1;

-- Augmented slices for Speedometer measurements.
-- These are the intervals of time Speedometer uses to compute the final score.
-- There are two intervals that are measured for every test: sync and async
CREATE PERFETTO TABLE chrome_speedometer_measure (
  -- Start timestamp of the measure slice
  ts TIMESTAMP,
  -- Duration of the measure slice
  dur DURATION,
  -- Full measure name
  name STRING,
  -- Speedometer iteration the slice belongs to.
  iteration LONG,
  -- Suite name
  suite_name STRING,
  -- Test name
  test_name STRING,
  -- Type of the measure (sync or async)
  measure_type STRING
) AS
WITH
  all_versions AS (
    SELECT
      '2.1' AS version,
      *
    FROM chrome_speedometer_2_1_measure
    UNION ALL
    SELECT
      '3' AS version,
      *
    FROM chrome_speedometer_3_measure
  )
SELECT
  ts,
  dur,
  name,
  iteration,
  suite_name,
  test_name,
  measure_type
FROM all_versions
WHERE
  version = _chrome_speedometer_version();

-- Slice that covers one Speedometer iteration.
-- Depending on the Speedometer version these slices might need to be estimated
-- as older versions of Speedometer to not emit marks for this interval. The
-- metrics associated are the same ones Speedometer would output, but note we
-- use ns precision (Speedometer uses ~100us) so the actual values might differ
-- a bit.
CREATE PERFETTO TABLE chrome_speedometer_iteration (
  -- Start timestamp of the iteration
  ts TIMESTAMP,
  -- Duration of the iteration
  dur DURATION,
  -- Iteration name
  name STRING,
  -- Iteration number
  iteration LONG,
  -- Geometric mean of the suite durations for this iteration.
  geomean DOUBLE,
  -- Speedometer score for this iteration (The total score for a run in the
  -- average of all iteration scores).
  score DOUBLE
) AS
WITH
  all_versions AS (
    SELECT
      '2.1' AS version,
      *
    FROM chrome_speedometer_2_1_iteration
    UNION ALL
    SELECT
      '3' AS version,
      *
    FROM chrome_speedometer_3_iteration
  )
SELECT
  ts,
  dur,
  name,
  iteration,
  geomean,
  score
FROM all_versions
WHERE
  version = _chrome_speedometer_version();

-- Returns the Speedometer score for all iterations in the trace
CREATE PERFETTO FUNCTION chrome_speedometer_score()
-- Speedometer score
RETURNS DOUBLE AS
SELECT
  iif(
    _chrome_speedometer_version() = '3',
    chrome_speedometer_3_score(),
    chrome_speedometer_2_1_score()
  );

-- Returns the utid for the main thread that ran Speedometer 3
CREATE PERFETTO FUNCTION chrome_speedometer_renderer_main_utid()
-- Renderer main utid
RETURNS LONG AS
SELECT
  iif(
    _chrome_speedometer_version() = '3',
    chrome_speedometer_3_renderer_main_utid(),
    chrome_speedometer_2_1_renderer_main_utid()
  );
