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

-- Stores sets of tables that make sense together (e.g. slices on the main thread
-- and frame boundaries on the main thread).
-- Used to simplify passing arguments to other functions / metrics.
DROP TABLE IF EXISTS android_jank_cuj_table_set;
CREATE TABLE android_jank_cuj_table_set(
    name TEXT,
    slice_table_name TEXT,
    frame_boundary_table_name TEXT,
    cuj_boundary_table_name TEXT,
    frame_table_name TEXT);

INSERT INTO android_jank_cuj_table_set(
    name,
    slice_table_name,
    frame_boundary_table_name,
    cuj_boundary_table_name,
    frame_table_name)
VALUES
('App threads',
  'android_jank_cuj_slice',
  'android_jank_cuj_frame',
  'android_jank_cuj_boundary',
  'android_jank_cuj_frame'),
('MainThread',
  'android_jank_cuj_main_thread_slice',
  'android_jank_cuj_main_thread_frame_boundary',
  'android_jank_cuj_main_thread_cuj_boundary',
  'android_jank_cuj_frame'),
('RenderThread',
  'android_jank_cuj_render_thread_slice',
  'android_jank_cuj_render_thread_frame_boundary',
  'android_jank_cuj_render_thread_cuj_boundary',
  'android_jank_cuj_frame'),
('SF threads',
  'android_jank_cuj_sf_slice',
  'android_jank_cuj_sf_frame',
  'android_jank_cuj_sf_boundary',
  'android_jank_cuj_sf_frame'),
('SF MainThread',
  'android_jank_cuj_sf_main_thread_slice',
  'android_jank_cuj_sf_main_thread_frame_boundary',
  'android_jank_cuj_sf_main_thread_cuj_boundary',
  'android_jank_cuj_sf_frame'),
('SF RenderEngine',
  'android_jank_cuj_sf_render_engine_slice',
  'android_jank_cuj_sf_render_engine_frame_boundary',
  'android_jank_cuj_sf_boundary',
  'android_jank_cuj_sf_frame');

-- Functions below retrieve specific columns for a given table set.

SELECT CREATE_FUNCTION(
   'ANDROID_JANK_CUJ_TABLE_SET_SLICE(table_set STRING)',
   'STRING',
   'SELECT slice_table_name FROM android_jank_cuj_table_set ts WHERE ts.name = $table_set'
);

SELECT CREATE_FUNCTION(
   'ANDROID_JANK_CUJ_TABLE_SET_FRAME_BOUNDARY(table_set STRING)',
   'STRING',
   'SELECT frame_boundary_table_name FROM android_jank_cuj_table_set ts WHERE ts.name = $table_set'
);

SELECT CREATE_FUNCTION(
   'ANDROID_JANK_CUJ_TABLE_SET_CUJ_BOUNDARY(table_set STRING)',
   'STRING',
   'SELECT cuj_boundary_table_name FROM android_jank_cuj_table_set ts WHERE ts.name = $table_set'
);

SELECT CREATE_FUNCTION(
   'ANDROID_JANK_CUJ_TABLE_SET_FRAME(table_set STRING)',
   'STRING',
   'SELECT frame_table_name FROM android_jank_cuj_table_set ts WHERE ts.name = $table_set'
);

-- Checks if two slices, described by ts and dur, ts_second and dur_second, overlap.
-- Does not handle cases where slices are unfinished (dur = -1).
SELECT
  CREATE_FUNCTION(
    'ANDROID_JANK_CUJ_SLICE_OVERLAPS(ts LONG, dur LONG, ts_second LONG, dur_second LONG)',
    'BOOL',
    'SELECT
      -- A starts before B ends and A ends after B starts
      ($ts < $ts_second + $dur_second AND $ts + $dur > $ts_second)
      -- or A starts after B starts and A ends before B ends
      OR ($ts > $ts_second AND $ts < $ts_second + $ts_dur)');
