1/*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15import { JanksStruct } from '../../bean/JanksStruct';
16import { query } from '../SqlLite';
17
18export const queryExpectedFrameDate = (): Promise<Array<JanksStruct>> =>
19  query(
20    'queryExpectedFrameDate',
21    `
22    SELECT
23        sf.id,
24        'frameTime' as frameType,
25        fs.ipid,
26        fs.vsync as name,
27        fs.dur as app_dur,
28        (sf.ts + sf.dur - fs.ts) as dur,
29        (fs.ts - TR.start_ts) AS ts,
30        fs.type,
31        fs.flag,
32        pro.pid,
33        pro.name as cmdline,
34        (sf.ts - TR.start_ts) AS rs_ts,
35        sf.vsync AS rs_vsync,
36        sf.dur AS rs_dur,
37        sf.ipid AS rs_ipid,
38        proc.pid AS rs_pid,
39        proc.name AS rs_name
40    FROM frame_slice AS fs
41    LEFT JOIN process AS pro ON pro.id = fs.ipid
42    LEFT JOIN frame_slice AS sf ON fs.dst = sf.id
43    LEFT JOIN process AS proc ON proc.id = sf.ipid
44    LEFT JOIN trace_range TR
45    WHERE fs.dst IS NOT NULL
46        AND fs.type = 1
47    UNION
48    SELECT
49        -1 as id,
50        'frameTime' as frameType,
51        fs.ipid,
52        fs.vsync  as name,
53        fs.dur as app_dur,
54        fs.dur,
55        (fs.ts - TR.start_ts) AS ts,
56        fs.type,
57        fs.flag,
58        pro.pid,
59        pro.name as cmdline,
60        NULL AS rs_ts,
61        NULL AS rs_vsync,
62        NULL AS rs_dur,
63        NULL AS rs_ipid,
64        NULL AS rs_pid,
65        NULL AS rs_name
66    FROM frame_slice AS fs
67    LEFT JOIN process AS pro ON pro.id = fs.ipid
68    LEFT JOIN trace_range TR
69    WHERE fs.dst IS NULL
70    AND pro.name NOT LIKE '%render_service%'
71    AND fs.type = 1
72    ORDER BY ts;`
73  );
74export const queryJumpJanksData = (
75  processId: number,
76  vsync: number
77): //@ts-ignore
78Promise<Array<unknown>> =>
79  query(
80    'queryJumpJanksData',
81    `
82        SELECT
83            fs.id,
84            fs.ts - TR.start_ts as ts,
85            fs.vsync AS name,
86            fs.type,
87            fs.dur,
88            0 as depth,
89            'app' as frameType,
90            fs.src as src_slice,
91            fs.flag as jank_tag,
92            fs.dst as dst_slice,
93            p.pid,
94            p.name AS cmdline
95        FROM frame_slice AS fs, trace_range as TR
96        LEFT JOIN process AS p ON fs.ipid = p.ipid
97        WHERE fs.type = 0 and p.pid = $processId and fs.vsync = $vsync;`,
98    { $processId: processId, $vsync: vsync }
99  );
100export const queryAllJankProcess = (): Promise<
101  Array<{
102    pid: number;
103  }>
104> =>
105  query(
106    'queryAllJankProcess',
107    `
108        SELECT DISTINCT p.pid
109        FROM frame_slice AS a
110        LEFT JOIN process AS p ON a.ipid = p.ipid
111        `
112  );
113export const queryAllActualData = (): //@ts-ignore
114Promise<Array<unknown>> =>
115  query(
116    'queryAllActualData',
117    `
118        SELECT 
119               a.id,
120               (a.ts - TR.start_ts) AS ts,
121               a.vsync AS name,
122               a.type,
123               a.dur,
124               a.src AS src_slice,
125               a.flag AS jank_tag,
126               a.dst AS dst_slice,
127               p.pid,
128               p.name AS cmdline,
129               (case when p.name like '%render_service' then 'render_service' else 'app' end) as frameType
130        FROM frame_slice AS a, trace_range AS TR
131                 LEFT JOIN process AS p ON a.ipid = p.ipid
132        WHERE a.type = 0
133          AND a.flag <> 2
134        ORDER BY a.ipid, ts;`
135  );
136export const queryActualFrameDate = (): //@ts-ignore
137Promise<Array<unknown>> =>
138  query(
139    'queryActualFrameDate',
140    `SELECT
141         sf.id,
142         'frameTime' as frameType,
143         fs.ipid,
144         fs.vsync as name,
145         fs.dur as app_dur,
146         (sf.ts + sf.dur - fs.ts) as dur,
147         (fs.ts - TR.start_ts) AS ts,
148         fs.type,
149         (case when (sf.flag == 1 or fs.flag == 1 ) then 1  when (sf.flag == 3 or fs.flag == 3 ) then 3 else 0 end) as jank_tag,
150         pro.pid,
151         pro.name as cmdline,
152         (sf.ts - TR.start_ts) AS rs_ts,
153         sf.vsync AS rs_vsync,
154         sf.dur AS rs_dur,
155         sf.ipid AS rs_ipid,
156         proc.pid AS rs_pid,
157         proc.name AS rs_name
158     FROM frame_slice AS fs
159              LEFT JOIN process AS pro ON pro.id = fs.ipid
160              LEFT JOIN frame_slice AS sf ON fs.dst = sf.id
161              LEFT JOIN process AS proc ON proc.id = sf.ipid
162              LEFT JOIN trace_range TR
163     WHERE fs.dst IS NOT NULL
164       AND fs.type = 0
165       AND fs.flag <> 2
166     UNION
167     SELECT
168         -1 as id,
169         'frameTime' as frameType,
170         fs.ipid,
171         fs.vsync  as name,
172         fs.dur as app_dur,
173         fs.dur,
174         (fs.ts - TR.start_ts) AS ts,
175         fs.type,
176         fs.flag as jank_tag,
177         pro.pid,
178         pro.name as cmdline,
179         NULL AS rs_ts,
180         NULL AS rs_vsync,
181         NULL AS rs_dur,
182         NULL AS rs_ipid,
183         NULL AS rs_pid,
184         NULL AS rs_name
185     FROM frame_slice AS fs
186              LEFT JOIN process AS pro ON pro.id = fs.ipid
187              LEFT JOIN trace_range TRs
188     WHERE fs.dst IS NULL
189       AND pro.name NOT LIKE '%render_service%'
190       AND fs.type = 0
191       AND fs.flag <> 2
192     ORDER BY ts;`
193  );
194export const querySelectRangeData = (
195  allPid: Array<number>,
196  leftNs: number,
197  rightNs: number
198): //@ts-ignore
199Promise<Array<unknown>> =>
200  query(
201    'querySelectRangeData',
202    `
203    SELECT 
204               a.id,
205               (a.ts - TR.start_ts) AS startTs,
206               a.vsync AS name,
207               a.type,
208               a.dur,
209               a.src AS src_slice,
210               a.flag AS jank_tag,
211               a.dst AS dst_slice,
212               p.pid,
213               p.name AS cmdline,
214               (case when p.name like '%render_service' then 'render_service' else 'app' end) as frameType
215        FROM frame_slice AS a, trace_range AS TR
216                 LEFT JOIN process AS p ON a.ipid = p.ipid
217        WHERE a.type = 0
218          AND a.flag <> 2
219          AND startTs + dur >= ${leftNs}
220          AND startTs <= ${rightNs}
221          AND p.pid IN (${allPid.join(',')});`
222  );
223