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