• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  );
1312
1313export const queryFrameDynamicData = (): Promise<FrameDynamicStruct[]> =>
1314  query(
1315    'queryFrameDynamicData',
1316    `SELECT d.id,
1317           d.x,
1318           d.y,
1319           d.width,
1320           d.height,
1321           d.alpha,
1322           d.name AS appName,
1323           (d.end_time - R.start_ts) AS ts
1324        FROM
1325            dynamic_frame AS d,
1326            trace_range AS R
1327        ORDER BY
1328            d.end_time;`
1329  );
1330
1331export const queryDynamicIdAndNameData = (): Promise<Array<{ id: number; appName: string }>> =>
1332  query('queryDynamicIdAndNameData', 'SELECT id, name AS appName FROM dynamic_frame;');
1333
1334export const queryAnimationIdAndNameData = (): Promise<
1335  Array<{
1336    id: number;
1337    name: string;
1338    info: string;
1339  }>
1340> => query('queryAnimationIdAndNameData', 'SELECT id, name, frame_info as info FROM animation;');
1341
1342export const queryFrameApp = (): Promise<
1343  Array<{
1344    name: string;
1345  }>
1346> =>
1347  query(
1348    'queryFrameApp',
1349    `SELECT
1350            DISTINCT d.name
1351         FROM
1352             dynamic_frame AS d,
1353             trace_range AS R
1354         WHERE
1355            d.end_time >= R.start_ts
1356            AND
1357            d.end_time <= R.end_ts;`
1358  );
1359
1360export const queryFrameSpacing = (): Promise<Array<FrameSpacingStruct>> =>
1361  query(
1362    'queryFrameSpacing',
1363    `SELECT d.id,
1364         d.width AS currentFrameWidth,
1365         d.height AS currentFrameHeight,
1366         d.name AS nameId,
1367         (d.end_time - R.start_ts) AS currentTs,
1368         d.x,
1369         d.y
1370     FROM
1371         dynamic_frame AS d,
1372         trace_range AS R
1373     ORDER BY
1374         d.end_time;`
1375  );
1376
1377export const queryPhysicalData = (): Promise<Array<DeviceStruct>> =>
1378  query(
1379    'queryPhysicalData',
1380    `SELECT physical_width AS physicalWidth,
1381            physical_height AS physicalHeight,
1382            physical_frame_rate AS physicalFrameRate
1383     FROM device_info;`
1384  );
1385export const getSystemLogsData = (): Promise<
1386  Array<{
1387    id: number;
1388    ts: number;
1389    processName: string;
1390    tid: number;
1391    level: string;
1392    tag: string;
1393    message: string;
1394    des: number;
1395  }>
1396> =>
1397  query(
1398    'getSystemLogsData',
1399    `SELECT ROW_NUMBER() OVER (ORDER BY l.ts) AS processName,
1400            l.seq AS id,
1401            (l.ts - TR.start_ts) AS ts,
1402            l.pid AS indexs,
1403            l.tid,
1404            l.level,
1405            l.tag,
1406            l.context AS message,
1407            l.origints AS des
1408         FROM trace_range AS TR,
1409              log AS l
1410         ORDER BY ts`
1411  );
1412
1413export const queryLogData = (): Promise<Array<LogStruct>> =>
1414  query(
1415    'queryLogData',
1416    `SELECT
1417    l.ts - tr.start_ts as startNs
1418    FROM log AS l, trace_range tr WHERE startNs > 0 LIMIT 1;`
1419  );
1420
1421export const queryMetric = (metricName: string): Promise<Array<string>> =>
1422  query('queryMetric', metricName, '', { action: 'exec-metric' });
1423
1424export const queryExistFtrace = (): Promise<Array<number>> =>
1425  query(
1426    'queryExistFtrace',
1427    `select 1 from thread_state
1428         UNION
1429         select 1 from args;`
1430  );
1431
1432export const queryTraceType = (): Promise<
1433  Array<{
1434    value: string;
1435  }>
1436> =>
1437  query(
1438    'queryTraceType',
1439    `SELECT m.value
1440            FROM
1441                meta AS m
1442            WHERE
1443                m.name = 'source_type';`
1444  );
1445
1446export const queryLogAllData = (oneDayTime: number, leftNs: number, rightNs: number): Promise<Array<LogStruct>> =>
1447  query(
1448    'queryLogAllData',
1449    `SELECT l.seq AS id,
1450         CASE
1451             WHEN l.ts < ${oneDayTime} THEN 0
1452             ELSE (l.ts - TR.start_ts)
1453             END AS startTs,
1454         CASE l.level
1455             WHEN 'D' THEN 'Debug'
1456             WHEN 'I' THEN 'Info'
1457             WHEN 'W' THEN 'Warn'
1458             WHEN 'E' THEN 'Error'
1459             WHEN 'F' THEN 'Fatal'
1460             END AS level,
1461         l.tag AS tag,
1462         l.context AS context,
1463         (strftime( '%m-%d %H:%M:%S', l.origints / 1000000000, 'unixepoch', 'localtime' ) ||
1464         '.' || printf('%03d', (l.origints / 1000000) % 1000)) AS originTime,
1465         COALESCE(p.name, 'Process ' || l.pid) AS processName
1466     FROM
1467         log AS l
1468             LEFT JOIN trace_range AS TR ON l.ts >= TR.start_ts
1469             LEFT JOIN process AS p ON p.pid = l.pid
1470     WHERE
1471         startTs >= ${Math.floor(leftNs)}
1472       AND startTs <= ${Math.floor(rightNs)}
1473     ORDER BY
1474         l.ts;`,
1475    { $oneDayTime: oneDayTime }
1476  );
1477
1478export const queryFpsSourceList = (
1479  inputTime: number,
1480  endTime: number,
1481  name: string
1482): Promise<
1483  Array<{
1484    name: string;
1485    ts: number;
1486    dur: number;
1487    pid: number;
1488    tid: number;
1489    depth: number;
1490  }>
1491> =>
1492  query(
1493    'queryFpsSourceList',
1494    `SELECT t.tid,
1495        c.dur,
1496        c.depth,
1497        c.ts,
1498        c.name
1499      FROM
1500        callstack c
1501      INNER JOIN thread t ON c.callid = t.itid
1502      WHERE
1503        c.name LIKE '%${name}%'
1504        AND
1505        c.ts BETWEEN ${inputTime} and ${endTime}
1506        AND
1507        t.name = 'render_service';`
1508  );
1509
1510export const queryStateFreqList = (
1511  startTime: number,
1512  endTime: number,
1513  cpu: number
1514): //@ts-ignore
1515Promise<Array<unknown>> => {
1516  let sql = `select c.value,
1517    c.ts,
1518    c.dur,
1519    c.ts - r.start_ts AS startTime,
1520    c.ts - r.start_ts + c.dur AS endTime
1521   from
1522     measure c, trace_range r
1523   inner join
1524     cpu_measure_filter t
1525   on
1526     c.filter_id = t.id
1527   where
1528     (name = 'cpufreq' or name='cpu_frequency')
1529     and
1530     t.cpu = $cpu
1531     and
1532     (((startTime < $startTime) and  (endtime > $endTime))
1533      or ((startTime < $startTime) and ($startTime < endtime and endtime < $endTime))
1534      or ((startTime > $startTime) and ( $startTime < endtime and endtime < $endTime))
1535      or ((startTime > $startTime and startTime < $endTime) and (endtime > $endTime)))`;
1536  return query('queryBinderByArgsId', sql, {
1537    $endTime: endTime,
1538    $startTime: startTime,
1539    $cpu: cpu,
1540  });
1541};
1542export const queryPerfOutputData = (): Promise<Array<unknown>> =>
1543  query(
1544    'queryPerfOutputData',
1545    `SELECT
1546    name,
1547    ts
1548    FROM callstack where name like '%PERFORMANCE_DATA%'`
1549  );
1550
1551export const queryPerfToolsDur = (): Promise<Array<unknown>> =>
1552  query(
1553    'queryPerfToolsDur',
1554    `SELECT
1555    name,
1556    ts,
1557    dur
1558    FROM callstack where name = 'H:GRAB'`
1559  );
1560