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