1-- 2-- Copyright 2024 The Android Open Source Project 3-- 4-- Licensed under the Apache License, Version 2.0 (the "License"); 5-- you may not use this file except in compliance with the License. 6-- You may obtain a copy of the License at 7-- 8-- https://www.apache.org/licenses/LICENSE-2.0 9-- 10-- Unless required by applicable law or agreed to in writing, software 11-- distributed under the License is distributed on an "AS IS" BASIS, 12-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13-- See the License for the specific language governing permissions and 14-- limitations under the License. 15 16INCLUDE PERFETTO MODULE viz.summary.slices; 17 18CREATE PERFETTO TABLE _track_event_tracks_unordered AS 19WITH 20 extracted AS ( 21 SELECT 22 t.id, 23 t.name, 24 t.parent_id, 25 extract_arg(t.source_arg_set_id, 'child_ordering') AS ordering, 26 extract_arg(t.source_arg_set_id, 'sibling_order_rank') AS rank 27 FROM track AS t 28 WHERE 29 t.type GLOB '*_track_event' 30 ) 31SELECT 32 t.id, 33 t.name, 34 t.parent_id, 35 p.ordering AS parent_ordering, 36 coalesce(t.rank, 0) AS rank 37FROM extracted AS t 38LEFT JOIN extracted AS p 39 ON t.parent_id = p.id; 40 41CREATE PERFETTO TABLE _min_ts_per_track AS 42SELECT 43 track_id AS id, 44 min(ts) AS min_ts 45FROM counter 46GROUP BY 47 track_id 48UNION ALL 49SELECT 50 track_id AS id, 51 min(ts) AS min_ts 52FROM slice 53GROUP BY 54 track_id; 55 56CREATE PERFETTO TABLE _track_event_has_children AS 57SELECT DISTINCT 58 t.parent_id AS id 59FROM track AS t 60WHERE 61 t.type GLOB '*_track_event' AND t.parent_id IS NOT NULL; 62 63CREATE PERFETTO TABLE _track_event_tracks_ordered_groups AS 64WITH 65 lexicographic_and_none AS ( 66 SELECT 67 id, 68 row_number() OVER (PARTITION BY parent_id ORDER BY name) AS order_id 69 FROM _track_event_tracks_unordered AS t 70 WHERE 71 t.parent_ordering = 'lexicographic' OR t.parent_ordering IS NULL 72 ), 73 explicit AS ( 74 SELECT 75 id, 76 row_number() OVER (PARTITION BY parent_id ORDER BY rank) AS order_id 77 FROM _track_event_tracks_unordered AS t 78 WHERE 79 t.parent_ordering = 'explicit' 80 ), 81 chronological AS ( 82 SELECT 83 t.id, 84 row_number() OVER (PARTITION BY t.parent_id ORDER BY m.min_ts) AS order_id 85 FROM _track_event_tracks_unordered AS t 86 LEFT JOIN _min_ts_per_track AS m 87 USING (id) 88 WHERE 89 t.parent_ordering = 'chronological' 90 ), 91 unioned AS ( 92 SELECT 93 id, 94 order_id 95 FROM lexicographic_and_none 96 UNION ALL 97 SELECT 98 id, 99 order_id 100 FROM explicit 101 UNION ALL 102 SELECT 103 id, 104 order_id 105 FROM chronological 106 ) 107SELECT 108 extract_arg(track.dimension_arg_set_id, 'upid') AS upid, 109 extract_arg(track.dimension_arg_set_id, 'utid') AS utid, 110 track.parent_id, 111 track.type GLOB '*counter*' AS is_counter, 112 track.name, 113 min(counter_track.unit) AS unit, 114 min(extract_arg(track.source_arg_set_id, 'builtin_counter_type')) AS builtin_counter_type, 115 max(m.id IS NOT NULL) AS has_data, 116 max(c.id IS NOT NULL) AS has_children, 117 GROUP_CONCAT(unioned.id) AS track_ids, 118 min(unioned.order_id) AS order_id 119FROM unioned 120JOIN track 121 USING (id) 122LEFT JOIN counter_track 123 USING (id) 124LEFT JOIN _track_event_has_children AS c 125 USING (id) 126LEFT JOIN _min_ts_per_track AS m 127 USING (id) 128GROUP BY 129 -- Merge by parent id if it exists or, if not, then by upid/utid scope. 130 coalesce('Tp' || track.parent_id, 'Pr' || upid, 'Th' || utid), 131 is_counter, 132 track.name, 133 -- Don't merge tracks by name which have children or are counters. 134 iif(NOT c.id IS NULL OR is_counter, track.id, NULL) 135ORDER BY 136 track.parent_id, 137 unioned.order_id; 138