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 { FpsStruct } from '../ui-worker/ProcedureWorkerFPS';
16import { Counter, Fps } from '../../bean/BoxSelection';
17import { NativeEvent, NativeEventHeap } from '../../bean/NativeHook';
18import { HeapTreeDataBean } from '../logic-worker/ProcedureLogicWorkerCommon';
19import { EnergyAnomalyStruct } from '../ui-worker/ProcedureWorkerEnergyAnomaly';
20import { SystemDetailsEnergy } from '../../bean/EnergyStruct';
21import { EnergyStateStruct } from '../ui-worker/ProcedureWorkerEnergyState';
22import { FileInfo } from '../../../js-heap/model/UiStruct';
23import { HeapEdge, HeapLocation, HeapNode, HeapSample } from '../../../js-heap/model/DatabaseStruct';
24import { TaskTabStruct } from '../../component/trace/sheet/task/TabPaneTaskFrames';
25import type { FrameAnimationStruct } from '../ui-worker/ProcedureWorkerFrameAnimation';
26import type { FrameDynamicStruct } from '../ui-worker/ProcedureWorkerFrameDynamic';
27import type { FrameSpacingStruct } from '../ui-worker/ProcedureWorkerFrameSpacing';
28import type { DeviceStruct } from '../../bean/FrameComponentBean';
29import { LogStruct } from '../ui-worker/ProcedureWorkerLog';
30import { query } from '../SqlLite';
31import { Utils } from '../../component/trace/base/Utils';
32
33export const queryEventCountMap = (
34  traceId?: string
35): Promise<
36  Array<{
37    eventName: string;
38    count: number;
39  }>
40> =>
41  query(
42    'queryEventCountMap',
43    `select 
44  event_name as eventName,
45  count 
46  from stat where stat_type = 'received';`,
47    {},
48    { traceId: traceId }
49  );
50
51export const queryTotalTime = (
52  traceId?: string
53): Promise<Array<{ total: number; recordStartNS: number; recordEndNS: number }>> =>
54  query(
55    'queryTotalTime',
56    `select start_ts as recordStartNS,end_ts as recordEndNS,end_ts-start_ts as total
57    from
58      trace_range;`,
59    {},
60    { traceId: traceId }
61  );
62export const getFps = (): Promise<FpsStruct[]> =>
63  query<FpsStruct>(
64    'getFps',
65    `
66    select
67      distinct(ts-tb.start_ts) as startNS, fps
68    from
69      hidump c ,trace_range tb
70    where
71      startNS >= 0
72    --order by startNS;
73    `,
74    {}
75  );
76
77export const getTabFps = (leftNs: number, rightNs: number): Promise<Array<Fps>> =>
78  query<Fps>(
79    'getTabFps',
80    `
81    select
82      distinct(ts-tb.start_ts) as startNS,
83      fps
84    from
85      hidump c,
86      trace_range tb
87    where
88      startNS <= $rightNS
89    and
90      startNS >= 0
91    --order by startNS;
92    `,
93    { $leftNS: leftNs, $rightNS: rightNs }
94  );
95
96export const getTabVirtualCounters = (virtualFilterIds: Array<number>, startTime: number): Promise<Counter[]> =>
97  query<Counter>(
98    'getTabVirtualCounters',
99    `
100    select
101      table1.filter_id as trackId,
102      table2.name,
103      value,
104      table1.ts - table3.start_ts as startTime
105    from
106      sys_mem_measure table1
107    left join
108      sys_event_filter table2
109    on
110      table1.filter_id = table2.id
111    left join
112      trace_range table3
113    where
114      filter_id in (${virtualFilterIds.join(',')})
115    and
116      startTime <= $startTime
117    `,
118    { $startTime: startTime }
119  );
120
121export const queryAllSoInitNames = (): //@ts-ignore
122Promise<Array<unknown>> => {
123  return query(
124    'queryAllSoInitNames',
125    `
126        select id,so_name as name from static_initalize;`
127  );
128};
129
130export const queryAllSrcSlices = (): //@ts-ignore
131Promise<Array<unknown>> => {
132  return query(
133    'queryAllSrcSlices',
134    `
135        select src,id from frame_slice;`
136  );
137};
138
139/*-------------------------------------------------------------------------------------*/
140export const queryHeapGroupByEvent = (type: string): Promise<Array<NativeEventHeap>> => {
141  let sql1 = `
142    SELECT
143      event_type AS eventType,
144      sum(heap_size) AS sumHeapSize
145    FROM
146      native_hook
147    WHERE
148      event_type = 'AllocEvent'
149    UNION ALL
150    SELECT
151      event_type AS eventType,
152      sum(heap_size) AS sumHeapSize
153    FROM
154      native_hook
155    WHERE
156      event_type = 'MmapEvent'
157    `;
158  let sql2 = `
159        select (case when type = 0 then 'AllocEvent' else 'MmapEvent' end) eventType,
160            sum(apply_size) sumHeapSize
161        from native_hook_statistic
162        group by eventType;
163    `;
164  return query('queryHeapGroupByEvent', type === 'native_hook' ? sql1 : sql2, {});
165};
166
167export const queryAllHeapByEvent = (): Promise<Array<NativeEvent>> =>
168  query(
169    'queryAllHeapByEvent',
170    `
171    select * from (
172      select h.start_ts - t.start_ts as startTime,
173       h.heap_size as heapSize,
174       h.event_type as eventType
175from native_hook h ,trace_range t
176where h.start_ts >= t.start_ts and h.start_ts <= t.end_ts
177and (h.event_type = 'AllocEvent' or h.event_type = 'MmapEvent')
178union
179select h.end_ts - t.start_ts as startTime,
180       h.heap_size as heapSize,
181       (case when h.event_type = 'AllocEvent' then 'FreeEvent' else 'MunmapEvent' end) as eventType
182from native_hook h ,trace_range t
183where h.start_ts >= t.start_ts and h.start_ts <= t.end_ts
184and (h.event_type = 'AllocEvent' or h.event_type = 'MmapEvent')
185and h.end_ts not null ) order by startTime;
186`,
187    {}
188  );
189
190export const queryHeapAllData = (
191  startTs: number,
192  endTs: number,
193  ipids: Array<number>
194): Promise<Array<HeapTreeDataBean>> =>
195  query(
196    'queryHeapAllData',
197    `
198    select
199      h.start_ts - t.start_ts as startTs,
200      h.end_ts - t.start_ts as endTs,
201      h.heap_size as heapSize,
202      h.event_type as eventType,
203      h.callchain_id as eventId
204    from
205      native_hook h
206    inner join
207      trace_range  t
208    where
209      event_type = 'AllocEvent'
210    and
211      ipid in (${ipids.join(',')})
212    and
213      (h.start_ts - t.start_ts between ${startTs} and ${endTs} 
214      or h.end_ts - t.start_ts between ${startTs} and ${endTs})`,
215    { ipids: ipids, $startTs: startTs, $endTs: endTs }
216  );
217
218export const querySelectTraceStats = (): Promise<
219  Array<{
220    event_name: string;
221    stat_type: string;
222    count: number;
223    source: string;
224    serverity: string;
225  }>
226> => query('querySelectTraceStats', 'select event_name,stat_type,count,source,serverity from stat');
227
228export const queryCustomizeSelect = (
229  sql: string
230): //@ts-ignore
231Promise<Array<unknown>> => query('queryCustomizeSelect', sql);
232
233export const queryDistributedTerm = (): Promise<
234  Array<{
235    threadId: string;
236    threadName: string;
237    processId: string;
238    processName: string;
239    funName: string;
240    dur: string;
241    ts: string;
242    chainId: string;
243    spanId: string;
244    parentSpanId: string;
245    flag: string;
246    trace_name: string;
247  }>
248> =>
249  query(
250    'queryDistributedTerm',
251    `
252    select
253      group_concat(thread.id,',') as threadId,
254      group_concat(thread.name,',') as threadName,
255      group_concat(process.id,',') as processId,
256      group_concat(process.name,',') as processName,
257      group_concat(callstack.name,',') as funName,
258      group_concat(callstack.dur,',') as dur,
259      group_concat(callstack.ts,',') as ts,
260      cast(callstack.chainId as varchar) as chainId,
261      callstack.spanId as spanId,
262      callstack.parentSpanId as parentSpanId,
263      group_concat(callstack.flag,',') as flag,
264      (select
265        value
266      from
267        meta
268      where
269        name='source_name') as trace_name
270      from
271        callstack
272      inner join thread on callstack.callid = thread.id
273      inner join process on process.id = thread.ipid
274      where (callstack.flag='S' or callstack.flag='C')
275      group by callstack.chainId,callstack.spanId,callstack.parentSpanId`
276  );
277export const queryTraceTaskName = (): Promise<
278  Array<{
279    id: string;
280    pid: string;
281    process_name: string;
282    thread_name: string;
283  }>
284> =>
285  query(
286    'queryTraceTaskName',
287    `
288    select
289        P.id as id,
290        P.pid as pid,
291        P.name as process_name,
292        group_concat(T.name,',') as thread_name
293    from process as P left join thread as T where P.id = T.ipid
294    group by pid`
295  );
296
297export const queryTraceMetaData = (): Promise<
298  Array<{
299    name: string;
300    valueText: string;
301  }>
302> =>
303  query(
304    'queryTraceMetaData',
305    `
306    select
307        cast(name as varchar) as name,
308        cast(value as varchar) as valueText 
309        from meta
310        UNION
311        select 'start_ts',cast(start_ts as varchar) from trace_range
312        UNION
313        select 'end_ts',cast(end_ts as varchar) from trace_range`
314  );
315
316export const querySystemCalls = (): Promise<
317  Array<{
318    frequency: string;
319    minDur: number;
320    maxDur: number;
321    avgDur: number;
322    funName: string;
323  }>
324> =>
325  query(
326    'querySystemCalls',
327    `
328    select
329      count(*) as frequency,
330      min(dur) as minDur,
331      max(dur) as maxDur,
332      avg(dur) as avgDur,
333      name as funName
334    from
335      callstack
336      group by name
337      order by
338    frequency desc limit 100`
339  );
340
341export const queryNetWorkMaxData = (): //@ts-ignore
342Promise<Array<unknown>> =>
343  query(
344    'queryNetWorkMaxData',
345    `select 
346     ifnull(max(tx_speed),0) as maxIn, 
347     ifnull(max(rx_speed),0) as maxOut,
348     ifnull(max(packet_in_sec),0) as maxPacketIn,
349     ifnull(max(packet_in_sec),0) as maxPacketOut
350     from network`
351  );
352
353export const queryDiskIoMaxData = (): //@ts-ignore
354Promise<Array<unknown>> =>
355  query(
356    'queryDiskIoMaxData',
357    `select
358    ifnull(max(rd_speed),0) as bytesRead, 
359    ifnull(max(wr_speed),0) as bytesWrite,
360    ifnull(max(rd_count_speed),0) as readOps,
361    ifnull(max(wr_count_speed),0)  as writeOps
362    from diskio`
363  );
364//@ts-ignore
365export const queryStartTime = (): Promise<Array<unknown>> =>
366  query('queryStartTime', 'SELECT start_ts FROM trace_range');
367//@ts-ignore
368export const queryRangeTime = (): Promise<Array<unknown>> =>
369  query('queryRangeTime', `SELECT start_ts, end_ts FROM trace_range`);
370
371export const queryBinderBySliceId = (
372  id: number
373): //@ts-ignore
374Promise<Array<unknown>> =>
375  query(
376    'queryBinderBySliceId',
377    `SELECT 
378    c.ts - D.start_ts AS startTs,
379    c.dur,
380    t.tid,
381    p.pid,
382    c.depth,
383    c.argsetid,
384    c.name AS funName,
385    c.cookie 
386  FROM
387    callstack c,
388    trace_range D
389    LEFT JOIN thread t ON c.callid = t.id
390    LEFT JOIN process p ON p.id = t.ipid 
391  WHERE
392    cat = 'binder' and c.id = $id;`,
393    { $id: id },
394    { traceId: Utils.currentSelectTrace }
395  );
396
397export const queryThreadByItid = (
398  itid: number,
399  ts: number
400): //@ts-ignore
401Promise<Array<unknown>> =>
402  query(
403    'queryThreadByItid',
404    `SELECT 
405      tid,
406      pid,
407      c.dur,
408      c.depth,
409      c.name 
410    FROM
411      thread t
412      LEFT JOIN process p ON t.ipid = p.ipid
413      LEFT JOIN callstack c ON t.itid = c.callid
414    WHERE itid = $itid and c.ts = $ts;`,
415    { $itid: itid, $ts: ts }
416  );
417export const queryBinderByArgsId = (
418  id: number,
419  startTime: number,
420  isNext: boolean
421): //@ts-ignore
422Promise<Array<unknown>> => {
423  let sql = `select c.ts - D.start_ts as startTs,
424    c.dur,
425    t.tid,
426    p.pid,
427    c.depth,
428    c.argsetid,
429      c.name as funName,
430      c.cookie
431    from callstack c,trace_range D
432    left join thread t on c.callid = t.id
433    left join process p on p.id = t.ipid
434where cat = 'binder' and  c.argsetid = $id`;
435  if (isNext) {
436    sql += ' and c.ts > $startTime +  D.start_ts';
437  } else {
438    sql += ' and c.ts < $startTime +  D.start_ts';
439  }
440  return query('queryBinderByArgsId', sql, { $id: id, $startTime: startTime},
441    { traceId : Utils.currentSelectTrace }
442  );
443};
444
445export const getTabPaneFilesystemStatisticsFather = (
446  leftNs: number,
447  rightNs: number
448): //@ts-ignore
449Promise<Array<unknown>> =>
450  query(
451    'getTabPaneFilesystemStatisticsFather',
452    `
453    select SUM(dur) as allDuration,
454    count(f.type) as count,
455    min(dur) as minDuration,
456    max(dur) as maxDuration,
457    round(avg(dur),2) as avgDuration,
458    p.name,
459    f.type,
460    p.pid,
461    sum(ifnull(size,0)) as size
462    from file_system_sample as f
463    left join process as p on f.ipid=p.ipid
464    where f.start_ts >= $leftNs
465    and end_ts <= $rightNs
466    group by f.type;
467    `,
468    { $leftNs: leftNs, $rightNs: rightNs }
469  );
470
471export const getTabPaneFilesystemStatisticsChild = (
472  leftNs: number,
473  rightNs: number
474): //@ts-ignore
475Promise<Array<unknown>> =>
476  query(
477    'getTabPaneFilesystemStatisticsChild',
478    `
479    select SUM(dur)    as allDuration,
480        count(f.type) as count,
481        min(dur)    as minDuration,
482        max(dur)    as maxDuration,
483        round(avg(dur),2)    as avgDuration,
484        p.name,
485        p.pid,
486        f.type,
487        sum(ifnull(size,0))    as size
488        from file_system_sample as f left join process as p on f.ipid=p.ipid
489        where f.start_ts >= $leftNs
490        and end_ts <= $rightNs
491        group by f.type, f.ipid;
492`,
493    { $leftNs: leftNs, $rightNs: rightNs }
494  );
495
496export const getTabPaneFilesystemStatisticsAll = (
497  leftNs: number,
498  rightNs: number
499): //@ts-ignore
500Promise<Array<unknown>> =>
501  query(
502    'getTabPaneFilesystemStatisticsAll',
503    `
504    select SUM(dur)    as allDuration,
505       count(type) as count,
506       min(dur)    as minDuration,
507       max(dur)    as maxDuration,
508       round(avg(dur),2)    as avgDuration,
509       type
510    from file_system_sample
511    where start_ts <= $rightNs
512    and end_ts >= $leftNs;
513`,
514    { $leftNs: leftNs, $rightNs: rightNs }
515  );
516
517export const getTabPaneFilesystemStatistics = (
518  leftNs: number,
519  rightNs: number,
520  types: number[]
521): //@ts-ignore
522Promise<Array<unknown>> =>
523  query(
524    'getTabPaneFilesystemStatistics',
525    `
526    select p.pid,
527       ifnull(p.name,'Process') as name,
528       f.type,
529       count(f.ipid) as count,
530       sum(ifnull(size,0)) as size,
531       sum(case when f.type = 2 then ifnull(size,0) else 0 end) as logicalReads,
532       sum(case when f.type = 3 then ifnull(size,0) else 0 end) as logicalWrites,
533       sum(case when f.type != 2 and f.type != 3 then ifnull(size,0) else 0 end) as otherFile,
534       sum(dur) as allDuration,
535       min(dur) as minDuration,
536       max(dur) as maxDuration,
537       avg(dur) as avgDuration
538    from file_system_sample as f left join process as p on f.ipid=p.ipid
539    where f.end_ts >= $leftNs
540    and f.start_ts <= $rightNs
541    and f.type in (${types.join(',')})
542    group by f.type,f.ipid
543    order by f.type;
544`,
545    { $leftNs: leftNs, $rightNs: rightNs }
546  );
547
548export const getTabPaneIOTierStatisticsData = (
549  leftNs: number,
550  rightNs: number,
551  diskIOipids: Array<number>
552): //@ts-ignore
553Promise<Array<unknown>> => {
554  let str = '';
555  if (diskIOipids.length > 0) {
556    str = ` and i.ipid in (${diskIOipids.join(',')})`;
557  }
558  return query(
559    'getTabPaneIOTierStatisticsData',
560    `
561    select p.pid,
562       ifnull(p.name,'Process') as pname,
563       i.tier,
564       i.ipid,
565       path_id as path,
566       count(i.ipid) as count,
567       sum(latency_dur) as allDuration,
568       min(latency_dur) as minDuration,
569       max(latency_dur) as maxDuration,
570       avg(latency_dur) as avgDuration
571    from bio_latency_sample as i left join process as p on i.ipid=p.ipid
572    where i.end_ts+latency_dur >= $leftNs
573    and i.start_ts+latency_dur <= $rightNs
574    ${str}
575    group by i.tier,i.ipid,i.path_id
576    order by i.tier;
577`,
578    { $leftNs: leftNs, $rightNs: rightNs }
579  );
580};
581
582export const getTabPaneFrequencySampleData = (
583  leftNs: number,
584  rightNs: number,
585  cpuFreqFilterIds: Array<number>
586): //@ts-ignore
587Promise<Array<unknown>> => {
588  let str = '';
589  if (cpuFreqFilterIds.length > 0) {
590    str = ` and filter_id in (${cpuFreqFilterIds.join(',')})`;
591  }
592  return query(
593    'getTabPaneFrequencySampleData',
594    `
595    select value, filter_id as filterId, ts, f.cpu
596    from measure left join cpu_measure_filter as f on f.id=filter_id
597    where
598    ts <= $rightNs${str} order by ts asc;
599`,
600    { $leftNs: leftNs, $rightNs: rightNs }, {traceId: Utils.currentSelectTrace}
601  );
602};
603
604export const getFileSysChartDataByType = (
605  type: number
606): //@ts-ignore
607Promise<Array<unknown>> =>
608  query(
609    'getFileSysChartData',
610    `
611    select
612       (A.start_ts -B.start_ts) as startNS,
613       (A.end_ts - B.start_ts) as endNS,
614       dur
615    from file_system_sample A,trace_range B
616    where type = $type and startNS > 0;`,
617    { $type: type }
618  );
619
620export const getDiskIOProcess = (): //@ts-ignore
621Promise<Array<unknown>> =>
622  query(
623    'getDiskIOProcess',
624    `
625    select name,B.ipid,pid
626    from (select distinct ipid from bio_latency_sample A,trace_range B 
627    where A.start_ts between B.start_ts and B.end_ts) A
628    left join process B on A.ipid = B.ipid;`,
629    {}
630  );
631
632export const getDiskIOLatencyChartDataByProcess = (
633  all: boolean,
634  ipid: number,
635  typeArr: Array<number>
636): //@ts-ignore
637Promise<Array<unknown>> =>
638  query(
639    'getDiskIOLatencyChartDataByProcess',
640    `
641    select
642       (A.start_ts -B.start_ts) as startNS,
643       (A.start_ts - B.start_ts + A.latency_dur) as endNS,
644       latency_dur as dur
645    from bio_latency_sample A,trace_range B
646    where type in (${typeArr.join(',')}) and startNS > 0
647        ${all ? '' : 'and ipid = ' + ipid}
648    order by A.start_ts;`,
649    {}
650  );
651
652export const queryAnomalyData = (): Promise<Array<EnergyAnomalyStruct>> =>
653  query(
654    'queryAnomalyData',
655    `select 
656       S.id,
657      (S.ts - TR.start_ts) as startNS,
658      D.data as eventName,
659      D2.data as appKey, 
660      (case when S.type==1 then group_concat(S.string_value,',') else group_concat(S.int_value,',') 
661      end) as Value
662      from trace_range AS TR,hisys_event_measure as S 
663      left join data_dict as D on D.id=S.name_id 
664      left join app_name as APP on APP.id=S.key_id 
665      left join data_dict as D2 on D2.id=APP.app_key
666      where D.data in ('ANOMALY_SCREEN_OFF_ENERGY','ANOMALY_KERNEL_WAKELOCK',
667      'ANOMALY_CPU_HIGH_FREQUENCY','ANOMALY_WAKEUP')
668     or (D.data in ('ANOMALY_RUNNINGLOCK','ANORMALY_APP_ENERGY','ANOMALY_GNSS_ENERGY',
669     'ANOMALY_CPU_ENERGY','ANOMALY_ALARM_WAKEUP') and D2.data in ("APPNAME")) 
670      group by S.serial,D.data`
671  );
672
673export const querySystemLocationData = (): Promise<
674  Array<{
675    ts: string;
676    eventName: string;
677    appKey: string;
678    Value: string;
679  }>
680> =>
681  query(
682    'querySystemLocationData',
683    `SELECT
684        ( S.ts - TR.start_ts ) AS ts,
685        D.data AS eventName,
686        D2.data AS appKey,
687        group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS Value 
688        FROM
689        trace_range AS TR,
690        hisys_event_measure AS S
691        LEFT JOIN data_dict AS D ON D.id = S.name_id
692        LEFT JOIN app_name AS APP ON APP.id = S.key_id
693        LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key 
694        WHERE
695        D.data = 'GNSS_STATE' AND D2.data = 'STATE'
696        GROUP BY
697        S.serial,
698        APP.app_key,
699        D.data,
700        D2.data;`
701  );
702
703export const querySystemLockData = (): Promise<
704  Array<{
705    ts: string;
706    eventName: string;
707    appKey: string;
708    Value: string;
709  }>
710> =>
711  query(
712    'querySystemLockData',
713    `SELECT
714        ( S.ts - TR.start_ts ) AS ts,
715        D.data AS eventName,
716        D2.data AS appKey,
717        group_concat(( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS Value 
718        FROM
719        trace_range AS TR,
720        hisys_event_measure AS S
721        LEFT JOIN data_dict AS D ON D.id = S.name_id
722        LEFT JOIN app_name AS APP ON APP.id = S.key_id
723        LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key 
724        WHERE
725        ( D.data = 'POWER_RUNNINGLOCK' AND D2.data in ('TAG','MESSAGE')) 
726        GROUP BY
727        S.serial;`
728  );
729
730export const querySystemAllData = (): Promise<
731  Array<{
732    id: number;
733    eventName: string;
734    eventValue: string;
735  }>
736> =>
737  query(
738    'querySystemAllData',
739    `SELECT
740      S.id,
741      D.data AS eventName,
742      contents AS eventValue
743     FROM
744      trace_range AS TR,
745      hisys_all_event AS S
746          LEFT JOIN data_dict AS D ON S.event_name_id = D.id
747          LEFT JOIN data_dict AS D2 ON S.domain_id = D2.id
748     WHERE
749       eventName IN ( 'POWER_RUNNINGLOCK', 'GNSS_STATE', 'WORK_REMOVE', 'WORK_STOP', 'WORK_ADD' );`
750  );
751
752export const querySystemSchedulerData = (): Promise<
753  Array<{
754    startNs: string;
755    eventName: string;
756    appKey: string;
757    Value: string;
758  }>
759> =>
760  query(
761    'querySystemSchedulerData',
762    `SELECT
763      ( S.ts - TR.start_ts ) AS startNs,
764      D.data AS eventName,
765      group_concat(D2.data, ',') AS appKey,
766      group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS Value 
767      FROM
768      trace_range AS TR,
769      hisys_event_measure AS S
770      LEFT JOIN data_dict AS D ON D.id = S.name_id
771      LEFT JOIN app_name AS APP ON APP.id = S.key_id
772      LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key 
773      WHERE
774      D.data IN ( 'WORK_REMOVE', 'WORK_STOP', 'WORK_ADD' ) AND D2.data in ('NAME','TYPE','WORKID') 
775      GROUP BY
776      S.serial;`
777  );
778
779export const querySystemDetailsData = (rightNs: number, eventName: string): Promise<Array<SystemDetailsEnergy>> =>
780  query(
781    'querySystemDetailsData',
782    `SELECT
783        ( S.ts - TR.start_ts ) AS ts,
784        D.data AS eventName,
785        D2.data AS appKey,
786        group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS appValue
787    FROM
788        trace_range AS TR,
789        hisys_event_measure AS S
790        LEFT JOIN data_dict AS D ON D.id = S.name_id
791        LEFT JOIN app_name AS APP ON APP.id = S.key_id
792        LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key
793    WHERE
794        D.data in ($eventName)
795    AND
796        D2.data in ('UID', 'TYPE', 'WORKID', 'NAME', 'INTERVAL', 'TAG', 'STATE', 'STACK', 'APPNAME', 
797        'MESSAGE', 'PID', 'LOG_LEVEL')
798    AND
799        (S.ts - TR.start_ts) <= $rightNS
800    GROUP BY
801        S.serial,
802        APP.app_key,
803        D.data,
804        D2.data;`,
805    { $rightNS: rightNs, $eventName: eventName }
806  );
807
808export const querySystemWorkData = (rightNs: number): Promise<Array<SystemDetailsEnergy>> =>
809  query(
810    'querySystemWorkData',
811    `SELECT
812    ( S.ts - TR.start_ts ) AS ts,
813    D.data AS eventName,
814    D2.data AS appKey,
815    group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS appValue
816    FROM
817    trace_range AS TR,
818    hisys_event_measure AS S
819    LEFT JOIN data_dict AS D
820    ON D.id = S.name_id
821    LEFT JOIN app_name AS APP
822    ON APP.id = S.key_id
823    LEFT JOIN data_dict AS D2
824    ON D2.id = APP.app_key
825    WHERE
826    D.data in ("WORK_REMOVE", "WORK_STOP", "WORK_ADD", "WORK_START")
827    and
828    D2.data in ('UID', 'TYPE', 'WORKID', 'NAME', 'INTERVAL', 'TAG', 'STATE', 'STACK', 'APPNAME', 
829    'MESSAGE', 'PID', 'LOG_LEVEL')
830    and (S.ts - TR.start_ts) <= $rightNS
831    GROUP BY
832    S.serial,
833    APP.app_key,
834    D.data,
835    D2.data;`,
836    { $rightNS: rightNs }
837  );
838
839export const queryMaxPowerValue = (
840  appName: string
841): Promise<
842  Array<{
843    maxValue: number;
844  }>
845> =>
846  query(
847    'queryMaxPowerValue',
848    `SELECT
849    max( item ) AS maxValue 
850    FROM
851    (
852    SELECT 
853    sum( energy + background_energy + screen_on_energy + screen_off_energy + foreground_energy ) AS item 
854    FROM 
855    energy 
856    WHERE 
857    app_name = $appName 
858    GROUP BY 
859    startNs);`,
860    { $appName: appName }
861  );
862
863export const queryMaxStateValue = (
864  eventName: string
865): Promise<
866  Array<{
867    type: string;
868    maxValue: number;
869  }>
870> =>
871  query(
872    'queryMaxStateValue',
873    `select 
874  D.data as type,
875  max(S.int_value) as maxValue 
876  from trace_range AS TR,hisys_event_measure as S 
877  left join data_dict as D on D.id=S.name_id 
878  left join app_name as APP on APP.id=S.key_id 
879  left join data_dict as D2 on D2.id=APP.app_key
880  where (case when 'SENSOR_STATE'==$eventName then D.data like '%SENSOR%' else D.data = $eventName end)
881  and D2.data in ('BRIGHTNESS','STATE','VALUE','LEVEL','VOLUME','OPER_TYPE','VOLUME')
882  group by APP.app_key,D.data,D2.data;`,
883    { $eventName: eventName }
884  );
885
886export const queryStateData = (eventName: string): Promise<Array<EnergyStateStruct>> =>
887  query(
888    'queryStateData',
889    `select
890  (S.ts-TR.start_ts) as startNs,
891  D.data as type,
892  D2.data as appKey, 
893  S.int_value as value 
894  from trace_range AS TR,hisys_event_measure as S 
895  left join data_dict as D on D.id=S.name_id 
896  left join app_name as APP on APP.id=S.key_id 
897  left join data_dict as D2 on D2.id=APP.app_key
898  where (case when 'SENSOR_STATE'==$eventName then D.data like '%SENSOR%' else D.data = $eventName end)
899  and D2.data in ('BRIGHTNESS','STATE','VALUE','LEVEL','VOLUME','OPER_TYPE','VOLUME')
900  group by S.serial,APP.app_key,D.data,D2.data;`,
901    { $eventName: eventName }
902  );
903
904export const queryEnergyAppName = (): Promise<
905  Array<{
906    string_value: string | null;
907  }>
908> =>
909  query(
910    'queryEnergyAppName',
911    `
912    SELECT
913    DISTINCT hisys_event_measure.string_value from data_dict 
914    left join app_name on app_name.app_key=data_dict.id 
915    left join hisys_event_measure on hisys_event_measure.key_id = app_name.id
916    where data_dict.data = "APPNAME"`
917  );
918
919export const getTabIoCompletionTimesType = (startTime: number, endTime: number): Promise<Array<string>> =>
920  query(
921    'getTabIoCompletionTimesType',
922    `
923    SELECT tier from bio_latency_sample s,trace_range t
924     WHERE s.start_ts + s.latency_dur >= $startTime + t.start_ts 
925     and s.start_ts <= $endTime + t.start_ts group by tier`,
926    { $startTime: startTime, $endTime: endTime }
927  );
928
929export const queryEnergyEventExits = (): //@ts-ignore
930Promise<Array<unknown>> =>
931  query(
932    'queryEnergyEventExits',
933    `select 
934      event_name 
935      from stat s 
936      where s.event_name = 'trace_hisys_event' 
937      and s.stat_type ='received' and s.count > 0`
938  );
939
940export const querySysLockDetailsData = (rightNs: number, eventName: string): Promise<Array<SystemDetailsEnergy>> =>
941  query(
942    'querySysLockDetailsData',
943    `SELECT
944      ( S.ts - TR.start_ts ) AS ts,
945      D.data AS eventName,
946      D2.data AS appKey,
947      group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS appValue
948    FROM
949      trace_range AS TR,
950      hisys_event_measure AS S
951      LEFT JOIN data_dict AS D ON D.id = S.name_id
952      LEFT JOIN app_name AS APP ON APP.id = S.key_id
953      LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key
954    WHERE
955        D.data in ($eventName)
956    AND
957        D2.data in ('UID', 'TYPE', 'WORKID', 'NAME', 'INTERVAL', 'TAG', 'STATE', 'STACK', 'APPNAME', 
958        'MESSAGE', 'PID', 'LOG_LEVEL')
959    AND
960        (S.ts - TR.start_ts) <= $rightNS
961    GROUP BY
962        S.serial, APP.app_key, D.data, D2.data;`,
963    { $rightNS: rightNs, $eventName: eventName }
964  );
965
966export const queryStateInitValue = (eventName: string, keyName: string): Promise<Array<EnergyStateStruct>> =>
967  query(
968    'queryStateInitValue',
969    `select
970  0 as startNs,
971  $eventName as type,
972  '' as appKey,
973  (case $keyName
974  when 'brightness' then device_state.brightness
975  when 'wifi' then device_state.wifi
976  when 'bt_state' then device_state.bt_state
977  when 'location' then device_state.location
978  else 0 end) as value
979  from device_state;`,
980    { $eventName: eventName, $keyName: keyName }
981  );
982
983export const querySysLocationDetailsData = (rightNs: number, eventName: string): Promise<Array<SystemDetailsEnergy>> =>
984  query(
985    'querySysLocationDetailsData',
986    `SELECT
987        ( S.ts - TR.start_ts ) AS ts,
988        D.data AS eventName,
989        D2.data AS appKey,
990        group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS appValue 
991        FROM
992        trace_range AS TR,
993        hisys_event_measure AS S
994        LEFT JOIN data_dict AS D ON D.id = S.name_id
995        LEFT JOIN app_name AS APP ON APP.id = S.key_id
996        LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key 
997        WHERE
998        D.data in ($eventName) 
999        and 
1000        D2.data in ('UID', 'TYPE', 'WORKID', 'NAME', 'INTERVAL', 'TAG', 'STATE', 'STACK', 
1001        'APPNAME', 'MESSAGE', 'PID', 'LOG_LEVEL')
1002        and (S.ts - TR.start_ts) <= $rightNS
1003        GROUP BY
1004        S.serial,
1005        APP.app_key,
1006        D.data,
1007        D2.data;`,
1008    { $rightNS: rightNs, $eventName: eventName }
1009  );
1010export const queryConfigEnergyAppName = (): Promise<
1011  Array<{
1012    process_name: string;
1013  }>
1014> =>
1015  query(
1016    'queryConfigEnergyAppName',
1017    `
1018    SELECT value from trace_config where trace_source = 'hisys_event' and key = 'process_name'`
1019  );
1020
1021export const queryAllExpectedData = (): //@ts-ignore
1022Promise<Array<unknown>> =>
1023  query(
1024    'queryAllExpectedData',
1025    `
1026        SELECT
1027            a.id,
1028            (a.ts - TR.start_ts) AS ts,
1029            a.vsync as name,
1030            a.type,
1031            a.dur,
1032            p.pid,
1033            p.name as cmdline
1034        FROM frame_slice AS a, trace_range AS TR
1035             LEFT JOIN process AS p ON a.ipid = p.ipid
1036        WHERE a.type = 1
1037          and (a.flag <> 2 or a.flag is null)
1038        ORDER BY a.ipid,ts;`
1039  );
1040
1041export const queryFlowsData = (
1042  src_slice: Array<string>
1043): //@ts-ignore
1044Promise<Array<unknown>> =>
1045  query(
1046    'queryFlowsData',
1047    `
1048    SELECT fs.vsync AS name,
1049        p.pid,
1050        p.name  AS cmdline,
1051        fs.type
1052    FROM frame_slice AS fs
1053    LEFT JOIN process AS p ON fs.ipid = p.ipid
1054    WHERE fs.type = 0
1055        AND fs.id IN (${src_slice.join(',')});`
1056  );
1057
1058export const queryPrecedingData = (
1059  dst_slice: string
1060): //@ts-ignore
1061Promise<Array<unknown>> =>
1062  query(
1063    'queryFlowsData',
1064    `
1065        SELECT a.vsync AS name,
1066               p.pid,
1067               p.name  AS cmdline,
1068               a.type
1069        FROM frame_slice AS a
1070                 LEFT JOIN process AS p ON a.ipid = p.ipid
1071        WHERE a.type = 0
1072          AND a.id = $dst_slice;`,
1073    { $dst_slice: dst_slice }
1074  );
1075
1076export const queryFrameTimeData = (): //@ts-ignore
1077Promise<Array<unknown>> =>
1078  query(
1079    'queryFrameTimeData',
1080    `
1081        SELECT DISTINCT p.pid
1082        FROM frame_slice AS a
1083            LEFT JOIN process AS p
1084            ON a.ipid = p.ipid;`
1085  );
1086
1087export const queryAllSnapshotNames = (): Promise<Array<FileInfo>> =>
1088  query(
1089    'queryAllSnapshotNames',
1090    `SELECT f.id,
1091        f.file_name AS name
1092      FROM
1093        js_heap_files f,
1094        trace_range t
1095      WHERE
1096        ( t.end_ts >= f.end_time AND f.file_name != 'Timeline' )
1097        OR f.file_name = 'Timeline'`
1098  );
1099export const queryHeapFile = (): Promise<Array<FileInfo>> =>
1100  query(
1101    'queryHeapFile',
1102    `SELECT f.id,
1103        f.file_name AS name,
1104        f.start_time - t.start_ts AS startTs,
1105        f.end_time - t.start_ts AS endTs,
1106        f.self_size AS size,
1107        c.pid
1108      FROM
1109        js_heap_files f,
1110        trace_range t,
1111        js_config c
1112      WHERE
1113        ( t.end_ts >= f.end_time AND f.file_name != 'Timeline' )
1114        OR f.file_name = 'Timeline'`
1115  );
1116
1117export const queryHeapInfo = (
1118  fileId: number
1119): //@ts-ignore
1120Promise<Array<unknown>> =>
1121  query(
1122    'queryHeapInfo',
1123    `SELECT file_id as fileId, key, type, int_value as intValue, str_value as strValue
1124      FROM js_heap_info WHERE file_id = ${fileId}`
1125  );
1126
1127export const queryHeapNode = (fileId: number): Promise<Array<HeapNode>> =>
1128  query(
1129    'queryHeapNode',
1130    `SELECT 
1131    node_index as nodeIndex,
1132    type,
1133    name as nameIdx,
1134    id,
1135    self_size as selfSize,
1136    edge_count as edgeCount,
1137    trace_node_id as traceNodeId,
1138    detachedness 
1139    FROM js_heap_nodes WHERE file_id = ${fileId}`
1140  );
1141
1142export const queryHeapEdge = (fileId: number): Promise<Array<HeapEdge>> =>
1143  query(
1144    'queryHeapEdge',
1145    `SELECT 
1146      edge_index as edgeIndex,
1147      type,
1148      name_or_index as nameOrIndex,
1149      to_node as nodeId,
1150      from_node_id as fromNodeId,
1151      to_node_id as toNodeId
1152    FROM js_heap_edges WHERE file_id = ${fileId}`
1153  );
1154export const queryHeapSample = (fileId: number): Promise<Array<HeapSample>> =>
1155  query(
1156    'queryHeapSample',
1157    `SELECT timestamp_us as timestamp , last_assigned_id as lastAssignedId, 0 as size
1158      FROM js_heap_sample WHERE file_id = ${fileId}`
1159  );
1160
1161export const queryHeapLocation = (fileId: number): Promise<Array<HeapLocation>> =>
1162  query(
1163    'queryHeapLocation',
1164    `SELECT object_index as objectIndex,script_id as scriptId ,column
1165      FROM js_heap_location WHERE file_id = ${fileId}`
1166  );
1167
1168export const queryHeapString = (
1169  fileId: number
1170): //@ts-ignore
1171Promise<Array<unknown>> =>
1172  query(
1173    'queryHeapString',
1174    `SELECT string
1175      FROM js_heap_string WHERE file_id = ${fileId}`
1176  );
1177export const queryTraceRange = (): Promise<Array<unknown>> =>
1178  query(
1179    'queryTraceRange',
1180    `SELECT 
1181    t.start_ts as startTs, 
1182    t.end_ts as endTs 
1183    FROM trace_range t`
1184  );
1185
1186export const queryBySelectAllocationOrReturn = (
1187  executeId: string,
1188  itid: number
1189): Promise<
1190  Array<{
1191    tid: number;
1192    allocation_task_row: number;
1193    execute_task_row: number;
1194    return_task_row: number;
1195    priority: number;
1196  }>
1197> => {
1198  let sqlStr = `SELECT thread.tid,
1199                       task_pool.allocation_task_row,
1200                       task_pool.execute_task_row,
1201                       task_pool.return_task_row,
1202                       task_pool.priority
1203                FROM task_pool
1204                       LEFT JOIN callstack ON callstack.id = task_pool.execute_task_row
1205                       LEFT JOIN thread ON thread.id = callstack.callid
1206                WHERE task_pool.execute_task_row IS NOT NULL AND task_pool.task_id = $executeId
1207                AND task_pool.allocation_itid = $itid;
1208    `;
1209  return query('queryBySelectAllocationOrReturn', sqlStr, { $executeId: executeId, $itid: itid });
1210};
1211
1212export const queryTaskListByExecuteTaskIds = (
1213  executeTaskIds: Array<number>,
1214  ipid: number
1215): Promise<Array<TaskTabStruct>> => {
1216  let sqlStr = `
1217    SELECT thread.ipid,
1218           task_pool.allocation_task_row AS allocationTaskRow,
1219           task_pool.execute_task_row    AS executeTaskRow,
1220           task_pool.return_task_row     AS returnTaskRow,
1221           task_pool.task_id          AS executeId,
1222           task_pool.priority
1223    FROM task_pool
1224           LEFT JOIN callstack ON callstack.id = task_pool.allocation_task_row
1225           LEFT JOIN thread ON thread.id = callstack.callid
1226    WHERE task_pool.task_id IN (${executeTaskIds.join(',')})
1227      AND thread.ipid = $ipid
1228      AND task_pool.execute_task_row IS NOT NULL;
1229    `;
1230  return query('queryTaskListByExecuteTaskIds', sqlStr, { $executeTaskIds: executeTaskIds, $ipid: ipid });
1231};
1232
1233export const queryTaskPoolCallStack = (): Promise<Array<{ id: number; ts: number; dur: number; name: string }>> => {
1234  let sqlStr = `
1235  select 
1236    * 
1237  from callstack where name like 'H:Task%';`;
1238  return query('queryTaskPoolCallStack', sqlStr, {});
1239};
1240
1241export const queryTaskPoolTotalNum = (itid: number): Promise<number[]> =>
1242  query<number>(
1243    'queryTaskPoolTotalNum',
1244    `SELECT thread.tid
1245         FROM thread
1246                LEFT JOIN callstack ON thread.id = callstack.callid
1247         WHERE ipid in (SELECT thread.ipid
1248                       FROM thread
1249                       WHERE thread.itid = $itid)
1250           AND thread.name LIKE '%TaskWork%'
1251         GROUP BY thread.tid;`,
1252    { $itid: itid }
1253  );
1254
1255export const queryFrameAnimationData = (): Promise<Array<FrameAnimationStruct>> =>
1256  query(
1257    'queryFrameAnimationData',
1258    `SELECT a.id AS animationId,
1259           'Response delay' as status,
1260           (CASE WHEN a.input_time NOT NULL 
1261               THEN ( a.input_time - R.start_ts ) 
1262               ELSE ( a.start_point - R.start_ts ) END
1263           ) AS startTs,
1264           (a.start_point - R.start_ts) AS endTs,
1265           0 AS frameInfo,
1266           a.name AS name
1267         FROM 
1268             animation AS a, 
1269             trace_range AS R
1270         UNION
1271         SELECT a.id AS animationId,
1272           'Completion delay' as status,
1273           (CASE WHEN a.input_time NOT NULL
1274               THEN ( a.input_time - R.start_ts )
1275               ELSE ( a.start_point - R.start_ts ) END
1276           ) AS startTs,
1277           (a.end_point - R.start_ts) AS endTs,
1278           a.frame_info AS frameInfo,
1279           a.name AS name
1280         FROM 
1281             animation AS a, 
1282             trace_range AS R
1283         ORDER BY
1284            endTs;`
1285  );
1286
1287export const queryAnimationTimeRangeData = (): Promise<Array<FrameAnimationStruct>> =>
1288  query(
1289    'queryAnimationTimeRangeData',
1290    `SELECT 'Response delay' as status,
1291           (CASE WHEN a.input_time NOT NULL
1292               THEN ( a.input_time - R.start_ts )
1293               ELSE ( a.start_point - R.start_ts ) END
1294           ) AS startTs,
1295            (a.start_point - R.start_ts) AS endTs
1296         FROM 
1297             animation AS a,
1298             trace_range AS R
1299         UNION
1300         SELECT 'Completion delay' as status,
1301           (CASE WHEN a.input_time NOT NULL
1302               THEN ( a.input_time - R.start_ts )
1303               ELSE ( a.start_point - R.start_ts ) END
1304           ) AS startTs,
1305           (a.end_point - R.start_ts) AS endTs
1306         FROM 
1307             animation AS a,
1308             trace_range AS R
1309         ORDER BY
1310            endTs;`
1311  );
1312export const querySourceTypen = (): Promise<Array<unknown>> =>
1313  query(
1314    'querySourceTypen',
1315    `SELECT 
1316      value 
1317    FROM 
1318      meta
1319    where
1320      name = 'source_type'
1321    `
1322  );
1323
1324export const queryFrameDynamicData = (): Promise<FrameDynamicStruct[]> =>
1325  query(
1326    'queryFrameDynamicData',
1327    `SELECT d.id,
1328           d.x,
1329           d.y,
1330           d.width,
1331           d.height,
1332           d.alpha,
1333           d.name AS appName,
1334           (d.end_time - R.start_ts) AS ts
1335        FROM 
1336            dynamic_frame AS d,
1337            trace_range AS R
1338        ORDER BY 
1339            d.end_time;`
1340  );
1341
1342export const queryDynamicIdAndNameData = (): Promise<Array<{ id: number; appName: string }>> =>
1343  query('queryDynamicIdAndNameData', 'SELECT id, name AS appName FROM dynamic_frame;');
1344
1345export const queryAnimationIdAndNameData = (): Promise<
1346  Array<{
1347    id: number;
1348    name: string;
1349    info: string;
1350  }>
1351> => query('queryAnimationIdAndNameData', 'SELECT id, name, frame_info as info FROM animation;');
1352
1353export const queryFrameApp = (): Promise<
1354  Array<{
1355    name: string;
1356  }>
1357> =>
1358  query(
1359    'queryFrameApp',
1360    `SELECT 
1361            DISTINCT d.name
1362         FROM 
1363             dynamic_frame AS d, 
1364             trace_range AS R
1365         WHERE 
1366            d.end_time >= R.start_ts
1367            AND
1368            d.end_time <= R.end_ts;`
1369  );
1370
1371export const queryFrameSpacing = (): Promise<Array<FrameSpacingStruct>> =>
1372  query(
1373    'queryFrameSpacing',
1374    `SELECT d.id,
1375         d.width AS currentFrameWidth,
1376         d.height AS currentFrameHeight,
1377         d.name AS nameId,
1378         (d.end_time - R.start_ts) AS currentTs,
1379         d.x,
1380         d.y
1381     FROM
1382         dynamic_frame AS d,
1383         trace_range AS R
1384     ORDER BY
1385         d.end_time;`
1386  );
1387
1388export const queryPhysicalData = (): Promise<Array<DeviceStruct>> =>
1389  query(
1390    'queryPhysicalData',
1391    `SELECT physical_width AS physicalWidth,
1392            physical_height AS physicalHeight,
1393            physical_frame_rate AS physicalFrameRate
1394     FROM device_info;`
1395  );
1396export const getSystemLogsData = (): Promise<
1397  Array<{
1398    id: number;
1399    ts: number;
1400    processName: string;
1401    tid: number;
1402    level: string;
1403    tag: string;
1404    message: string;
1405    des: number;
1406  }>
1407> =>
1408  query(
1409    'getSystemLogsData',
1410    `SELECT ROW_NUMBER() OVER (ORDER BY l.ts) AS processName,
1411            l.seq AS id,
1412            (l.ts - TR.start_ts) AS ts,
1413            l.pid AS indexs,
1414            l.tid,
1415            l.level,
1416            l.tag,
1417            l.context AS message,
1418            l.origints AS des
1419         FROM trace_range AS TR,
1420              log AS l
1421         ORDER BY ts`
1422  );
1423
1424export const queryLogData = (): Promise<Array<LogStruct>> =>
1425  query(
1426    'queryLogData',
1427    `SELECT 
1428    l.ts - tr.start_ts as startNs 
1429    FROM log AS l, trace_range tr WHERE startNs > 0 LIMIT 1;`
1430  );
1431
1432export const queryMetric = (metricName: string): Promise<Array<string>> =>
1433  query('queryMetric', metricName, '', { action: 'exec-metric' });
1434
1435export const queryExistFtrace = (): Promise<Array<number>> =>
1436  query(
1437    'queryExistFtrace',
1438    `select 1 from thread_state
1439         UNION
1440         select 1 from args;`
1441  );
1442
1443export const queryTraceType = (): Promise<
1444  Array<{
1445    value: string;
1446  }>
1447> =>
1448  query(
1449    'queryTraceType',
1450    `SELECT m.value
1451            FROM 
1452                meta AS m
1453            WHERE 
1454                m.name = 'source_type';`
1455  );
1456
1457export const queryLogAllData = (oneDayTime: number, leftNs: number, rightNs: number): Promise<Array<LogStruct>> =>
1458  query(
1459    'queryLogAllData',
1460    `SELECT l.seq AS id,
1461         CASE
1462             WHEN l.ts < ${oneDayTime} THEN 0
1463             ELSE (l.ts - TR.start_ts)
1464             END AS startTs,
1465         CASE l.level
1466             WHEN 'D' THEN 'Debug'
1467             WHEN 'I' THEN 'Info'
1468             WHEN 'W' THEN 'Warn'
1469             WHEN 'E' THEN 'Error'
1470             WHEN 'F' THEN 'Fatal'
1471             END AS level,
1472         l.tag AS tag,
1473         l.context AS context,
1474         (strftime( '%m-%d %H:%M:%S', l.origints / 1000000000, 'unixepoch', 'localtime' ) || 
1475         '.' || printf('%03d', (l.origints / 1000000) % 1000)) AS originTime,
1476         COALESCE(p.name, 'Process ' || l.pid) AS processName
1477     FROM
1478         log AS l
1479             LEFT JOIN trace_range AS TR ON l.ts >= TR.start_ts
1480             LEFT JOIN process AS p ON p.pid = l.pid
1481     WHERE
1482         startTs >= ${Math.floor(leftNs)}
1483       AND startTs <= ${Math.floor(rightNs)}
1484     ORDER BY
1485         l.ts;`,
1486    { $oneDayTime: oneDayTime }
1487  );
1488
1489export const queryFpsSourceList = (
1490  inputTime: number,
1491  endTime: number,
1492  name: string
1493): Promise<
1494  Array<{
1495    name: string;
1496    ts: number;
1497    dur: number;
1498    pid: number;
1499    tid: number;
1500    depth: number;
1501  }>
1502> =>
1503  query(
1504    'queryFpsSourceList',
1505    `SELECT t.tid,
1506        c.dur,
1507        c.depth,
1508        c.ts,
1509        c.name 
1510      FROM
1511        callstack c
1512      INNER JOIN thread t ON c.callid = t.itid 
1513      WHERE
1514        c.name LIKE '%${name}%' 
1515        AND 
1516        c.ts BETWEEN ${inputTime} and ${endTime} 
1517        AND 
1518        t.name = 'render_service';`
1519  );
1520
1521export const queryStateFreqList = (
1522  startTime: number,
1523  endTime: number,
1524  cpu: number
1525): //@ts-ignore
1526Promise<Array<unknown>> => {
1527  let sql = `select c.value,
1528    c.ts,
1529    c.dur,
1530    c.ts - r.start_ts AS startTime, 
1531    c.ts - r.start_ts + c.dur AS endTime
1532   from
1533     measure c, trace_range r 
1534   inner join
1535     cpu_measure_filter t
1536   on
1537     c.filter_id = t.id
1538   where
1539     (name = 'cpufreq' or name='cpu_frequency')
1540     and
1541     t.cpu = $cpu
1542     and  
1543     (((startTime < $startTime) and  (endtime > $endTime))
1544      or ((startTime < $startTime) and ($startTime < endtime and endtime < $endTime)) 
1545      or ((startTime > $startTime) and ( $startTime < endtime and endtime < $endTime)) 
1546      or ((startTime > $startTime and startTime < $endTime) and (endtime > $endTime)))`;
1547  return query('queryBinderByArgsId', sql, {
1548    $endTime: endTime,
1549    $startTime: startTime,
1550    $cpu: cpu,
1551  });
1552};
1553export const queryPerfOutputData = (): Promise<Array<unknown>> =>
1554  query(
1555    'queryPerfOutputData',
1556    `SELECT 
1557    name, 
1558    ts 
1559    FROM callstack where name like '%PERFORMANCE_DATA%'`
1560  );
1561
1562export const queryPerfToolsDur = (): Promise<Array<unknown>> =>
1563  query(
1564    'queryPerfToolsDur',
1565    `SELECT 
1566    name, 
1567    ts, 
1568    dur 
1569    FROM callstack where name = 'H:GRAB'`
1570  );
1571