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 { PerfCmdLine, PerfFile, PerfSample, PerfStack, PerfThread } from '../../bean/PerfProfile';
16fb726d48Sopenharmony_ciimport { query } from '../SqlLite';
17fb726d48Sopenharmony_ciimport { HiSysEventStruct } from '../ui-worker/ProcedureWorkerHiSysEvent';
18fb726d48Sopenharmony_ciimport { TaskTabStruct } from '../../component/trace/sheet/task/TabPaneTaskFrames';
19fb726d48Sopenharmony_ciimport { GpuCountBean, SearchGpuFuncBean } from '../../bean/GpufreqBean';
20fb726d48Sopenharmony_ci
21fb726d48Sopenharmony_ciexport const queryPerfFiles = (): Promise<Array<PerfFile>> =>
22fb726d48Sopenharmony_ci  query('queryPerfFiles', `select file_id as fileId,symbol,path from perf_files`, {});
23fb726d48Sopenharmony_ci
24fb726d48Sopenharmony_ciexport const queryPerfCallChainName = (): //@ts-ignore
25fb726d48Sopenharmony_ciPromise<Array<unknown>> => query('queryPerfCallChainName', `select callchain_id,depth,name from perf_callchain`, {});
26fb726d48Sopenharmony_ci
27fb726d48Sopenharmony_ciexport const queryPerfProcess = (): Promise<Array<PerfThread>> =>
28fb726d48Sopenharmony_ci  query(
29fb726d48Sopenharmony_ci    'queryPerfThread',
30fb726d48Sopenharmony_ci    `select process_id as pid,thread_name as processName from perf_thread where process_id = thread_id`,
31fb726d48Sopenharmony_ci    {}
32fb726d48Sopenharmony_ci  );
33fb726d48Sopenharmony_ci
34fb726d48Sopenharmony_ciexport const queryPerfThread = (): Promise<Array<PerfThread>> =>
35fb726d48Sopenharmony_ci  query(
36fb726d48Sopenharmony_ci    'queryPerfThread',
37fb726d48Sopenharmony_ci    `select a.thread_id as tid,
38fb726d48Sopenharmony_ci       a.thread_name as threadName,
39fb726d48Sopenharmony_ci       a.process_id as pid,
40fb726d48Sopenharmony_ci       b.thread_name as processName
41fb726d48Sopenharmony_cifrom perf_thread a
42fb726d48Sopenharmony_ci         left join (select distinct process_id, thread_name from perf_thread where process_id = thread_id) b 
43fb726d48Sopenharmony_ci         on a.process_id = b.process_id
44fb726d48Sopenharmony_ciorder by pid;`,
45fb726d48Sopenharmony_ci    {}
46fb726d48Sopenharmony_ci  );
47fb726d48Sopenharmony_ciexport const queryPerfSampleListByTimeRange = (
48fb726d48Sopenharmony_ci  leftNs: number,
49fb726d48Sopenharmony_ci  rightNs: number,
50fb726d48Sopenharmony_ci  cpus: Array<number>,
51fb726d48Sopenharmony_ci  processes: Array<number>,
52fb726d48Sopenharmony_ci  threads: Array<number>,
53fb726d48Sopenharmony_ci  eventTypeId?: number
54fb726d48Sopenharmony_ci): Promise<Array<PerfSample>> => {
55fb726d48Sopenharmony_ci  let sql = `
56fb726d48Sopenharmony_ciselect A.callchain_id as sampleId,
57fb726d48Sopenharmony_ci       A.thread_id as tid,
58fb726d48Sopenharmony_ci       C.thread_name as threadName,
59fb726d48Sopenharmony_ci       A.thread_state as state,
60fb726d48Sopenharmony_ci       C.process_id as pid,
61fb726d48Sopenharmony_ci       (timestamp_trace - R.start_ts) as time,
62fb726d48Sopenharmony_ci       cpu_id as core
63fb726d48Sopenharmony_cifrom perf_sample A,trace_range R
64fb726d48Sopenharmony_cileft join perf_thread C on A.thread_id = C.thread_id
65fb726d48Sopenharmony_ciwhere time >= $leftNs and time <= $rightNs and A.thread_id != 0
66fb726d48Sopenharmony_ci    `;
67fb726d48Sopenharmony_ci  if (eventTypeId !== undefined) {
68fb726d48Sopenharmony_ci    sql = `${sql} and event_type_id = ${eventTypeId}`;
69fb726d48Sopenharmony_ci  }
70fb726d48Sopenharmony_ci  if (cpus.length !== 0 || processes.length !== 0 || threads.length !== 0) {
71fb726d48Sopenharmony_ci    let arg1 = cpus.length > 0 ? `or core in (${cpus.join(',')}) ` : '';
72fb726d48Sopenharmony_ci    let arg2 = processes.length > 0 ? `or pid in (${processes.join(',')}) ` : '';
73fb726d48Sopenharmony_ci    let arg3 = threads.length > 0 ? `or tid in (${threads.join(',')})` : '';
74fb726d48Sopenharmony_ci    let arg = `${arg1}${arg2}${arg3}`.substring(3);
75fb726d48Sopenharmony_ci    sql = `${sql} and (${arg})`;
76fb726d48Sopenharmony_ci  }
77fb726d48Sopenharmony_ci  return query('queryPerfSampleListByTimeRange', sql, {
78fb726d48Sopenharmony_ci    $leftNs: leftNs,
79fb726d48Sopenharmony_ci    $rightNs: rightNs,
80fb726d48Sopenharmony_ci  });
81fb726d48Sopenharmony_ci};
82fb726d48Sopenharmony_ci
83fb726d48Sopenharmony_ciexport const queryPerfSampleIdsByTimeRange = (
84fb726d48Sopenharmony_ci  leftNs: number,
85fb726d48Sopenharmony_ci  rightNs: number,
86fb726d48Sopenharmony_ci  cpus: Array<number>,
87fb726d48Sopenharmony_ci  processes: Array<number>,
88fb726d48Sopenharmony_ci  threads: Array<number>
89fb726d48Sopenharmony_ci): Promise<Array<PerfSample>> => {
90fb726d48Sopenharmony_ci  let sql = `
91fb726d48Sopenharmony_ciselect A.callchain_id as sampleId 
92fb726d48Sopenharmony_cifrom perf_sample A,trace_range R
93fb726d48Sopenharmony_cileft join perf_thread C on A.thread_id = C.thread_id
94fb726d48Sopenharmony_ciwhere (timestamp_trace - R.start_ts) >= $leftNs and (timestamp_trace - R.start_ts) <= $rightNs and A.thread_id != 0 
95fb726d48Sopenharmony_ci    `;
96fb726d48Sopenharmony_ci  if (cpus.length !== 0 || processes.length !== 0 || threads.length !== 0) {
97fb726d48Sopenharmony_ci    let arg1 = cpus.length > 0 ? `or A.cpu_id in (${cpus.join(',')}) ` : '';
98fb726d48Sopenharmony_ci    let arg2 = processes.length > 0 ? `or C.process_id in (${processes.join(',')}) ` : '';
99fb726d48Sopenharmony_ci    let arg3 = threads.length > 0 ? `or A.thread_id in (${threads.join(',')})` : '';
100fb726d48Sopenharmony_ci    let arg = `${arg1}${arg2}${arg3}`.substring(3);
101fb726d48Sopenharmony_ci    sql = `${sql} and (${arg})`;
102fb726d48Sopenharmony_ci  }
103fb726d48Sopenharmony_ci  return query('queryPerfSampleIdsByTimeRange', sql, {
104fb726d48Sopenharmony_ci    $leftNs: leftNs,
105fb726d48Sopenharmony_ci    $rightNs: rightNs,
106fb726d48Sopenharmony_ci  });
107fb726d48Sopenharmony_ci};
108fb726d48Sopenharmony_ci
109fb726d48Sopenharmony_ciexport const queryPerfSampleCallChain = (sampleId: number): Promise<Array<PerfStack>> =>
110fb726d48Sopenharmony_ci  query(
111fb726d48Sopenharmony_ci    'queryPerfSampleCallChain',
112fb726d48Sopenharmony_ci    `
113fb726d48Sopenharmony_ci    select
114fb726d48Sopenharmony_ci    callchain_id as callChainId,
115fb726d48Sopenharmony_ci    callchain_id as sampleId,
116fb726d48Sopenharmony_ci    file_id as fileId,
117fb726d48Sopenharmony_ci    symbol_id as symbolId,
118fb726d48Sopenharmony_ci    vaddr_in_file as vaddrInFile,
119fb726d48Sopenharmony_ci    name as symbol
120fb726d48Sopenharmony_cifrom perf_callchain where callchain_id = $sampleId;
121fb726d48Sopenharmony_ci    `,
122fb726d48Sopenharmony_ci    { $sampleId: sampleId }
123fb726d48Sopenharmony_ci  );
124fb726d48Sopenharmony_ci
125fb726d48Sopenharmony_ciexport const queryPerfCmdline = (): Promise<Array<PerfCmdLine>> =>
126fb726d48Sopenharmony_ci  query(
127fb726d48Sopenharmony_ci    'queryPerfCmdline',
128fb726d48Sopenharmony_ci    `
129fb726d48Sopenharmony_ci    select report_value from perf_report  where report_type = 'cmdline'
130fb726d48Sopenharmony_ci    `,
131fb726d48Sopenharmony_ci    {}
132fb726d48Sopenharmony_ci  );
133fb726d48Sopenharmony_ciexport const queryPerfEventType = (): Promise<Array<{ id: number; report: string }>> =>
134fb726d48Sopenharmony_ci  query(
135fb726d48Sopenharmony_ci    'queryPerfEventType',
136fb726d48Sopenharmony_ci    `
137fb726d48Sopenharmony_ci    select id,report_value as report from perf_report where id in (
138fb726d48Sopenharmony_ciselect distinct event_type_id from perf_sample);
139fb726d48Sopenharmony_ci    `,
140fb726d48Sopenharmony_ci    {}
141fb726d48Sopenharmony_ci  );
142fb726d48Sopenharmony_ci/**
143fb726d48Sopenharmony_ci * HiPerf
144fb726d48Sopenharmony_ci */
145fb726d48Sopenharmony_ciexport const queryHiPerfEventList = (): //@ts-ignore
146fb726d48Sopenharmony_ciPromise<Array<unknown>> =>
147fb726d48Sopenharmony_ci  query('queryHiPerfEventList', `select id,report_value from perf_report where report_type='config_name'`, {});
148fb726d48Sopenharmony_ciexport const queryHiPerfEventListData = (
149fb726d48Sopenharmony_ci  eventTypeId: number
150fb726d48Sopenharmony_ci): //@ts-ignore
151fb726d48Sopenharmony_ciPromise<Array<unknown>> =>
152fb726d48Sopenharmony_ci  query(
153fb726d48Sopenharmony_ci    'queryHiPerfEventListData',
154fb726d48Sopenharmony_ci    `
155fb726d48Sopenharmony_ci        select s.callchain_id,
156fb726d48Sopenharmony_ci               (s.timestamp_trace-t.start_ts) startNS 
157fb726d48Sopenharmony_ci        from perf_sample s,trace_range t 
158fb726d48Sopenharmony_ci        where 
159fb726d48Sopenharmony_ci            event_type_id=${eventTypeId} 
160fb726d48Sopenharmony_ci            and s.thread_id != 0
161fb726d48Sopenharmony_ci            and s.callchain_id != -1;
162fb726d48Sopenharmony_ci`,
163fb726d48Sopenharmony_ci    { $eventTypeId: eventTypeId }
164fb726d48Sopenharmony_ci  );
165fb726d48Sopenharmony_ciexport const queryHiPerfEventData = (
166fb726d48Sopenharmony_ci  eventTypeId: number,
167fb726d48Sopenharmony_ci  cpu: number
168fb726d48Sopenharmony_ci): //@ts-ignore
169fb726d48Sopenharmony_ciPromise<Array<unknown>> =>
170fb726d48Sopenharmony_ci  query(
171fb726d48Sopenharmony_ci    'queryHiPerfEventList',
172fb726d48Sopenharmony_ci    `
173fb726d48Sopenharmony_ci    select s.callchain_id,
174fb726d48Sopenharmony_ci        (s.timestamp_trace-t.start_ts) startNS 
175fb726d48Sopenharmony_ci    from perf_sample s,trace_range t 
176fb726d48Sopenharmony_ci    where
177fb726d48Sopenharmony_ci        event_type_id=${eventTypeId} 
178fb726d48Sopenharmony_ci        and cpu_id=${cpu} 
179fb726d48Sopenharmony_ci        and s.thread_id != 0
180fb726d48Sopenharmony_ci        and s.callchain_id != -1;
181fb726d48Sopenharmony_ci`,
182fb726d48Sopenharmony_ci    { $eventTypeId: eventTypeId, $cpu: cpu }
183fb726d48Sopenharmony_ci  );
184fb726d48Sopenharmony_ciexport const queryHiPerfCpuData = (
185fb726d48Sopenharmony_ci  cpu: number
186fb726d48Sopenharmony_ci): //@ts-ignore
187fb726d48Sopenharmony_ciPromise<Array<unknown>> =>
188fb726d48Sopenharmony_ci  query(
189fb726d48Sopenharmony_ci    'queryHiPerfCpuData',
190fb726d48Sopenharmony_ci    `
191fb726d48Sopenharmony_ci    select s.callchain_id,
192fb726d48Sopenharmony_ci        (s.timestamp_trace-t.start_ts) startNS, event_count, event_type_id 
193fb726d48Sopenharmony_ci    from perf_sample s,trace_range t 
194fb726d48Sopenharmony_ci    where 
195fb726d48Sopenharmony_ci        cpu_id=${cpu} 
196fb726d48Sopenharmony_ci        and s.thread_id != 0;`,
197fb726d48Sopenharmony_ci    { $cpu: cpu }
198fb726d48Sopenharmony_ci  );
199fb726d48Sopenharmony_ciexport const queryHiPerfCpuMergeData = (): //@ts-ignore
200fb726d48Sopenharmony_ciPromise<Array<unknown>> =>
201fb726d48Sopenharmony_ci  query(
202fb726d48Sopenharmony_ci    'queryHiPerfCpuData',
203fb726d48Sopenharmony_ci    `select s.callchain_id,(s.timestamp_trace-t.start_ts) startNS, event_count, event_type_id from perf_sample s,trace_range t 
204fb726d48Sopenharmony_ciwhere s.thread_id != 0;`,
205fb726d48Sopenharmony_ci    {}
206fb726d48Sopenharmony_ci  );
207fb726d48Sopenharmony_ciexport const queryHiPerfCpuMergeData2 = (): //@ts-ignore
208fb726d48Sopenharmony_ciPromise<Array<unknown>> =>
209fb726d48Sopenharmony_ci  query(
210fb726d48Sopenharmony_ci    'queryHiPerfCpuData2',
211fb726d48Sopenharmony_ci    `select distinct cpu_id from perf_sample where thread_id != 0 order by cpu_id desc;`,
212fb726d48Sopenharmony_ci    {}
213fb726d48Sopenharmony_ci  );
214fb726d48Sopenharmony_ci
215fb726d48Sopenharmony_ciexport const queryHiPerfProcessData = (
216fb726d48Sopenharmony_ci  pid: number
217fb726d48Sopenharmony_ci): //@ts-ignore
218fb726d48Sopenharmony_ciPromise<Array<unknown>> =>
219fb726d48Sopenharmony_ci  query(
220fb726d48Sopenharmony_ci    'queryHiPerfProcessData',
221fb726d48Sopenharmony_ci    `
222fb726d48Sopenharmony_ciSELECT sp.callchain_id,
223fb726d48Sopenharmony_ci       th.thread_name,
224fb726d48Sopenharmony_ci       th.thread_id                     tid,
225fb726d48Sopenharmony_ci       th.process_id                    pid,
226fb726d48Sopenharmony_ci       sp.timestamp_trace - tr.start_ts startNS,
227fb726d48Sopenharmony_ci       event_count,
228fb726d48Sopenharmony_ci       event_type_id
229fb726d48Sopenharmony_cifrom perf_sample sp,
230fb726d48Sopenharmony_ci     trace_range tr
231fb726d48Sopenharmony_ci         left join perf_thread th on th.thread_id = sp.thread_id
232fb726d48Sopenharmony_ciwhere pid = ${pid} and sp.thread_id != 0 `,
233fb726d48Sopenharmony_ci    { $pid: pid }
234fb726d48Sopenharmony_ci  );
235fb726d48Sopenharmony_ci
236fb726d48Sopenharmony_ciexport const queryHiPerfThreadData = (
237fb726d48Sopenharmony_ci  tid: number
238fb726d48Sopenharmony_ci): //@ts-ignore
239fb726d48Sopenharmony_ciPromise<Array<unknown>> =>
240fb726d48Sopenharmony_ci  query(
241fb726d48Sopenharmony_ci    'queryHiPerfThreadData',
242fb726d48Sopenharmony_ci    `
243fb726d48Sopenharmony_ciSELECT sp.callchain_id,
244fb726d48Sopenharmony_ci       th.thread_name,
245fb726d48Sopenharmony_ci       th.thread_id                     tid,
246fb726d48Sopenharmony_ci       th.process_id                    pid,
247fb726d48Sopenharmony_ci       sp.timestamp_trace - tr.start_ts startNS, 
248fb726d48Sopenharmony_ci       event_count,
249fb726d48Sopenharmony_ci       event_type_id
250fb726d48Sopenharmony_cifrom perf_sample sp,
251fb726d48Sopenharmony_ci     trace_range tr
252fb726d48Sopenharmony_ci         left join perf_thread th on th.thread_id = sp.thread_id
253fb726d48Sopenharmony_ciwhere tid = ${tid} and sp.thread_id != 0 ;`,
254fb726d48Sopenharmony_ci    { $tid: tid }
255fb726d48Sopenharmony_ci  );
256fb726d48Sopenharmony_ci
257fb726d48Sopenharmony_ciexport const getGpufreqDataCut = (
258fb726d48Sopenharmony_ci  tIds: string,
259fb726d48Sopenharmony_ci  funcName: string,
260fb726d48Sopenharmony_ci  leftNS: number,
261fb726d48Sopenharmony_ci  rightNS: number,
262fb726d48Sopenharmony_ci  single: boolean,
263fb726d48Sopenharmony_ci  loop: boolean
264fb726d48Sopenharmony_ci): Promise<Array<SearchGpuFuncBean>> => {
265fb726d48Sopenharmony_ci  let queryCondition: string = '';
266fb726d48Sopenharmony_ci  if (single) {
267fb726d48Sopenharmony_ci    queryCondition += `select s.funName,s.startTime,s.dur,s.startTime+s.dur as endTime,s.tid,s.threadName,s.pid from state s 
268fb726d48Sopenharmony_ci            where endTime between ${leftNS} and ${rightNS}`;
269fb726d48Sopenharmony_ci  }
270fb726d48Sopenharmony_ci  if (loop) {
271fb726d48Sopenharmony_ci    queryCondition += `select s.funName,s.startTime,s.loopEndTime-s.startTime as dur,s.loopEndTime as endTime,s.tid,s.threadName,s.pid from state s 
272fb726d48Sopenharmony_ci            where endTime between ${leftNS} and ${rightNS} `;
273fb726d48Sopenharmony_ci  }
274fb726d48Sopenharmony_ci  return query(
275fb726d48Sopenharmony_ci    'getGpufreqDataCut',
276fb726d48Sopenharmony_ci    `
277fb726d48Sopenharmony_ci            with state as
278fb726d48Sopenharmony_ci              (select 
279fb726d48Sopenharmony_ci                 * 
280fb726d48Sopenharmony_ci              from
281fb726d48Sopenharmony_ci                 (select
282fb726d48Sopenharmony_ci                    c.name as funName,
283fb726d48Sopenharmony_ci                    c.ts - r.start_ts as startTime,
284fb726d48Sopenharmony_ci                    c.dur,
285fb726d48Sopenharmony_ci                    lead(c.ts - r.start_ts, 1, null) over( order by c.ts - r.start_ts) loopEndTime,
286fb726d48Sopenharmony_ci                    t.tid,
287fb726d48Sopenharmony_ci                    t.name as threadName,
288fb726d48Sopenharmony_ci                    p.pid
289fb726d48Sopenharmony_ci                 from 
290fb726d48Sopenharmony_ci                    callstack c 
291fb726d48Sopenharmony_ci                 left join 
292fb726d48Sopenharmony_ci                    thread t on c.callid = t.id 
293fb726d48Sopenharmony_ci                 left join 
294fb726d48Sopenharmony_ci                    process p on t.ipid = p.id
295fb726d48Sopenharmony_ci                 left join 
296fb726d48Sopenharmony_ci                    trace_range r
297fb726d48Sopenharmony_ci                 where 
298fb726d48Sopenharmony_ci                    c.name like '${funcName}%'
299fb726d48Sopenharmony_ci                 and 
300fb726d48Sopenharmony_ci                    tid = '${tIds}' 
301fb726d48Sopenharmony_ci                 and 
302fb726d48Sopenharmony_ci                    startTime between ${leftNS} and ${rightNS}))
303fb726d48Sopenharmony_ci             ${queryCondition}  
304fb726d48Sopenharmony_ci          `,
305fb726d48Sopenharmony_ci    { $search: funcName }
306fb726d48Sopenharmony_ci  );
307fb726d48Sopenharmony_ci};
308fb726d48Sopenharmony_ciexport const getGpufreqData = (leftNS: number, rightNS: number, earliest: boolean): Promise<Array<GpuCountBean>> => {
309fb726d48Sopenharmony_ci  let queryCondition: string = '';
310fb726d48Sopenharmony_ci  if (!earliest) {
311fb726d48Sopenharmony_ci    queryCondition += ` where  not  ((s.ts - r.start_ts + ifnull(s.dur,0) < ${leftNS}) or (s.ts - r.start_ts > ${rightNS}))`;
312fb726d48Sopenharmony_ci  }
313fb726d48Sopenharmony_ci  return query(
314fb726d48Sopenharmony_ci    'getGpufreqData',
315fb726d48Sopenharmony_ci    `
316fb726d48Sopenharmony_ci            with state as 
317fb726d48Sopenharmony_ci              (select 
318fb726d48Sopenharmony_ci                 name,
319fb726d48Sopenharmony_ci                 filter_id, 
320fb726d48Sopenharmony_ci                 ts, 
321fb726d48Sopenharmony_ci                 endts, 
322fb726d48Sopenharmony_ci                 endts-ts as dur, 
323fb726d48Sopenharmony_ci                 value as val
324fb726d48Sopenharmony_ci               from
325fb726d48Sopenharmony_ci                  (select 
326fb726d48Sopenharmony_ci                     measure.filter_id,
327fb726d48Sopenharmony_ci                     clock_event_filter.name, 
328fb726d48Sopenharmony_ci                     measure.ts, 
329fb726d48Sopenharmony_ci                     lead(ts, 1, null) over( order by measure.ts) endts, 
330fb726d48Sopenharmony_ci                     measure.value 
331fb726d48Sopenharmony_ci                  from 
332fb726d48Sopenharmony_ci                     clock_event_filter,
333fb726d48Sopenharmony_ci                     trace_range
334fb726d48Sopenharmony_ci                  left join 
335fb726d48Sopenharmony_ci                     measure
336fb726d48Sopenharmony_ci                  where 
337fb726d48Sopenharmony_ci                     clock_event_filter.name = 'gpufreq' 
338fb726d48Sopenharmony_ci                  and 
339fb726d48Sopenharmony_ci                     clock_event_filter.type = 'clock_set_rate' 
340fb726d48Sopenharmony_ci                  and
341fb726d48Sopenharmony_ci                     clock_event_filter.id = measure.filter_id
342fb726d48Sopenharmony_ci                  order by measure.ts)
343fb726d48Sopenharmony_ci               where 
344fb726d48Sopenharmony_ci                  endts is not null
345fb726d48Sopenharmony_ci               )
346fb726d48Sopenharmony_ci            select 
347fb726d48Sopenharmony_ci                s.name as thread,
348fb726d48Sopenharmony_ci                s.val/1000000 as freq,
349fb726d48Sopenharmony_ci                s.val*s.dur as value,
350fb726d48Sopenharmony_ci                s.val,
351fb726d48Sopenharmony_ci                s.ts-r.start_ts as startNS,
352fb726d48Sopenharmony_ci                s.dur,
353fb726d48Sopenharmony_ci                s.endts- r.start_ts as endTime
354fb726d48Sopenharmony_ci            from 
355fb726d48Sopenharmony_ci                state s,
356fb726d48Sopenharmony_ci                trace_range r 
357fb726d48Sopenharmony_ci            ${queryCondition} 
358fb726d48Sopenharmony_ci            order by ts
359fb726d48Sopenharmony_ci          `,
360fb726d48Sopenharmony_ci    { $leftNS: leftNS, $rightNS: rightNS }
361fb726d48Sopenharmony_ci  );
362fb726d48Sopenharmony_ci};
363fb726d48Sopenharmony_ci
364fb726d48Sopenharmony_ciexport const queryHiSysEventTabData = (leftNs: number, rightNs: number): Promise<Array<HiSysEventStruct>> =>
365fb726d48Sopenharmony_ci  query(
366fb726d48Sopenharmony_ci    'queryHiSysEventTabData',
367fb726d48Sopenharmony_ci    `SELECT S.id,
368fb726d48Sopenharmony_ci            D2.data AS domain, 
369fb726d48Sopenharmony_ci            D.data AS eventName, 
370fb726d48Sopenharmony_ci            type AS eventType, 
371fb726d48Sopenharmony_ci            time_zone AS tz, 
372fb726d48Sopenharmony_ci            pid,
373fb726d48Sopenharmony_ci            tid,
374fb726d48Sopenharmony_ci            uid,
375fb726d48Sopenharmony_ci            info,
376fb726d48Sopenharmony_ci            level,
377fb726d48Sopenharmony_ci            seq,
378fb726d48Sopenharmony_ci            contents,
379fb726d48Sopenharmony_ci            S.ts - TR.start_ts AS startTs,
380fb726d48Sopenharmony_ci            1 AS dur,
381fb726d48Sopenharmony_ci            CASE
382fb726d48Sopenharmony_ci            WHEN level = 'MINOR' THEN
383fb726d48Sopenharmony_ci             0
384fb726d48Sopenharmony_ci            WHEN level = 'CRITICAL' THEN
385fb726d48Sopenharmony_ci             1
386fb726d48Sopenharmony_ci            END AS depth
387fb726d48Sopenharmony_ci        FROM hisys_all_event AS S ,trace_range AS TR
388fb726d48Sopenharmony_ci        LEFT JOIN data_dict AS D on S.event_name_id = D.id
389fb726d48Sopenharmony_ci        LEFT JOIN data_dict AS D2 on S.domain_id = D2.id
390fb726d48Sopenharmony_ci        WHERE S.id is not null
391fb726d48Sopenharmony_ci         and    startTs >= ${Math.floor(leftNs)}
392fb726d48Sopenharmony_ci         and    startTs <= ${Math.floor(rightNs)}
393fb726d48Sopenharmony_ci        ORDER BY S.ts`
394fb726d48Sopenharmony_ci  );
395fb726d48Sopenharmony_ciexport const queryHiSysEventData = (): Promise<Array<HiSysEventStruct>> =>
396fb726d48Sopenharmony_ci  query(
397fb726d48Sopenharmony_ci    'queryHiSysEventData',
398fb726d48Sopenharmony_ci    `SELECT l.ts - tr.start_ts as startNs  FROM hisys_all_event AS l, trace_range tr WHERE startNs  > 0 LIMIT 1`
399fb726d48Sopenharmony_ci  );
400fb726d48Sopenharmony_ciexport const queryHiPerfProcessCount = (
401fb726d48Sopenharmony_ci  leftNs: number,
402fb726d48Sopenharmony_ci  rightNs: number,
403fb726d48Sopenharmony_ci  cpus: Array<number>,
404fb726d48Sopenharmony_ci  threads: Array<number>,
405fb726d48Sopenharmony_ci  processes: Array<number>
406fb726d48Sopenharmony_ci): //@ts-ignore
407fb726d48Sopenharmony_ciPromise<Array<unknown>> => {
408fb726d48Sopenharmony_ci  let str = '';
409fb726d48Sopenharmony_ci  if (processes.length > 0) {
410fb726d48Sopenharmony_ci    str = ` and C.process_id in (${processes.join(',')})`;
411fb726d48Sopenharmony_ci  }
412fb726d48Sopenharmony_ci  if (threads.length > 0) {
413fb726d48Sopenharmony_ci    str = ` and A.thread_id in (${threads.join(',')}) `;
414fb726d48Sopenharmony_ci  }
415fb726d48Sopenharmony_ci  if (processes.length > 0 && threads.length > 0) {
416fb726d48Sopenharmony_ci    str = ` and (C.process_id in (${processes.join(',')}) or A.thread_id in (${threads.join(',')}))`;
417fb726d48Sopenharmony_ci  }
418fb726d48Sopenharmony_ci  if (cpus.length > 0) {
419fb726d48Sopenharmony_ci    str = ` and A.cpu_id in (${cpus.join(',')})`;
420fb726d48Sopenharmony_ci  }
421fb726d48Sopenharmony_ci  if (cpus.length > 0 && processes.length > 0) {
422fb726d48Sopenharmony_ci    str = ` and (C.process_id in (${processes.join(',')}) or A.cpu_id in (${cpus.join(',')}))`;
423fb726d48Sopenharmony_ci  }
424fb726d48Sopenharmony_ci  return query(
425fb726d48Sopenharmony_ci    'queryHiPerfProcessCount',
426fb726d48Sopenharmony_ci    `
427fb726d48Sopenharmony_ci    select     C.process_id as pid,
428fb726d48Sopenharmony_ci               (A.timestamp_trace - R.start_ts) as time,
429fb726d48Sopenharmony_ci               C.thread_name as threadName,
430fb726d48Sopenharmony_ci               A.thread_id as tid,
431fb726d48Sopenharmony_ci               A.id,
432fb726d48Sopenharmony_ci               A.callchain_id
433fb726d48Sopenharmony_ci        from perf_sample A,trace_range R
434fb726d48Sopenharmony_ci             left join perf_thread C on A.thread_id = C.thread_id  and  A.thread_id != 0
435fb726d48Sopenharmony_ci        where time >= $leftNs and time <= $rightNs and A.callchain_id > 0
436fb726d48Sopenharmony_ci        ${str} 
437fb726d48Sopenharmony_ci    `,
438fb726d48Sopenharmony_ci    { $leftNs: leftNs, $rightNs: rightNs }
439fb726d48Sopenharmony_ci  );
440fb726d48Sopenharmony_ci};
441fb726d48Sopenharmony_ciexport const queryTransferList = (): Promise<Array<{ id: number; cmdStr: string }>> =>
442fb726d48Sopenharmony_ci  query('queryTransferList', `select id, report_value as cmdStr from perf_report where report_type = 'config_name'`);
443fb726d48Sopenharmony_ciexport const queryConcurrencyTask = (
444fb726d48Sopenharmony_ci  itid: number,
445fb726d48Sopenharmony_ci  selectStartTime: number,
446fb726d48Sopenharmony_ci  selectEndTime: number
447fb726d48Sopenharmony_ci): Promise<TaskTabStruct[]> =>
448fb726d48Sopenharmony_ci  query<TaskTabStruct>(
449fb726d48Sopenharmony_ci    'queryConcurrencyTask',
450fb726d48Sopenharmony_ci    `SELECT thread.tid,
451fb726d48Sopenharmony_ci            thread.ipid,
452fb726d48Sopenharmony_ci            callstack.name                AS funName,
453fb726d48Sopenharmony_ci            callstack.ts                  AS startTs,
454fb726d48Sopenharmony_ci            (case when callstack.dur = -1 then (SELECT end_ts FROM trace_range) else callstack.dur end) as dur,
455fb726d48Sopenharmony_ci            callstack.id,
456fb726d48Sopenharmony_ci            task_pool.priority,
457fb726d48Sopenharmony_ci            task_pool.allocation_task_row AS allocationTaskRow,
458fb726d48Sopenharmony_ci            task_pool.execute_task_row    AS executeTaskRow,
459fb726d48Sopenharmony_ci            task_pool.return_task_row     AS returnTaskRow,
460fb726d48Sopenharmony_ci            task_pool.task_id             AS executeId
461fb726d48Sopenharmony_ci     FROM thread
462fb726d48Sopenharmony_ci            LEFT JOIN callstack ON thread.id = callstack.callid
463fb726d48Sopenharmony_ci            LEFT JOIN task_pool ON callstack.id = task_pool.execute_task_row
464fb726d48Sopenharmony_ci     WHERE ipid in (SELECT thread.ipid
465fb726d48Sopenharmony_ci                   FROM thread
466fb726d48Sopenharmony_ci                   WHERE thread.itid = $itid)
467fb726d48Sopenharmony_ci       AND thread.name LIKE '%TaskWork%'
468fb726d48Sopenharmony_ci       AND callstack.name LIKE 'H:Task Perform:%'
469fb726d48Sopenharmony_ci       AND -- 左包含
470fb726d48Sopenharmony_ci           (($selectStartTime <= callstack.ts AND $selectEndTime > callstack.ts)
471fb726d48Sopenharmony_ci        OR -- 右包含
472fb726d48Sopenharmony_ci       ($selectStartTime < callstack.ts + callstack.dur AND $selectEndTime >= callstack.ts + callstack.dur)
473fb726d48Sopenharmony_ci        OR -- 包含
474fb726d48Sopenharmony_ci       ($selectStartTime >= callstack.ts AND $selectEndTime <= callstack.ts +
475fb726d48Sopenharmony_ci        (case when callstack.dur = -1 then (SELECT end_ts FROM trace_range) else callstack.dur end))
476fb726d48Sopenharmony_ci        OR -- 被包含
477fb726d48Sopenharmony_ci       ($selectStartTime <= callstack.ts AND $selectEndTime >= callstack.ts + callstack.dur))
478fb726d48Sopenharmony_ci     ORDER BY callstack.ts;`,
479fb726d48Sopenharmony_ci    { $itid: itid, $selectStartTime: selectStartTime, $selectEndTime: selectEndTime }
480fb726d48Sopenharmony_ci  );
481