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

-- Needed for the scroll_jank table to tell which updates were janky.
SELECT RUN_METRIC('chrome/scroll_jank.sql');

--------------------------------------------------------------------------------
-- Get all the track ids relevant to the critical path.
--------------------------------------------------------------------------------

-- Grab the track of the browser. sendTouchEvent is a Java category event which
-- only occurs on the browser. This saves us the trouble of dealing with all the
-- different possible names of the browser (when including system tracing).
DROP VIEW IF EXISTS browser_main_track_id;
CREATE VIEW browser_main_track_id AS
SELECT
  track_id AS id
FROM slice
WHERE
  name = "sendTouchEvent"
LIMIT 1;

--------------------------------------------------------------------------------
-- Grab the last LatencyInfo.Flow for each trace_id on the browser main.
--------------------------------------------------------------------------------
DROP VIEW IF EXISTS browser_flows;
CREATE VIEW browser_flows AS
SELECT
  EXTRACT_ARG(arg_set_id, "chrome_latency_info.trace_id") AS trace_id,
  EXTRACT_ARG(arg_set_id, "chrome_latency_info.step") AS flow_step,
  track_id,
  max(ts) AS ts
FROM slice
WHERE
  track_id = (
    SELECT id FROM browser_main_track_id
  )
  AND name = "LatencyInfo.Flow"
GROUP BY trace_id;

--------------------------------------------------------------------------------
-- Join the relevant tracks/flows to the individual scrolls.
--------------------------------------------------------------------------------

-- Keeping only the GestureScrollUpdates join the maximum flows on the browser
-- thread. 
DROP VIEW IF EXISTS scroll_with_browser_flows;
CREATE VIEW scroll_with_browser_flows AS
SELECT
  scroll.trace_id,
  scroll.scroll_id,
  scroll.ts,
  scroll.dur,
  scroll.track_id,
  browser_flows.ts AS browser_flow_ts,
  browser_flows.flow_step AS browser_flow_step,
  browser_flows.track_id AS browser_track_id
FROM (
  SELECT
    trace_id,
    id AS scroll_id,
    ts,
    dur,
    track_id
  FROM scroll_jank
) scroll JOIN browser_flows ON
  scroll.trace_id = browser_flows.trace_id;

--------------------------------------------------------------------------------
-- Below we determine if there was any bitmaps taken on the browser main.
--------------------------------------------------------------------------------
DROP VIEW IF EXISTS get_bitmap_calls;
CREATE VIEW get_bitmap_calls AS
SELECT
  id,
  ts,
  dur,
  track_id
FROM slice
WHERE
  slice.name = "ViewResourceAdapter:getBitmap"
  AND track_id = (SELECT id FROM browser_main_track_id);

DROP VIEW IF EXISTS toolbar_bitmaps;
CREATE VIEW toolbar_bitmaps AS
SELECT
  slice.id,
  slice.ts,
  slice.dur,
  slice.track_id,
  ancestor.id AS ancestor_id
FROM
  slice JOIN
  ancestor_slice(slice.id) AS ancestor ON
    ancestor.depth = slice.depth - 1
WHERE
  slice.name = "ToolbarLayout.draw"
  AND ancestor.name = "ViewResourceAdapter:getBitmap"
  AND slice.track_id = (SELECT id FROM browser_main_track_id);

DROP VIEW IF EXISTS get_bitmaps_and_toolbar;
CREATE VIEW get_bitmaps_and_toolbar AS
SELECT
  bitmap.id AS id,
  bitmap.ts AS ts,
  bitmap.dur AS dur,
  bitmap.track_id AS track_id,
  toolbar.id AS toolbar_id,
  toolbar.ts AS toolbar_ts,
  toolbar.dur AS toolbar_dur,
  toolbar.track_id AS toolbar_track_id
FROM
  get_bitmap_calls bitmap LEFT JOIN
  toolbar_bitmaps toolbar ON
    toolbar.ancestor_id = bitmap.id;

--------------------------------------------------------------------------------
-- Take bitmaps and determine if it could have been blocked by a scroll. I.E. if
-- the bitmap occurred after the start of the GestureScrollUpdate but before the
-- last flow on the browser thread (the GestureScrollUpdate can't be blocked
-- by a browser thread slice once its done on the browser thread).
--------------------------------------------------------------------------------
DROP VIEW IF EXISTS blocking_bitmap_tasks;
CREATE VIEW blocking_bitmap_tasks AS
SELECT
  scroll.scroll_id,
  scroll.trace_id,
  bitmap.id,
  bitmap.ts,
  bitmap.dur,
  bitmap.track_id,
  COALESCE(bitmap.track_id = scroll.browser_track_id
    AND bitmap.ts < scroll.browser_flow_ts, FALSE) AS blocked_by_bitmap,
  COALESCE(bitmap.track_id = scroll.browser_track_id
    AND bitmap.toolbar_id IS NOT NULL
    AND bitmap.ts < scroll.browser_flow_ts, FALSE) AS blocked_by_toolbar,
  COALESCE(bitmap.track_id = scroll.browser_track_id
    AND bitmap.toolbar_id IS NULL
    AND bitmap.ts < scroll.browser_flow_ts, FALSE) AS blocked_by_bitmap_no_toolbar
FROM
  scroll_with_browser_flows scroll JOIN
  get_bitmaps_and_toolbar bitmap ON
    scroll.ts + scroll.dur >= bitmap.ts
    AND bitmap.ts + bitmap.dur >= scroll.ts;


--------------------------------------------------------------------------------
-- Remove duplicate tasks blocking so that there is only a boolean per
-- scroll_id.
--------------------------------------------------------------------------------
DROP VIEW IF EXISTS scroll_jank_cause_get_bitmap;
CREATE VIEW scroll_jank_cause_get_bitmap AS
SELECT
  scroll_id,
  trace_id,
  SUM(blocked_by_bitmap) > 0 AS blocked_by_bitmap,
  SUM(blocked_by_toolbar) > 0 AS blocked_by_toolbar,
  SUM(blocked_by_bitmap_no_toolbar) > 0 AS blocked_by_bitmap_no_toolbar
FROM blocking_bitmap_tasks
GROUP BY 1, 2;
