--
-- 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.
--
-- This metric takes each flow event in a InputLatency::{gesture_update} and
-- and computes the time from the ancestor_end of the current flow to the
-- ancestor_ts of the next flow event. This is a reasonable approximation of the
-- time we waited for the next step in the critical flow to start.

-- Provides the {{prefix}}_flow_event table which gives us all the flow events
-- with associated {gesture_update} events we care about and labels them
-- janky or not.
SELECT RUN_METRIC('chrome/{{prefix}}_flow_event.sql');

-- Take each flow and next flow (from {{prefix}}_flow_event table) and generate
-- the metric name as well as compute the time between.
DROP VIEW IF EXISTS {{prefix}}_flow_event_queuing_delay;

CREATE PERFETTO VIEW {{prefix}}_flow_event_queuing_delay AS
SELECT
  trace_id,
  id,
  ts,
  dur,
  track_id,
  {{id_field}},
  avg_vsync_interval,
  {{prefix}}_slice_id,
  {{prefix}}_ts,
  {{prefix}}_dur,
  {{prefix}}_track_id,
  jank,
  step,
  ancestor_id,
  ancestor_ts,
  ancestor_end,
  next_id,
  next_step,
  maybe_next_ancestor_ts,
  next_track_id,
  CASE WHEN trace_id = next_trace_id THEN
      'InputLatency.LatencyInfo.Flow.QueuingDelay.'
      || CASE WHEN
        jank IS NOT NULL
        AND jank = 1
        THEN
        'Jank.'
        ELSE
          'NoJank.'
      END
      || step || '-to-' || next_step
    ELSE
      step
  END AS description,
  CASE WHEN maybe_next_ancestor_ts IS NULL THEN
      NULL
    ELSE
      CASE WHEN maybe_next_ancestor_ts > ancestor_end THEN
        (maybe_next_ancestor_ts - ancestor_end)
        ELSE
          0
      END
  END AS queuing_time_ns
FROM {{prefix}}_flow_event
ORDER BY {{id_field}}, trace_id, ts;
