• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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