blob: e3958edcbf2115a30815cbae24a17dee4f9ff755 [file] [log] [blame]
--
-- 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.
--
-- Trace bounds
--
-- Fetch start of the trace.
-- @ret LONG Start of the trace in nanoseconds.
SELECT CREATE_FUNCTION(
'TRACE_START()',
'LONG',
'SELECT start_ts FROM trace_bounds;'
);
-- Fetch end of the trace.
-- @ret LONG End of the trace in nanoseconds.
SELECT CREATE_FUNCTION(
'TRACE_END()',
'LONG',
'SELECT end_ts FROM trace_bounds;'
);
-- Fetch duration of the trace.
-- @ret LONG Duration of the trace in nanoseconds.
SELECT CREATE_FUNCTION(
'TRACE_DUR()',
'LONG',
'SELECT TRACE_END() - TRACE_START();'
);
-- Checks whether two spans are overlapping.
--
-- @arg ts1 LONG Start of first span.
-- @arg ts_end1 LONG End of first span.
-- @arg ts2 LONG Start of second span.
-- @arg ts_end2 LONG End of second span.
-- @ret BOOL Whether two spans are overlapping.
SELECT CREATE_FUNCTION(
'IS_SPANS_OVERLAPPING(ts1 LONG, ts_end1 LONG, ts2 LONG, ts_end2 LONG)',
'BOOL',
'
SELECT (IIF($ts1 < $ts2, $ts2, $ts1)
< IIF($ts_end1 < $ts_end2, $ts_end1, $ts_end2))
'
);
--Return the overlapping duration between two spans.
--If either duration is less than 0 or there's no intersection, 0 is returned
--
-- @arg ts1 LONG Timestamp of first slice start.
-- @arg dur1 LONG Duration of first slice.
-- @arg ts2 LONG Timestamp of second slice start.
-- @arg dur2 LONG Duration of second slice.
-- @ret INT Overlapping duration
SELECT CREATE_FUNCTION(
'SPANS_OVERLAPPING_DUR(ts1 LONG, dur1 LONG, ts2 LONG, dur2 LONG)',
'INT',
'
SELECT
CASE
WHEN $dur1 = -1 OR $dur2 = -1 THEN 0
WHEN $ts1 + $dur1 < $ts2 OR $ts2 + $dur2 < $ts1 THEN 0
WHEN ($ts1 >= $ts2) AND ($ts1 + $dur1 <= $ts2 + $dur2) THEN $dur1
WHEN ($ts1 < $ts2) AND ($ts1 + $dur1 < $ts2 + $dur2) THEN $ts1 + $dur1 - $ts2
WHEN ($ts1 > $ts2) AND ($ts1 + $dur1 > $ts2 + $dur2) THEN $ts2 + $dur2 - $ts1
ELSE $dur2
END
'
);