• 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 */
15
16import './sql-wasm.js';
17
18import { Counter, Fps, SelectionData } from '../bean/BoxSelection.js';
19import { WakeupBean } from '../bean/WakeupBean.js';
20import { BinderArgBean } from '../bean/BinderArgBean.js';
21import { SPT, SPTChild } from '../bean/StateProcessThread.js';
22import { CpuUsage, Freq } from '../bean/CpuUsage.js';
23
24import {
25  NativeEvent,
26  NativeEventHeap,
27  NativeHookMalloc,
28  NativeHookProcess,
29  NativeHookSampleQueryInfo,
30  NativeHookStatistics,
31} from '../bean/NativeHook.js';
32import {
33  LiveProcess,
34  ProcessHistory,
35  SystemCpuSummary,
36  SystemDiskIOSummary,
37  SystemNetworkSummary,
38} from '../bean/AbilityMonitor.js';
39
40import {
41  PerfCall,
42  PerfCallChain,
43  PerfCmdLine,
44  PerfFile,
45  PerfSample,
46  PerfStack,
47  PerfThread,
48} from '../bean/PerfProfile.js';
49import { SearchFuncBean } from '../bean/SearchFuncBean.js';
50import { CounterSummary, SdkSliceSummary } from '../bean/SdkSummary.js';
51import { Smaps } from '../bean/SmapsStruct.js';
52import { CpuFreqRowLimit } from '../component/chart/SpFreqChart.js';
53import { CpuFreqLimitsStruct } from './ui-worker/ProcedureWorkerCpuFreqLimits.js';
54import { CpuStruct } from './ui-worker/ProcedureWorkerCPU.js';
55import { CpuFreqStruct } from './ui-worker/ProcedureWorkerFreq.js';
56import { ThreadStruct } from './ui-worker/ProcedureWorkerThread.js';
57import { FuncStruct } from './ui-worker/ProcedureWorkerFunc.js';
58import { ProcessMemStruct } from './ui-worker/ProcedureWorkerMem.js';
59import { FpsStruct } from './ui-worker/ProcedureWorkerFPS.js';
60import { CpuAbilityMonitorStruct } from './ui-worker/ProcedureWorkerCpuAbility.js';
61import { MemoryAbilityMonitorStruct } from './ui-worker/ProcedureWorkerMemoryAbility.js';
62import { DiskAbilityMonitorStruct } from './ui-worker/ProcedureWorkerDiskIoAbility.js';
63import { NetworkAbilityMonitorStruct } from './ui-worker/ProcedureWorkerNetworkAbility.js';
64import { EnergyAnomalyStruct } from './ui-worker/ProcedureWorkerEnergyAnomaly.js';
65import { EnergyStateStruct } from './ui-worker/ProcedureWorkerEnergyState.js';
66import { CounterStruct } from './ui-worker/ProduceWorkerSdkCounter.js';
67import { SdkSliceStruct } from './ui-worker/ProduceWorkerSdkSlice.js';
68import { SystemDetailsEnergy } from '../bean/EnergyStruct.js';
69import { ClockStruct } from './ui-worker/ProcedureWorkerClock.js';
70import { IrqStruct } from './ui-worker/ProcedureWorkerIrq.js';
71import {
72  HeapEdge,
73  HeapLocation,
74  HeapNode,
75  HeapSample,
76  HeapTraceFunctionInfo,
77} from '../../js-heap/model/DatabaseStruct';
78import { FileInfo } from '../../js-heap/model/UiStruct.js';
79import { AppStartupStruct } from './ui-worker/ProcedureWorkerAppStartup.js';
80import { SoStruct } from './ui-worker/ProcedureWorkerSoInit.js';
81import { HeapTreeDataBean } from './logic-worker/ProcedureLogicWorkerCommon.js';
82import { TaskTabStruct } from '../component/trace/sheet/task/TabPaneTaskFrames.js';
83
84class DataWorkerThread extends Worker {
85  taskMap: any = {};
86
87  uuid(): string {
88    // @ts-ignore
89    return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c: any) =>
90      (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)
91    );
92  }
93
94  //发送方法名 参数 回调
95  queryFunc(action: string, args: any, handler: Function) {
96    let id = this.uuid();
97    this.taskMap[id] = handler;
98    let msg = {
99      id: id,
100      action: action,
101      args: args,
102    };
103    this.postMessage(msg);
104  }
105}
106
107class DbThread extends Worker {
108  busy: boolean = false;
109  isCancelled: boolean = false;
110  id: number = -1;
111  taskMap: any = {};
112  cacheArray: Array<any> = [];
113
114  uuid(): string {
115    // @ts-ignore
116    return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c: any) =>
117      (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)
118    );
119  }
120
121  queryFunc(name: string, sql: string, args: any, handler: Function, action: string | null) {
122    this.busy = true;
123    let id = this.uuid();
124    this.taskMap[id] = handler;
125    let msg = {
126      id: id,
127      name: name,
128      action: action || 'exec',
129      sql: sql,
130      params: args,
131    };
132    this.postMessage(msg);
133  }
134
135  dbOpen = async (
136    sdkWasmConfig?: string
137  ): Promise<{
138    status: boolean;
139    msg: string;
140    buffer: ArrayBuffer;
141    sdkConfigMap: any;
142  }> => {
143    return new Promise<any>((resolve, reject) => {
144      let id = this.uuid();
145      this.taskMap[id] = (res: any) => {
146        if (res.init) {
147          resolve({
148            status: res.init,
149            msg: res.msg,
150            sdkConfigMap: res.configSqlMap,
151            buffer: res.buffer,
152          });
153        } else {
154          resolve({ status: res.init, msg: res.msg });
155        }
156      };
157      this.postMessage(
158        {
159          id: id,
160          action: 'open',
161          wasmConfig: sdkWasmConfig,
162          buffer: DbPool.sharedBuffer! /*Optional. An ArrayBuffer representing an SQLite Database file*/,
163        },
164        [DbPool.sharedBuffer!]
165      );
166    });
167  };
168
169  resetWASM() {
170    this.postMessage({
171      id: this.uuid(),
172      action: 'reset',
173    });
174  }
175}
176
177export class DbPool {
178  static sharedBuffer: ArrayBuffer | null = null;
179  maxThreadNumber: number = 0;
180  works: Array<DbThread> = [];
181  progress: Function | undefined | null;
182  num = Math.floor(Math.random() * 10 + 1) + 20;
183  cutDownTimer: any | undefined;
184  dataWorker: DataWorkerThread | undefined | null;
185  currentWasmThread: DbThread | undefined = undefined;
186
187  init = async (type: string, threadBuild: (() => DbThread) | undefined = undefined) => {
188    // wasm | server | sqlite
189    if (this.currentWasmThread) {
190      this.currentWasmThread.resetWASM();
191      this.currentWasmThread = undefined;
192    }
193    await this.close();
194    const { port1, port2 } = new MessageChannel();
195    if (type === 'wasm') {
196      this.maxThreadNumber = 1;
197    } else if (type === 'server') {
198      this.maxThreadNumber = 1;
199    } else if (type === 'sqlite') {
200      this.maxThreadNumber = 1;
201    } else if (type === 'duck') {
202      this.maxThreadNumber = 1;
203    }
204    for (let i = 0; i < this.maxThreadNumber; i++) {
205      let thread: DbThread | undefined;
206      if (threadBuild) {
207        thread = threadBuild();
208      } else {
209        if (type === 'wasm') {
210          thread = new DbThread('trace/database/TraceWorker.js');
211        } else if (type === 'server') {
212          thread = new DbThread('trace/database/SqlLiteWorker.js');
213        } else if (type === 'sqlite') {
214          thread = new DbThread('trace/database/SqlLiteWorker.js');
215        }
216      }
217      if (thread) {
218        this.currentWasmThread = thread;
219        thread!.onmessage = (event: MessageEvent) => {
220          thread!.busy = false;
221          if (Reflect.has(thread!.taskMap, event.data.id)) {
222            if (event.data.results) {
223              let fun = thread!.taskMap[event.data.id];
224              if (fun) {
225                fun(event.data.results);
226              }
227              Reflect.deleteProperty(thread!.taskMap, event.data.id);
228            } else if (Reflect.has(event.data, 'ready')) {
229              this.progress!('database opened', this.num + event.data.index);
230              this.progressTimer(this.num + event.data.index, this.progress!);
231            } else if (Reflect.has(event.data, 'init')) {
232              if (this.cutDownTimer != undefined) {
233                clearInterval(this.cutDownTimer);
234              }
235              let fun = thread!.taskMap[event.data.id];
236              if (!event.data.init && !event.data.status) {
237                if (fun) {
238                  fun(['error', event.data.msg]);
239                }
240              } else {
241                this.progress!('database ready', 40);
242                if (fun) {
243                  fun(event.data);
244                }
245              }
246              Reflect.deleteProperty(thread!.taskMap, event.data.id);
247            } else {
248              let fun = thread!.taskMap[event.data.id];
249              if (fun) {
250                fun([]);
251              }
252              Reflect.deleteProperty(thread!.taskMap, event.data.id);
253            }
254          }
255        };
256        thread!.onmessageerror = (e) => {};
257        thread!.onerror = (e) => {};
258        thread!.id = i;
259        thread!.busy = false;
260        this.works?.push(thread!);
261      }
262    }
263  };
264
265  initServer = async (url: string, progress: Function) => {
266    this.progress = progress;
267    progress('database loaded', 15);
268    DbPool.sharedBuffer = await fetch(url).then((res) => res.arrayBuffer());
269    progress('open database', 20);
270    for (let i = 0; i < this.works.length; i++) {
271      let thread = this.works[i];
272      let { status, msg } = await thread.dbOpen();
273      if (!status) {
274        DbPool.sharedBuffer = null;
275        return { status, msg };
276      }
277    }
278    return { status: true, msg: 'ok' };
279  };
280  initSqlite = async (buf: ArrayBuffer, sdkWasmConfig: string, progress: Function) => {
281    this.progress = progress;
282    progress('database loaded', 15);
283    DbPool.sharedBuffer = buf;
284    progress('parse database', 20);
285    let configMap;
286    for (let i = 0; i < this.works.length; i++) {
287      let thread = this.works[i];
288      let { status, msg, buffer, sdkConfigMap } = await thread.dbOpen(sdkWasmConfig);
289      if (!status) {
290        DbPool.sharedBuffer = null;
291        return { status, msg };
292      } else {
293        configMap = sdkConfigMap;
294        DbPool.sharedBuffer = buffer;
295      }
296    }
297    return { status: true, msg: 'ok', sdkConfigMap: configMap };
298  };
299
300  close = async () => {
301    clearInterval(this.cutDownTimer);
302    for (let i = 0; i < this.works.length; i++) {
303      let thread = this.works[i];
304      thread.terminate();
305    }
306    this.works.length = 0;
307  };
308
309  submit(name: string, sql: string, args: any, handler: Function, action: string | null) {
310    let noBusyThreads = this.works.filter((it) => !it.busy);
311    let thread: DbThread;
312    if (noBusyThreads.length > 0) {
313      //取第一个空闲的线程进行任务
314      thread = noBusyThreads[0];
315      thread.queryFunc(name, sql, args, handler, action);
316    } else {
317      // 随机插入一个线程中
318      thread = this.works[Math.floor(Math.random() * this.works.length)];
319      thread.queryFunc(name, sql, args, handler, action);
320    }
321  }
322
323  //new method replace submit() method
324  submitTask(action: string, args: any, handler: Function) {
325    this.dataWorker?.queryFunc(action, args, handler);
326  }
327
328  progressTimer(num: number, progress: Function) {
329    let currentNum = num;
330    clearInterval(this.cutDownTimer);
331    this.cutDownTimer = setInterval(() => {
332      currentNum += Math.floor(Math.random() * 3);
333      if (currentNum >= 50) {
334        progress('database opened', 40);
335        clearInterval(this.cutDownTimer);
336      } else {
337        progress('database opened', currentNum);
338      }
339    }, Math.floor(Math.random() * 2500 + 1000));
340  }
341}
342
343export const threadPool = new DbPool();
344
345export function query<T extends any>(
346  name: string,
347  sql: string,
348  args: any = null,
349  action: string | null = null
350): Promise<Array<T>> {
351  return new Promise<Array<T>>((resolve, reject) => {
352    threadPool.submit(
353      name,
354      sql,
355      args,
356      (res: any) => {
357        if (res[0] && res[0] === 'error') {
358          window.publish(window.SmartEvent.UI.Error, res[1]);
359          reject(res);
360        } else {
361          resolve(res);
362        }
363      },
364      action
365    );
366  });
367}
368
369export const queryEventCountMap = (): Promise<
370  Array<{
371    eventName: string;
372    count: number;
373  }>
374> => query('queryEventCountMap', `select event_name as eventName,count from stat where stat_type = 'received';`);
375
376export const queryProcess = (): Promise<
377  Array<{
378    pid: number | null;
379    processName: string | null;
380  }>
381> =>
382  query(
383    'queryProcess',
384    `
385    SELECT
386      pid, processName
387    FROM
388      temp_query_process where pid != 0`
389  );
390
391export const queryProcessByTable = (): Promise<
392  Array<{
393    pid: number | null;
394    processName: string | null;
395  }>
396> =>
397  query(
398    'queryProcessByTable',
399    `
400    SELECT
401      pid, name as processName
402    FROM
403      process where pid != 0`
404  );
405
406export const queryProcessAsyncFunc = (_funName?: string): Promise<Array<any>> =>
407  query(
408    'queryProcessAsyncFunc',
409    `
410select tid,
411    P.pid,
412    A.name as threadName,
413    is_main_thread,
414    c.callid as track_id,
415    c.ts-D.start_ts as startTs,
416    c.dur,
417    c.name as funName,
418    c.parent_id,
419    c.id,
420    c.cookie,
421    c.depth,
422    c.argsetid
423from thread A,trace_range D
424left join callstack C on A.id = C.callid
425left join process P on P.id = A.ipid
426where startTs not null and cookie not null ${_funName ? 'funName=$funName' : ''};`,
427    {
428      funName: _funName,
429    }
430  );
431
432export const queryTotalTime = (): Promise<Array<{ total: number; recordStartNS: number; recordEndNS: number }>> =>
433  query(
434    'queryTotalTime',
435    `
436    select
437      start_ts as recordStartNS,end_ts as recordEndNS,end_ts-start_ts as total
438    from
439      trace_range;`
440  );
441
442export const getAsyncEvents = (): Promise<Array<any>> =>
443  query(
444    'getAsyncEvents',
445    `
446    select
447      *,
448      p.pid as pid,
449      c.ts - t.start_ts as "startTime"
450    from
451      callstack c,trace_range t
452    left join
453      process p
454    on
455      c.callid = p.id
456    where
457      cookie is not null;`
458  );
459
460export const getCpuUtilizationRate = (
461  startNS: number,
462  endNS: number
463): Promise<
464  Array<{
465    cpu: number;
466    ro: number;
467    rate: number;
468  }>
469> =>
470  query(
471    'getCpuUtilizationRate',
472    `
473    with cpu as (
474    select
475      cpu,
476      ts,
477      dur,
478      (case when ro < 99 then ro else 99 end) as ro ,
479      (case when ro < 99 then stime+ro*cell else stime + 99 * cell end) as st,
480      (case when ro < 99 then stime + (ro+1)*cell else etime end) as et
481    from (
482        select
483          cpu,
484          ts,
485          A.dur,
486          ((ts+A.dur)-D.start_ts)/((D.end_ts-D.start_ts)/100) as ro,
487          D.start_ts as stime,
488          D.end_ts etime,
489          (D.end_ts-D.start_ts)/100 as cell
490        from
491          sched_slice A
492        left join
493          trace_range D
494        left join
495          thread B on A.itid = B.id
496        where
497          tid != 0
498        and (A.ts)
499          between D.start_ts and D.end_ts))
500    select cpu,ro,
501       sum(case
502               when ts <= st and ts + dur <= et then (ts + dur - st)
503               when ts <= st and ts + dur > et then et-st
504               when ts > st and ts + dur <= et then dur
505               when ts > st and ts + dur > et then et - ts end)/cast(et-st as float) as rate
506    from cpu
507    group by cpu,ro;`,
508    {}
509  );
510
511export const getFps = () =>
512  query<FpsStruct>(
513    'getFps',
514    `
515    select
516      distinct(ts-tb.start_ts) as startNS, fps
517    from
518      hidump c ,trace_range tb
519    where
520      startNS >= 0
521    --order by startNS;
522    `,
523    {}
524  );
525
526export const getFunDataByTid = (tid: number, ipid: number): Promise<Array<FuncStruct>> =>
527  query(
528    'getFunDataByTid',
529    `
530    select
531    c.ts-D.start_ts as startTs,
532    c.dur,
533    c.name as funName,
534    c.argsetid,
535    c.depth,
536    c.id as id
537from thread A,trace_range D
538left join callstack C on A.id = C.callid
539where startTs not null and c.cookie is null and tid = $tid and A.ipid = $ipid`,
540    { $tid: tid, $ipid: ipid }
541  );
542
543export const getMaxDepthByTid = (): Promise<Array<any>> =>
544  query(
545    'getMaxDepthByTid',
546    `
547    select
548tid,
549ipid,
550    MAX(c.depth + 1) as maxDepth
551from thread A
552left join callstack C on A.id = C.callid
553where c.ts not null and c.cookie is null group by tid,ipid`,
554    {}
555  );
556
557export const getStatesProcessThreadDataByRange = (leftNs: number, rightNs: number): Promise<Array<SPT>> =>
558  query<SPT>(
559    'getStatesProcessThreadDataByRange',
560    `
561    select
562      IP.name as process,
563      IP.pid as processId,
564      A.name as thread,
565      B.state as state,
566      A.tid as threadId,
567      B.dur,
568      (B.ts - TR.start_ts + B.dur) as end_ts,
569      (B.ts - TR.start_ts) as start_ts,
570      B.cpu
571    from
572      thread_state as B
573    left join thread as A on B.itid = A.id
574    left join process as IP on A.ipid = IP.id
575    left join trace_range as TR
576    where B.dur > 0
577    and IP.pid not null
578    and (B.ts - TR.start_ts) >= $leftNs
579    and (B.ts - TR.start_ts + B.dur) <= $rightNs
580`,
581    { $leftNs: leftNs, $rightNs: rightNs }
582  );
583
584export const getTabBoxChildData = (
585  leftNs: number,
586  rightNs: number,
587  state: string | undefined,
588  processId: number | undefined,
589  threadId: number | undefined
590): Promise<Array<SPTChild>> =>
591  query<SPTChild>(
592    'getTabBoxChildData',
593    `
594    select
595      IP.name as process,
596      IP.pid as processId,
597      A.name as thread,
598      B.state as state,
599      A.tid as threadId,
600      B.dur as duration,
601      B.ts - TR.start_ts as startNs,
602      B.cpu,
603      C.priority
604    from
605      thread_state AS B
606    left join
607      thread as A
608    on
609      B.itid = A.id
610    left join
611      process AS IP
612    on
613      A.ipid = IP.id
614    left join
615      trace_range AS TR
616    left join
617      sched_slice as C
618    on
619      B.itid = C.itid
620    and
621      C.ts = B.ts
622    where
623      B.dur > 0
624    and
625      IP.pid not null
626    and
627      not ((B.ts - TR.start_ts + B.dur < $leftNS) or (B.ts - TR.start_ts > $rightNS))
628      ${state != undefined && state != '' ? 'and B.state = $state' : ''}
629      ${processId != undefined && processId != -1 ? 'and IP.pid = $processID' : ''}
630      ${threadId != undefined && threadId != -1 ? 'and A.tid = $threadID' : ''}
631    `,
632    {
633      $leftNS: leftNs,
634      $rightNS: rightNs,
635      $state: state,
636      $processID: processId,
637      $threadID: threadId,
638    }
639  );
640
641export const getTabCpuUsage = (cpus: Array<number>, leftNs: number, rightNs: number): Promise<Array<CpuUsage>> =>
642  query<CpuUsage>(
643    'getTabCpuUsage',
644    `
645    select
646      cpu,
647      sum(case
648        when (A.ts - B.start_ts) < $leftNS
649          then (A.ts - B.start_ts + A.dur - $leftNS)
650        when (A.ts - B.start_ts) >= $leftNS
651          and (A.ts - B.start_ts + A.dur) <= $rightNS
652          then A.dur
653        when (A.ts - B.start_ts + A.dur) > $rightNS
654          then ($rightNS - (A.ts - B.start_ts)) end) / cast($rightNS - $leftNS as float) as usage
655    from
656      thread_state A,
657      trace_range B
658    where
659      (A.ts - B.start_ts) > 0 and A.dur > 0
660    and
661      cpu in (${cpus.join(',')})
662    and
663      (A.ts - B.start_ts + A.dur) > $leftNS
664    and
665      (A.ts - B.start_ts) < $rightNS
666    group by
667      cpu`,
668    { $leftNS: leftNs, $rightNS: rightNs }
669  );
670
671export const getTabCpuFreq = (cpus: Array<number>, leftNs: number, rightNs: number): Promise<Array<Freq>> =>
672  query<Freq>(
673    'getTabCpuFreq',
674    `
675    select
676      cpu,
677      value,
678      (ts - tr.start_ts) as startNs
679    from
680      measure m,
681      trace_range tr
682    inner join
683      cpu_measure_filter t
684    on
685      m.filter_id = t.id
686    where
687      (name = 'cpufreq' or name='cpu_frequency')
688    and
689      cpu in (${cpus.join(',')})
690    and
691      startNs > 0
692    and
693      startNs < $rightNS
694    --order by startNs
695    `,
696    { $leftNS: leftNs, $rightNS: rightNs }
697  );
698
699export const getTabFps = (leftNs: number, rightNs: number): Promise<Array<Fps>> =>
700  query<Fps>(
701    'getTabFps',
702    `
703    select
704      distinct(ts-tb.start_ts) as startNS,
705      fps
706    from
707      hidump c,
708      trace_range tb
709    where
710      startNS <= $rightNS
711    and
712      startNS >= 0
713    --order by startNS;
714    `,
715    { $leftNS: leftNs, $rightNS: rightNs }
716  );
717
718export const getTabCounters = (processFilterIds: Array<number>, virtualFilterIds: Array<number>, startTime: number) =>
719  query<Counter>(
720    'getTabCounters',
721    `
722    select
723      t1.filter_id as trackId,
724      t2.name,
725      value,
726      t1.ts - t3.start_ts as startTime
727    from
728      process_measure t1
729    left join
730      process_measure_filter t2
731    on
732      t1.filter_id = t2.id
733    left join
734      trace_range t3
735    where
736      filter_id in (${processFilterIds.join(',')})
737    and
738      startTime <= $startTime
739union
740 select
741      t1.filter_id as trackId,
742      t2.name,
743      value,
744      t1.ts - t3.start_ts as startTime
745    from
746      sys_mem_measure t1
747    left join
748      sys_event_filter t2
749    on
750      t1.filter_id = t2.id
751    left join
752      trace_range t3
753    where
754      filter_id in (${virtualFilterIds.join(',')})
755    and
756      startTime <= $startTime
757    `,
758    { $startTime: startTime }
759  );
760
761export const getTabVirtualCounters = (virtualFilterIds: Array<number>, startTime: number) =>
762  query<Counter>(
763    'getTabVirtualCounters',
764    `
765    select
766      table1.filter_id as trackId,
767      table2.name,
768      value,
769      table1.ts - table3.start_ts as startTime
770    from
771      sys_mem_measure table1
772    left join
773      sys_event_filter table2
774    on
775      table1.filter_id = table2.id
776    left join
777      trace_range table3
778    where
779      filter_id in (${virtualFilterIds.join(',')})
780    and
781      startTime <= $startTime
782    `,
783    { $startTime: startTime }
784  );
785
786export const getTabCpuByProcess = (cpus: Array<number>, leftNS: number, rightNS: number) =>
787  query<any>(
788    'getTabCpuByProcess',
789    `
790    select
791      B.pid as pid,
792      sum(B.dur) as wallDuration,
793      avg(B.dur) as avgDuration,
794      count(B.tid) as occurrences
795    from
796      thread_state AS B
797    left join
798      trace_range AS TR
799    where
800      B.cpu in (${cpus.join(',')})
801    and
802      not ((B.ts - TR.start_ts + B.dur < $leftNS) or (B.ts - TR.start_ts > $rightNS ))
803    group by
804      B.pid
805    order by
806      wallDuration desc;`,
807    { $rightNS: rightNS, $leftNS: leftNS }
808  );
809
810export const getTabCpuByThread = (cpus: Array<number>, leftNS: number, rightNS: number) =>
811  query<any>(
812    'getTabCpuByThread',
813    `
814    select
815      TS.pid as pid,
816      TS.tid as tid,
817      TS.cpu,
818      sum( min(${rightNS},(TS.ts - TR.start_ts + TS.dur)) - max(${leftNS},TS.ts - TR.start_ts)) wallDuration,
819      count(TS.tid) as occurrences
820    from
821      thread_state AS TS
822    left join
823      trace_range AS TR
824    where
825      TS.cpu in (${cpus.join(',')})
826    and
827      not ((TS.ts - TR.start_ts + TS.dur < $leftNS) or (TS.ts - TR.start_ts > $rightNS))
828    group by
829      TS.cpu,
830      TS.pid,
831      TS.tid
832    order by
833      wallDuration desc;`,
834    { $rightNS: rightNS, $leftNS: leftNS }
835  );
836
837export const getTabSlices = (
838  funTids: Array<number>,
839  pids: Array<number>,
840  leftNS: number,
841  rightNS: number
842): Promise<Array<any>> =>
843  query<SelectionData>(
844    'getTabSlices',
845    `
846    select
847      c.name as name,
848      sum(c.dur) as wallDuration,
849      avg(c.dur) as avgDuration,
850      count(c.name) as occurrences
851    from
852      thread T, trace_range TR
853      left join process P on T.ipid = P.id
854    left join
855      callstack C
856    on
857      T.id = C.callid
858    where
859      C.ts not null
860    and
861      c.dur >= 0
862    and
863      T.tid in (${funTids.join(',')})
864    and
865      P.pid in (${pids.join(',')})
866    and
867      c.name != 'binder transaction async'
868    and
869      c.name != 'binder async rcv'
870    and
871      c.cookie is null
872    and
873      not ((C.ts - TR.start_ts + C.dur < $leftNS) or (C.ts - TR.start_ts > $rightNS))
874    group by
875      c.name
876    order by
877      wallDuration desc;`,
878    { $leftNS: leftNS, $rightNS: rightNS }
879  );
880
881export const getTabSlicesAsyncFunc = (
882  asyncNames: Array<string>,
883  asyncPid: Array<number>,
884  leftNS: number,
885  rightNS: number
886): Promise<Array<any>> =>
887  query<SelectionData>(
888    'getTabSlicesAsyncFunc',
889    `
890    select
891      c.name as name,
892      sum(c.dur) as wallDuration,
893      avg(c.dur) as avgDuration,
894      count(c.name) as occurrences
895    from
896      thread A, trace_range D
897    left join
898      callstack C
899    on
900      A.id = C.callid
901    left join process P on P.id = A.ipid
902    where
903      C.ts not null
904    and
905      c.dur >= -1
906    and
907      c.cookie not null
908    and
909      P.pid in (${asyncPid.join(',')})
910    and
911      c.name in (${asyncNames.map((it) => "'" + it + "'").join(',')})
912    and
913      not ((C.ts - D.start_ts + C.dur < $leftNS) or (C.ts - D.start_ts > $rightNS))
914    group by
915      c.name
916    order by
917      wallDuration desc;`,
918    { $leftNS: leftNS, $rightNS: rightNS }
919  );
920
921export const getTabThreadStates = (tIds: Array<number>, leftNS: number, rightNS: number): Promise<Array<any>> =>
922  query<SelectionData>(
923    'getTabThreadStates',
924    `
925    select
926      B.pid,
927      B.tid,
928      B.state,
929      sum(B.dur) as wallDuration,
930      avg(ifnull(B.dur,0)) as avgDuration,
931      count(B.tid) as occurrences
932    from
933      thread_state AS B
934    left join
935      trace_range AS TR
936    where
937      B.tid in (${tIds.join(',')})
938    and
939      not ((B.ts - TR.start_ts + ifnull(B.dur,0) < $leftNS) or (B.ts - TR.start_ts > $rightNS))
940    group by
941      B.pid, B.tid, B.state
942    order by
943      wallDuration desc;`,
944    { $leftNS: leftNS, $rightNS: rightNS }
945  );
946
947export const getTabThreadStatesCpu = (tIds: Array<number>, leftNS: number, rightNS: number): Promise<Array<any>> => {
948  let sql = `
949select
950       B.pid,
951       B.tid,
952       B.cpu,
953       sum( min(${rightNS},(B.ts - TR.start_ts + B.dur)) - max(${leftNS},B.ts - TR.start_ts)) wallDuration
954from thread_state as B
955left join trace_range as TR
956where cpu notnull
957    and B.tid in (${tIds.join(',')})
958    and not ((B.ts - TR.start_ts + ifnull(B.dur,0) < ${leftNS}) or (B.ts - TR.start_ts > ${rightNS}))
959group by B.tid, B.pid, B.cpu;`;
960  return query<SelectionData>('getTabThreadStatesCpu', sql, {
961    $leftNS: leftNS,
962    $rightNS: rightNS,
963  });
964};
965
966export const getTabStartups = (ids: Array<number>, leftNS: number, rightNS: number): Promise<Array<any>> => {
967  let sql = `
968select
969    P.pid,
970    P.name as process,
971    (A.start_time - B.start_ts) as startTs,
972    (case when A.end_time = -1 then 0 else (A.end_time - A.start_time) end) as dur,
973    A.start_name as startName
974from app_startup A,trace_range B
975left join process P on A.ipid = P.ipid
976where P.pid in (${ids.join(',')})
977and not ((startTs + dur < ${leftNS}) or (startTs > ${rightNS}))
978order by start_name;`;
979  return query('getTabStartups', sql, {});
980};
981
982export const getTabStaticInit = (ids: Array<number>, leftNS: number, rightNS: number): Promise<Array<any>> => {
983  let sql = `
984select
985    P.pid,
986    P.name as process,
987    (A.start_time - B.start_ts) as startTs,
988    (case when A.end_time = -1 then 0 else (A.end_time - A.start_time) end) as dur,
989    A.so_name as soName
990from static_initalize A,trace_range B
991left join process P on A.ipid = P.ipid
992where P.pid in (${ids.join(',')})
993and not ((startTs + dur < ${leftNS}) or (startTs > ${rightNS}))
994order by dur desc;`;
995  return query('getTabStaticInit', sql, {});
996};
997
998export const queryBinderArgsByArgset = (argset: number): Promise<Array<BinderArgBean>> =>
999  query(
1000    'queryBinderArgsByArgset',
1001    `
1002    select
1003      *
1004    from
1005      args_view
1006    where
1007      argset = $argset;`,
1008    { $argset: argset }
1009  );
1010
1011export const queryCpuData = (cpu: number, startNS: number, endNS: number): Promise<Array<CpuStruct>> =>
1012  query(
1013    'queryCpuData',
1014    `
1015    SELECT
1016    B.pid as processId,
1017    B.cpu,
1018    B.tid,
1019    B.itid as id,
1020    B.dur,
1021    B.ts - TR.start_ts AS startTime,
1022    B.arg_setid as argSetID
1023from thread_state AS B
1024    left join trace_range AS TR
1025where B.itid is not null
1026    and
1027      B.cpu = $cpu
1028    and
1029      startTime between $startNS and $endNS;`,
1030    {
1031      $cpu: cpu,
1032      $startNS: startNS,
1033      $endNS: endNS,
1034    }
1035  );
1036
1037export const queryCpuFreq = (): Promise<Array<{ cpu: number; filterId: number }>> =>
1038  query(
1039    'queryCpuFreq',
1040    `
1041    select
1042      cpu,id as filterId
1043    from
1044      cpu_measure_filter
1045    where
1046      (name='cpufreq' or name='cpu_frequency')
1047    order by cpu;
1048    `
1049  );
1050
1051export const queryCpuFreqData = (cpu: number): Promise<Array<CpuFreqStruct>> =>
1052  query<CpuFreqStruct>(
1053    'queryCpuFreqData',
1054    `
1055    select
1056      cpu,
1057      value,
1058      ifnull(dur,tb.end_ts - c.ts) dur,
1059      ts-tb.start_ts as startNS
1060    from
1061      measure c,
1062      trace_range tb
1063    inner join
1064      cpu_measure_filter t
1065    on
1066      c.filter_id = t.id
1067    where
1068      (name = 'cpufreq' or name='cpu_frequency')
1069    and
1070      cpu= $cpu
1071    --order by ts;
1072    `,
1073    { $cpu: cpu }
1074  );
1075
1076export const queryCpuMax = (): Promise<Array<any>> =>
1077  query(
1078    'queryCpuMax',
1079    `
1080    select
1081      cpu
1082    from
1083      sched_slice
1084    order by
1085      cpu
1086    desc limit 1;`
1087  );
1088
1089export const queryCpuDataCount = () =>
1090  query('queryCpuDataCount', 'select count(1) as count,cpu from thread_state where cpu not null group by cpu');
1091
1092export const queryCpuCount = (): Promise<Array<any>> =>
1093  query(
1094    'queryCpuCount',
1095    `
1096   select max(cpuCount) cpuCount from
1097(select ifnull((max(cpu) + 1),0) cpuCount  from cpu_measure_filter where name in ('cpu_frequency','cpu_idle')
1098 union all
1099 select ifnull((max(callid)+1),0) cpuCount from irq
1100) A;`
1101  );
1102
1103export const queryCpuSchedSlice = (): Promise<Array<any>> =>
1104  query(
1105    'queryCpuSchedSlice',
1106    `
1107   select (ts - start_ts) as ts,
1108       itid,
1109       end_state as endState,
1110       priority
1111   from sched_slice,trace_range;`
1112  );
1113
1114export const queryCpuStateFilter = (): Promise<Array<any>> =>
1115  query(
1116    'queryCpuStateFilter',
1117    `select cpu,id as filterId from cpu_measure_filter where name = 'cpu_idle' order by cpu;`,
1118    {}
1119  );
1120
1121export const queryCpuState = (cpuFilterId: number): Promise<Array<any>> =>
1122  query(
1123    'queryCpuState',
1124    `
1125        select (A.ts - B.start_ts) as startTs,ifnull(dur,B.end_ts - A.ts) dur,
1126            value
1127        from measure A,trace_range B
1128        where filter_id = $filterId;`,
1129    { $filterId: cpuFilterId }
1130  );
1131
1132export const queryCpuMaxFreq = (): Promise<Array<any>> =>
1133  query(
1134    'queryCpuMaxFreq',
1135    `
1136    select
1137      max(value) as maxFreq
1138    from
1139      measure c
1140    inner join
1141      cpu_measure_filter t
1142    on
1143      c.filter_id = t.id
1144    where
1145      (name = 'cpufreq' or name='cpu_frequency');`
1146  );
1147
1148export const queryProcessData = (pid: number, startNS: number, endNS: number): Promise<Array<any>> =>
1149  query(
1150    'queryProcessData',
1151    `
1152    select  ta.cpu,
1153        dur,
1154        ts-${(window as any).recordStartNS} as startTime
1155from thread_state ta
1156where ta.cpu is not null and pid=$pid and startTime between $startNS and $endNS;`,
1157    {
1158      $pid: pid,
1159      $startNS: startNS,
1160      $endNS: endNS,
1161    }
1162  );
1163
1164export const queryProcessMem = (): Promise<Array<any>> =>
1165  query(
1166    'queryProcessMem',
1167    `
1168    select
1169      process_measure_filter.id as trackId,
1170      process_measure_filter.name as trackName,
1171      ipid as upid,
1172      process.pid,
1173      process.name as processName
1174    from
1175      process_measure_filter
1176    join
1177      process using (ipid)
1178    order by trackName;`
1179  );
1180
1181export const queryProcessThreadDataCount = (): Promise<Array<any>> =>
1182  query(
1183    `queryProcessThreadDataCount`,
1184    `select pid,count(id) as count
1185    from thread_state
1186    where ts between ${(window as any).recordStartNS} and ${(window as any).recordEndNS} group by pid;`,
1187    {}
1188  );
1189
1190export const queryProcessFuncDataCount = (): Promise<Array<any>> =>
1191  query(
1192    `queryProcessFuncDataCount`,
1193    `select
1194        P.pid,
1195        count(tid) as count
1196    from callstack C
1197    left join thread A on A.id = C.callid
1198    left join process AS P on P.id = A.ipid
1199    where  C.ts between ${(window as any).recordStartNS} and ${(window as any).recordEndNS}
1200    group by pid;`,
1201    {}
1202  );
1203
1204export const queryProcessMemDataCount = (): Promise<Array<any>> =>
1205  query(
1206    `queryProcessMemDataCount`,
1207    `select
1208      p.pid as pid, count(value) count
1209    from process_measure c
1210    left join process_measure_filter f on f.id = c.filter_id
1211    left join process p on p.ipid = f.ipid
1212where f.id not NULL and value>0
1213 and c.ts between ${(window as any).recordStartNS} and ${(window as any).recordEndNS}
1214group by p.pid`,
1215    {}
1216  );
1217
1218export const queryProcessMemData = (trackId: number): Promise<Array<ProcessMemStruct>> =>
1219  query(
1220    'queryProcessMemData',
1221    `
1222    select
1223      c.type,
1224      ts,
1225      value,
1226      filter_id as track_id,
1227      c.ts-tb.start_ts startTime
1228    from
1229      process_measure c,
1230      trace_range tb
1231    where
1232      filter_id = $id;`,
1233    { $id: trackId }
1234  );
1235
1236export const queryThreads = (): Promise<Array<any>> =>
1237  query('queryThreads', `select id,tid,(ifnull(name,'Thread') || '(' || tid || ')') name from thread where id != 0;`);
1238
1239export const queryDataDICT = (): Promise<Array<any>> => query('queryDataDICT', `select * from data_dict;`);
1240export const queryProcessContentCount = (): Promise<Array<any>> =>
1241  query(`queryProcessContentCount`, `select pid,switch_count,thread_count,slice_count,mem_count from process;`);
1242export const queryProcessThreadsByTable = (): Promise<Array<ThreadStruct>> =>
1243  query(
1244    'queryProcessThreadsByTable',
1245    `
1246        select p.pid as pid,p.ipid as upid,t.tid as tid,p.name as processName,t.name as threadName from thread t left join process  p on t.ipid = p.id where t.tid != 0;
1247    `
1248  );
1249export const queryVirtualMemory = (): Promise<Array<any>> =>
1250  query('queryVirtualMemory', `select id,name from sys_event_filter where type='sys_virtual_memory_filter'`);
1251export const queryVirtualMemoryData = (filterId: number): Promise<Array<any>> =>
1252  query(
1253    'queryVirtualMemoryData',
1254    `select ts-${
1255      (window as any).recordStartNS
1256    } as startTime,value,filter_id as filterID from sys_mem_measure where filter_id=$filter_id`,
1257    { $filter_id: filterId }
1258  );
1259export const queryProcessThreads = (): Promise<Array<ThreadStruct>> =>
1260  query(
1261    'queryProcessThreads',
1262    `
1263    select
1264      the_tracks.ipid as upid,
1265      the_tracks.itid as utid,
1266      total_dur as hasSched,
1267      process.pid as pid,
1268      thread.tid as tid,
1269      process.name as processName,
1270      thread.name as threadName
1271    from (
1272      select ipid,itid from sched_slice group by itid
1273    ) the_tracks
1274    left join (select itid,sum(dur) as total_dur from thread_state where state != 'S' group by itid) using(itid)
1275    left join thread using(itid)
1276    left join process using(ipid)
1277    order by total_dur desc,the_tracks.ipid,the_tracks.itid;`,
1278    {}
1279  );
1280
1281export const queryThreadData = (tid: number, pid: number): Promise<Array<ThreadStruct>> =>
1282  query(
1283    'queryThreadData',
1284    `
1285    select
1286      B.itid as id
1287     , B.tid
1288     , B.cpu
1289     , B.ts - TR.start_ts AS startTime
1290     , B.dur
1291     , B.state
1292     , B.pid
1293     , B.arg_setid as argSetID
1294from thread_state AS B
1295    left join trace_range AS TR
1296where B.tid = $tid and B.pid = $pid;`,
1297    { $tid: tid, $pid: pid }
1298  );
1299
1300export const queryStartupPidArray = (): Promise<Array<{ pid: number }>> =>
1301  query(
1302    'queryStartupPidArray',
1303    `
1304    select distinct pid
1305from app_startup A,trace_range B left join process P on A.ipid = p.ipid
1306where A.start_time between B.start_ts and B.end_ts;`,
1307    {}
1308  );
1309
1310export const queryProcessStartup = (pid: number): Promise<Array<AppStartupStruct>> =>
1311  query(
1312    'queryProcessStartup',
1313    `
1314    select
1315    P.pid,
1316    A.tid,
1317    A.call_id as itid,
1318    (case when A.start_time < B.start_ts then 0 else (A.start_time - B.start_ts) end) as startTs,
1319    (case
1320        when A.start_time < B.start_ts then (A.end_time - B.start_ts)
1321        when A.end_time = -1 then 0
1322        else (A.end_time - A.start_time) end) as dur,
1323    A.start_name as startName
1324from app_startup A,trace_range B
1325left join process P on A.ipid = P.ipid
1326where P.pid = $pid
1327order by start_name;`,
1328    { $pid: pid }
1329  );
1330
1331export const queryProcessSoMaxDepth = (): Promise<Array<{ pid: number; maxDepth: number }>> =>
1332  query(
1333    'queryProcessSoMaxDepth',
1334    `select p.pid,max(depth) maxDepth
1335from static_initalize S,trace_range B left join process p on S.ipid = p.ipid
1336where S.start_time between B.start_ts and B.end_ts
1337group by p.pid;`,
1338    {}
1339  );
1340
1341export const queryProcessSoInitData = (pid: number): Promise<Array<SoStruct>> =>
1342  query(
1343    'queryProcessSoInitData',
1344    `
1345    select
1346    P.pid,
1347    T.tid,
1348    A.call_id as itid,
1349    (A.start_time - B.start_ts) as startTs,
1350    (A.end_time - A.start_time) as dur,
1351    A.so_name as soName,
1352    A.depth
1353from static_initalize A,trace_range B
1354left join process P on A.ipid = P.ipid
1355left join thread T on A.call_id = T.itid
1356where P.pid = $pid;`,
1357    { $pid: pid }
1358  );
1359
1360export const queryThreadAndProcessName = (): Promise<Array<any>> =>
1361  query(
1362    'queryThreadAndProcessName',
1363    `
1364    select tid id,name,'t' type from thread
1365union all
1366select pid id,name,'p' type from process;`,
1367    {}
1368  );
1369
1370export const queryThreadStateArgs = (argset: number): Promise<Array<BinderArgBean>> =>
1371  query('queryThreadStateArgs', ` select args_view.* from args_view where argset = ${argset}`, {});
1372
1373export const queryWakeUpThread_Desc = (): Promise<Array<any>> =>
1374  query(
1375    'queryWakeUpThread_Desc',
1376    `This is the interval from when the task became eligible to run
1377(e.g.because of notifying a wait queue it was a suspended on) to when it started running.`
1378  );
1379
1380export const queryCPUWakeUpIdFromBean = (tid: number | undefined): Promise<Array<WakeupBean>> => {
1381  let sql = `
1382select itid from thread where tid=${tid}
1383    `;
1384  return query('queryCPUWakeUpListFromBean', sql, {});
1385};
1386
1387export const queryThreadWakeUp = (itid: number, startTime: number, dur: number): Promise<Array<WakeupBean>> =>
1388  query(
1389    'queryThreadWakeUp',
1390    `
1391select TA.tid,min(TA.ts - TR.start_ts) as ts,TA.pid
1392from
1393  (select min(ts) as wakeTs,ref as itid from instant,trace_range
1394       where name = 'sched_wakeup'
1395       and wakeup_from = $itid
1396       and ts > start_ts + $startTime
1397       and ts < start_ts + $startTime + $dur
1398      group by ref
1399       ) TW
1400left join thread_state TA on TW.itid = TA.itid
1401left join trace_range TR
1402where TA.ts > TW.wakeTs
1403group by TA.tid,TA.pid;
1404    `,
1405    { $itid: itid, $startTime: startTime, $dur: dur }
1406  );
1407
1408export const queryRunnableTimeByRunning = (tid: number, startTime: number): Promise<Array<WakeupBean>> => {
1409  let sql = `
1410select ts from thread_state,trace_range where ts + dur -start_ts = ${startTime} and state = 'R' and tid=${tid} limit 1
1411    `;
1412  return query('queryRunnableTimeByRunning', sql, {});
1413};
1414
1415export const queryThreadWakeUpFrom = (itid: number, startTime: number): Promise<Array<WakeupBean>> => {
1416  let sql = `
1417select (A.ts - B.start_ts) as ts,
1418       A.tid,
1419       A.pid,
1420       A.cpu,
1421       A.dur
1422from thread_state A,trace_range B
1423where A.state = 'Running'
1424and A.itid = (select wakeup_from from instant where ts = ${startTime} and ref = ${itid} limit 1)
1425and (A.ts - B.start_ts) < (${startTime} - B.start_ts)
1426order by ts desc limit 1
1427    `;
1428  return query('queryThreadWakeUpFrom', sql, {});
1429};
1430/*-------------------------------------------------------------------------------------*/
1431
1432export const queryHeapGroupByEvent = (type: string): Promise<Array<NativeEventHeap>> => {
1433  let sql1 = `
1434        select
1435            event_type as eventType,
1436            sum(heap_size) as sumHeapSize
1437        from native_hook
1438        where event_type = 'AllocEvent' or event_type = 'MmapEvent'
1439        group by event_type
1440    `;
1441  let sql2 = `
1442        select (case when type = 0 then 'AllocEvent' else 'MmapEvent' end) eventType,
1443            sum(apply_size) sumHeapSize
1444        from native_hook_statistic
1445        group by eventType;
1446    `;
1447  return query('queryHeapGroupByEvent', type === 'native_hook' ? sql1 : sql2, {});
1448};
1449
1450export const queryAllHeapByEvent = (): Promise<Array<NativeEvent>> =>
1451  query(
1452    'queryAllHeapByEvent',
1453    `
1454    select * from (
1455      select h.start_ts - t.start_ts as startTime,
1456       h.heap_size as heapSize,
1457       h.event_type as eventType
1458from native_hook h ,trace_range t
1459where h.start_ts >= t.start_ts and h.start_ts <= t.end_ts
1460and (h.event_type = 'AllocEvent' or h.event_type = 'MmapEvent')
1461union
1462select h.end_ts - t.start_ts as startTime,
1463       h.heap_size as heapSize,
1464       (case when h.event_type = 'AllocEvent' then 'FreeEvent' else 'MunmapEvent' end) as eventType
1465from native_hook h ,trace_range t
1466where h.start_ts >= t.start_ts and h.start_ts <= t.end_ts
1467and (h.event_type = 'AllocEvent' or h.event_type = 'MmapEvent')
1468and h.end_ts not null ) order by startTime;
1469`,
1470    {}
1471  );
1472
1473export const queryHeapAllData = (
1474  startTs: number,
1475  endTs: number,
1476  ipids: Array<number>
1477): Promise<Array<HeapTreeDataBean>> =>
1478  query(
1479    'queryHeapAllData',
1480    `
1481    select
1482      h.start_ts - t.start_ts as startTs,
1483      h.end_ts - t.start_ts as endTs,
1484      h.heap_size as heapSize,
1485      h.event_type as eventType,
1486      h.callchain_id as eventId
1487    from
1488      native_hook h
1489    inner join
1490      trace_range  t
1491    where
1492      event_type = 'AllocEvent'
1493    and
1494      ipid in (${ipids.join(',')})
1495    and
1496      (h.start_ts - t.start_ts between ${startTs} and ${endTs} or h.end_ts - t.start_ts between ${startTs} and ${endTs})`,
1497    { ipids: ipids, $startTs: startTs, $endTs: endTs }
1498  );
1499
1500export const queryNativeHookStatistics = (leftNs: number, rightNs: number): Promise<Array<NativeHookMalloc>> =>
1501  query(
1502    'queryNativeHookStatistics',
1503    `
1504    select
1505      event_type as eventType,
1506      sub_type_id as subTypeId,
1507      max(heap_size) as max,
1508      sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then heap_size else 0 end) as allocByte,
1509      sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then 1 else 0 end) as allocCount,
1510      sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then heap_size else 0 end) as freeByte,
1511      sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then 1 else 0 end) as freeCount
1512    from
1513      native_hook A,
1514      trace_range B
1515    where
1516      (A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}
1517     and (event_type = 'AllocEvent' or event_type = 'MmapEvent')
1518    group by event_type;`,
1519    { $leftNs: leftNs, $rightNs: rightNs }
1520  );
1521
1522export const queryNativeHookStatisticsMalloc = (leftNs: number, rightNs: number): Promise<Array<NativeHookMalloc>> =>
1523  query(
1524    'queryNativeHookStatisticsMalloc',
1525    `
1526    select
1527      event_type as eventType,
1528      heap_size as heapSize,
1529      sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then heap_size else 0 end) as allocByte,
1530      sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then 1 else 0 end) as allocCount,
1531      sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then heap_size else 0 end) as freeByte,
1532      sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then 1 else 0 end) as freeCount
1533    from
1534      native_hook A,
1535      trace_range B
1536    where
1537      (A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}
1538    and
1539      (event_type = 'AllocEvent' or event_type = 'MmapEvent')
1540    and
1541      sub_type_id is null
1542    group by
1543      event_type,
1544      heap_size
1545    order by heap_size desc
1546    `,
1547    { $leftNs: leftNs, $rightNs: rightNs }
1548  );
1549
1550export const queryNativeHookStatisticsSubType = (leftNs: number, rightNs: number): Promise<Array<NativeHookMalloc>> =>
1551  query(
1552    'queryNativeHookStatisticsSubType',
1553    `
1554    select
1555      event_type as eventType,
1556      sub_type_id as subTypeId,
1557      max(heap_size) as max,
1558      sum(case when ((NH.start_ts - TR.start_ts) between ${leftNs} and ${rightNs}) then heap_size else 0 end) as allocByte,
1559      sum(case when ((NH.start_ts - TR.start_ts) between ${leftNs} and ${rightNs}) then 1 else 0 end) as allocCount,
1560      sum(case when ((NH.end_ts - TR.start_ts) between ${leftNs} and ${rightNs} ) then heap_size else 0 end) as freeByte,
1561      sum(case when ((NH.end_ts - TR.start_ts) between ${leftNs} and ${rightNs} ) then 1 else 0 end) as freeCount
1562    from
1563      native_hook NH,
1564      trace_range TR
1565    where
1566      (NH.start_ts - TR.start_ts) between ${leftNs} and ${rightNs}
1567    and
1568      (event_type = 'MmapEvent')
1569    group by
1570      event_type,sub_type_id;
1571        `,
1572    { $leftNs: leftNs, $rightNs: rightNs }
1573  );
1574
1575export const queryNativeHookSubType = (leftNs: number, rightNs: number): Promise<Array<any>> =>
1576  query(
1577    'queryNativeHookSubType',
1578    `select distinct sub_type_id as subTypeId, DD.data as subType
1579      from
1580        native_hook NH,
1581        trace_range TR
1582      left join data_dict DD on NH.sub_type_id = DD.id
1583      where
1584        NH.sub_type_id not null and
1585        (NH.start_ts - TR.start_ts) between ${leftNs} and ${rightNs}
1586        `,
1587    { $leftNs: leftNs, $rightNs: rightNs }
1588  );
1589
1590export const queryNativeHookStatisticSubType = (leftNs: number, rightNs: number): Promise<Array<any>> =>
1591  query(
1592    'queryNativeHookStatisticSubType',
1593    `SELECT DISTINCT type as subTypeId,
1594          CASE WHEN type = 2 THEN 'FILE_PAGE_MSG' WHEN type = 3 THEN 'MEMORY_USING_MSG' ELSE 'MmapEvent' END AS subType
1595        FROM
1596          native_hook_statistic NHS,
1597          trace_range TR
1598        WHERE
1599          NHS.type > 1 AND
1600          (NHS.ts - TR.start_ts) between ${leftNs} and ${rightNs}
1601      `,
1602    { $leftNs: leftNs, $rightNs: rightNs }
1603  );
1604
1605export const queryNativeHookEventTid = (
1606  leftNs: number,
1607  rightNs: number,
1608  types: Array<string>
1609): Promise<Array<NativeHookStatistics>> =>
1610  query(
1611    'queryNativeHookEventTid',
1612    `
1613    select
1614      callchain_id as eventId,
1615      event_type as eventType,
1616      heap_size as heapSize,
1617      addr,
1618      (A.start_ts - B.start_ts) as startTs,
1619      (A.end_ts - B.start_ts) as endTs,
1620      tid,
1621      sub_type_id as subTypeId,
1622      ifnull(last_lib_id,0) as lastLibId,
1623      t.name as threadName
1624    from
1625      native_hook A,
1626      trace_range B
1627    left join
1628      thread t
1629    on
1630      A.itid = t.id
1631    where
1632      A.start_ts - B.start_ts
1633    between ${leftNs} and ${rightNs} and A.event_type in (${types.join(',')})`,
1634    { $leftNs: leftNs, $rightNs: rightNs, $types: types }
1635  );
1636
1637export const queryNativeHookStatisticsCount = (): Promise<Array<NativeHookProcess>> =>
1638  query('queryNativeHookStatisticsCount', `select count(1) num from native_hook_statistic`, {});
1639
1640export const queryNativeHookProcess = (table: string): Promise<Array<NativeHookProcess>> => {
1641  let sql = `
1642    select
1643      distinct ${table}.ipid,
1644      pid,
1645      name
1646    from
1647      ${table}
1648    left join
1649      process p
1650    on
1651      ${table}.ipid = p.id
1652    `;
1653  return query('queryNativeHookProcess', sql, {});
1654};
1655
1656export const queryNativeHookSnapshotTypes = (): Promise<Array<NativeHookSampleQueryInfo>> =>
1657  query(
1658    'queryNativeHookSnapshotTypes',
1659    `
1660select
1661      event_type as eventType,
1662      data as subType
1663    from
1664      native_hook left join data_dict on native_hook.sub_type_id = data_dict.id
1665    where
1666      (event_type = 'AllocEvent' or event_type = 'MmapEvent')
1667    group by
1668      event_type,data;`,
1669    {}
1670  );
1671
1672export const queryAllHookData = (rightNs: number): Promise<Array<NativeHookSampleQueryInfo>> =>
1673  query(
1674    'queryAllHookData',
1675    `
1676    select
1677      callchain_id as eventId,
1678      event_type as eventType,
1679      data as subType,
1680      addr,
1681      heap_size as growth,
1682      (n.start_ts - t.start_ts) as startTs,
1683      (n.end_ts - t.start_ts) as endTs
1684    from
1685      native_hook n left join data_dict on n.sub_type_id = data_dict.id,
1686      trace_range t
1687    where
1688      (event_type = 'AllocEvent' or event_type = 'MmapEvent')
1689    and
1690      n.start_ts between t.start_ts and ${rightNs} + t.start_ts`,
1691    { $rightNs: rightNs }
1692  );
1693
1694export const queryNativeHookResponseTypes = (
1695  leftNs: number,
1696  rightNs: number,
1697  types: Array<string>
1698): Promise<Array<any>> =>
1699  query(
1700    'queryNativeHookResponseTypes',
1701    `
1702        select
1703          distinct last_lib_id as lastLibId,
1704          data_dict.data as value
1705        from
1706          native_hook A ,trace_range B
1707          left join data_dict on A.last_lib_id = data_dict.id
1708        where
1709        A.start_ts - B.start_ts
1710        between ${leftNs} and ${rightNs} and A.event_type in (${types.join(',')});
1711    `,
1712    { $leftNs: leftNs, $rightNs: rightNs, $types: types }
1713  );
1714/**
1715 * HiPerf
1716 */
1717export const queryHiPerfEventList = (): Promise<Array<any>> =>
1718  query('queryHiPerfEventList', `select id,report_value from perf_report where report_type='config_name'`, {});
1719export const queryHiPerfEventListData = (eventTypeId: number): Promise<Array<any>> =>
1720  query(
1721    'queryHiPerfEventListData',
1722    `
1723        select s.callchain_id,
1724               (s.timestamp_trace-t.start_ts) startNS
1725        from perf_sample s,trace_range t
1726        where
1727            event_type_id=${eventTypeId}
1728            and s.thread_id != 0
1729            and s.callchain_id != -1;
1730`,
1731    { $eventTypeId: eventTypeId }
1732  );
1733export const queryHiPerfEventData = (eventTypeId: number, cpu: number): Promise<Array<any>> =>
1734  query(
1735    'queryHiPerfEventList',
1736    `
1737    select s.callchain_id,
1738        (s.timestamp_trace-t.start_ts) startNS
1739    from perf_sample s,trace_range t
1740    where
1741        event_type_id=${eventTypeId}
1742        and cpu_id=${cpu}
1743        and s.thread_id != 0
1744        and s.callchain_id != -1;
1745`,
1746    { $eventTypeId: eventTypeId, $cpu: cpu }
1747  );
1748export const queryHiPerfCpuData = (cpu: number): Promise<Array<any>> =>
1749  query(
1750    'queryHiPerfCpuData',
1751    `
1752    select s.callchain_id,
1753        (s.timestamp_trace-t.start_ts) startNS
1754    from perf_sample s,trace_range t
1755    where
1756        cpu_id=${cpu}
1757        and s.thread_id != 0
1758        and s.callchain_id != -1;`,
1759    { $cpu: cpu }
1760  );
1761export const queryHiPerfCpuMergeData = (): Promise<Array<any>> =>
1762  query(
1763    'queryHiPerfCpuData',
1764    `select s.callchain_id,(s.timestamp_trace-t.start_ts) startNS from perf_sample s,trace_range t
1765where s.thread_id != 0 and s.callchain_id != -1;`,
1766    {}
1767  );
1768export const queryHiPerfCpuMergeData2 = (): Promise<Array<any>> =>
1769  query(
1770    'queryHiPerfCpuData2',
1771    `select distinct cpu_id from perf_sample where thread_id != 0 order by cpu_id desc;`,
1772    {}
1773  );
1774
1775export const queryHiPerfProcessData = (pid: number): Promise<Array<any>> =>
1776  query(
1777    'queryHiPerfProcessData',
1778    `
1779SELECT sp.callchain_id,
1780       th.thread_name,
1781       th.thread_id                     tid,
1782       th.process_id                    pid,
1783       sp.timestamp_trace - tr.start_ts startNS
1784from perf_sample sp,
1785     trace_range tr
1786         left join perf_thread th on th.thread_id = sp.thread_id
1787where pid = ${pid} and sp.thread_id != 0 and sp.callchain_id != -1;`,
1788    { $pid: pid }
1789  );
1790
1791export const queryHiPerfThreadData = (tid: number): Promise<Array<any>> =>
1792  query(
1793    'queryHiPerfThreadData',
1794    `
1795SELECT sp.callchain_id,
1796       th.thread_name,
1797       th.thread_id                     tid,
1798       th.process_id                    pid,
1799       sp.timestamp_trace - tr.start_ts startNS
1800from perf_sample sp,
1801     trace_range tr
1802         left join perf_thread th on th.thread_id = sp.thread_id
1803where tid = ${tid} and sp.thread_id != 0 and sp.callchain_id != -1;`,
1804    { $tid: tid }
1805  );
1806
1807export const querySelectTraceStats = (): Promise<
1808  Array<{
1809    event_name: string;
1810    stat_type: string;
1811    count: number;
1812    source: string;
1813    serverity: string;
1814  }>
1815> => query('querySelectTraceStats', 'select event_name,stat_type,count,source,serverity from stat');
1816
1817export const queryCustomizeSelect = (sql: string): Promise<Array<any>> => query('queryCustomizeSelect', sql);
1818
1819export const queryDistributedTerm = (): Promise<
1820  Array<{
1821    threadId: string;
1822    threadName: string;
1823    processId: string;
1824    processName: string;
1825    funName: string;
1826    dur: string;
1827    ts: string;
1828    chainId: string;
1829    spanId: string;
1830    parentSpanId: string;
1831    flag: string;
1832    trace_name: string;
1833  }>
1834> =>
1835  query(
1836    'queryDistributedTerm',
1837    `
1838    select
1839      group_concat(thread.id,',') as threadId,
1840      group_concat(thread.name,',') as threadName,
1841      group_concat(process.id,',') as processId,
1842      group_concat(process.name,',') as processName,
1843      group_concat(callstack.name,',') as funName,
1844      group_concat(callstack.dur,',') as dur,
1845      group_concat(callstack.ts,',') as ts,
1846      cast(callstack.chainId as varchar) as chainId,
1847      callstack.spanId as spanId,
1848      callstack.parentSpanId as parentSpanId,
1849      group_concat(callstack.flag,',') as flag,
1850      (select
1851        value
1852      from
1853        meta
1854      where
1855        name='source_name') as trace_name
1856      from
1857        callstack
1858      inner join thread on callstack.callid = thread.id
1859      inner join process on process.id = thread.ipid
1860      where (callstack.flag='S' or callstack.flag='C')
1861      group by callstack.chainId,callstack.spanId,callstack.parentSpanId`
1862  );
1863
1864export const queryTraceCpu = (): Promise<
1865  Array<{
1866    tid: string;
1867    pid: string;
1868    cpu: string;
1869    dur: string;
1870    min_freq: string;
1871    max_freq: string;
1872    avg_frequency: string;
1873  }>
1874> =>
1875  query(
1876    'queryTraceCpu',
1877    `SELECT
1878        itid AS tid,
1879        ipid AS pid,
1880        group_concat(cpu, ',') AS cpu,
1881        group_concat(dur, ',') AS dur,
1882        group_concat(min_freq, ',') AS min_freq,
1883        group_concat(max_freq, ',') AS max_freq,
1884        group_concat(avg_frequency, ',') AS avg_frequency
1885        FROM
1886        (SELECT
1887            itid,
1888            ipid,
1889            cpu,
1890            CAST (SUM(dur) AS INT) AS dur,
1891            CAST (MIN(freq) AS INT) AS min_freq,
1892            CAST (MAX(freq) AS INT) AS max_freq,
1893            CAST ( (SUM(dur * freq) / SUM(dur) ) AS INT) AS avg_frequency
1894            from
1895            result
1896            group by
1897            itid, cpu
1898        )
1899        GROUP BY
1900        ipid, itid
1901        ORDER BY
1902        ipid
1903    `
1904  );
1905
1906export const queryTraceCpuTop = (): Promise<
1907  Array<{
1908    tid: string;
1909    pid: string;
1910    cpu: string;
1911    duration: string;
1912    min_freq: string;
1913    max_freq: string;
1914    avg_frequency: string;
1915    sumNum: string;
1916  }>
1917> =>
1918  query(
1919    'queryTraceCpuTop',
1920    `SELECT
1921        itid AS tid,
1922        ipid AS pid,
1923        group_concat(cpu, ',') AS cpu,
1924        group_concat(dur, ',') AS dur,
1925        group_concat(min_freq, ',') AS min_freq,
1926        group_concat(max_freq, ',') AS max_freq,
1927        group_concat(avg_frequency, ',') AS avg_frequency,
1928        sum(dur * avg_frequency) AS sumNum
1929        FROM
1930        (SELECT
1931            itid,
1932            ipid,
1933            cpu,
1934            CAST (SUM(dur) AS INT) AS dur,
1935            CAST (MIN(freq) AS INT) AS min_freq,
1936            CAST (MAX(freq) AS INT) AS max_freq,
1937            CAST ( (SUM(dur * freq) / SUM(dur) ) AS INT) AS avg_frequency
1938            from result group by itid, cpu
1939        )
1940        GROUP BY
1941        ipid, itid
1942        ORDER BY
1943        sumNum
1944        DESC
1945        LIMIT 10;
1946    `
1947  );
1948
1949export const queryTraceMemory = (): Promise<
1950  Array<{
1951    maxNum: string;
1952    minNum: string;
1953    avgNum: string;
1954    name: string;
1955    processName: string;
1956  }>
1957> =>
1958  query(
1959    'queryTraceMemory',
1960    `
1961    select
1962        max(value) as maxNum,
1963        min(value) as minNum,
1964        avg(value) as avgNum,
1965        filter.name as name,
1966        p.name as processName
1967        from process_measure
1968        left join process_measure_filter as filter on filter.id= filter_id
1969        left join process as p on p.id = filter.ipid
1970    where
1971    filter_id > 0
1972    and
1973    filter.name = 'mem.rss.anon'
1974    group by
1975    filter_id
1976    order by
1977    avgNum desc`
1978  );
1979
1980export const queryTraceMemoryTop = (): Promise<
1981  Array<{
1982    maxNum: string;
1983    minNum: string;
1984    avgNum: string;
1985    name: string;
1986    processName: string;
1987  }>
1988> =>
1989  query(
1990    'queryTraceMemoryTop',
1991    `
1992    select
1993        max(value) as maxNum,
1994        min(value) as minNum,
1995        avg(value) as avgNum,
1996        f.name as name,
1997        p.name as processName
1998        from process_measure
1999        left join process_measure_filter as f on f.id= filter_id
2000        left join process as p on p.id = f.ipid
2001    where
2002    filter_id > 0
2003    and
2004    f.name = 'mem.rss.anon'
2005    group by
2006    filter_id
2007    order by
2008    avgNum desc limit 10`
2009  );
2010
2011export const queryTraceMemoryUnAgg = (): Promise<
2012  Array<{
2013    processName: string;
2014    name: string;
2015    value: string;
2016    ts: string;
2017  }>
2018> =>
2019  query(
2020    'queryTraceMemoryUnAgg',
2021    `
2022    select
2023        p.name as processName,
2024        group_concat(filter.name) as name,
2025        cast(group_concat(value) as varchar) as value,
2026        cast(group_concat(ts) as varchar) as ts
2027        from process_measure m
2028        left join process_measure_filter as filter on filter.id= m.filter_id
2029        left join process as p on p.id = filter.ipid
2030        where
2031        filter.name = 'mem.rss.anon'
2032        or
2033        filter.name = 'mem.rss.file'
2034        or
2035        filter.name = 'mem.swap'
2036        or
2037        filter.name = 'oom_score_adj'
2038    group by
2039    p.name,filter.ipid
2040    order by
2041    filter.ipid`
2042  );
2043
2044export const queryTraceTaskName = (): Promise<
2045  Array<{
2046    id: string;
2047    pid: string;
2048    process_name: string;
2049    thread_name: string;
2050  }>
2051> =>
2052  query(
2053    'queryTraceTaskName',
2054    `
2055    select
2056        P.id as id,
2057        P.pid as pid,
2058        P.name as process_name,
2059        group_concat(T.name,',') as thread_name
2060    from process as P left join thread as T where P.id = T.ipid
2061    group by pid`
2062  );
2063
2064export const queryTraceMetaData = (): Promise<
2065  Array<{
2066    name: string;
2067    valueText: string;
2068  }>
2069> =>
2070  query(
2071    'queryTraceMetaData',
2072    `
2073    select
2074        cast(name as varchar) as name,
2075        cast(value as varchar) as valueText
2076        from meta
2077        UNION
2078        select 'start_ts',cast(start_ts as varchar) from trace_range
2079        UNION
2080        select 'end_ts',cast(end_ts as varchar) from trace_range`
2081  );
2082
2083export const querySystemCalls = (): Promise<
2084  Array<{
2085    frequency: string;
2086    minDur: string;
2087    maxDur: string;
2088    avgDur: string;
2089    funName: string;
2090  }>
2091> =>
2092  query(
2093    'querySystemCalls',
2094    `
2095    select
2096      count(*) as frequency,
2097      min(dur) as minDur,
2098      max(dur) as maxDur,
2099      avg(dur) as avgDur,
2100      name as funName
2101    from
2102      callstack
2103      group by name
2104      order by
2105    frequency desc limit 100`
2106  );
2107
2108export const querySystemCallsTop = (): Promise<
2109  Array<{
2110    tid: string;
2111    pid: string;
2112    funName: string;
2113    frequency: string;
2114    minDur: string;
2115    maxDur: string;
2116    avgDur: string;
2117  }>
2118> =>
2119  query(
2120    'querySystemCallsTop',
2121    `SELECT
2122        cpu.tid AS tid,
2123        cpu.pid AS pid,
2124        callstack.name AS funName,
2125        count(callstack.name) AS frequency,
2126        min(callstack.dur) AS minDur,
2127        max(callstack.dur) AS maxDur,
2128        round(avg(callstack.dur)) AS avgDur
2129        FROM
2130        callstack
2131        INNER JOIN
2132        (SELECT
2133            itid AS tid,
2134            ipid AS pid,
2135            group_concat(cpu, ',') AS cpu,
2136            group_concat(dur, ',') AS dur,
2137            group_concat(min_freq, ',') AS min_freq,
2138            group_concat(max_freq, ',') AS max_freq,
2139            group_concat(avg_frequency, ',') AS avg_frequency,
2140            sum(dur * avg_frequency) AS sumNum
2141            FROM
2142            (SELECT
2143                itid,
2144                ipid,
2145                cpu,
2146                CAST (SUM(dur) AS INT) AS dur,
2147                CAST (MIN(freq) AS INT) AS min_freq,
2148                CAST (MAX(freq) AS INT) AS max_freq,
2149                CAST ( (SUM(dur * freq) / SUM(dur) ) AS INT) AS avg_frequency
2150                FROM
2151                result
2152                GROUP BY
2153                itid, cpu
2154            )
2155            GROUP BY
2156            ipid, itid
2157            ORDER BY
2158            sumNum
2159            DESC
2160            LIMIT 10
2161        ) AS cpu
2162        ON
2163        callstack.callid = cpu.tid
2164        GROUP BY
2165        callstack.name
2166        ORDER BY
2167        frequency
2168        DESC
2169    LIMIT 10`
2170  );
2171
2172export const getTabLiveProcessData = (leftNs: number, rightNs: number): Promise<Array<LiveProcess>> =>
2173  query<LiveProcess>(
2174    'getTabLiveProcessData',
2175    `SELECT
2176        process.id as processId,
2177        process.name as processName,
2178        process.ppid as responsibleProcess,
2179        process.uud as userName,
2180        process.usag as cpu,
2181        process.threadN as threads,
2182        process.pss as memory,
2183        process.cpu_time as cpuTime,
2184        process.disk_reads as diskReads,
2185        process.disk_writes as diskWrite
2186        FROM
2187        (
2188        SELECT
2189        tt.process_id AS id,
2190        tt.process_name AS name,
2191        tt.parent_process_id AS ppid,
2192        tt.uid as uud,
2193        tt.cpu_usage as usag,
2194        tt.thread_num AS threadN,
2195        mt.maxTT - TR.start_ts as endTs,
2196        tt.pss_info as pss,
2197        tt.cpu_time,
2198        tt.disk_reads,
2199        tt.disk_writes
2200        FROM
2201        live_process tt
2202        LEFT JOIN trace_range AS TR
2203        LEFT JOIN (select re.process_id as idd, max(re.ts) as maxTT, min(re.ts) as minTT
2204        from live_process re GROUP BY re.process_name, re.process_id ) mt
2205        on mt.idd = tt.process_id where endTs >= $rightNS
2206        GROUP BY
2207        tt.process_name,
2208        tt.process_id
2209        ) process ;`,
2210    { $leftNS: leftNs, $rightNS: rightNs }
2211  );
2212
2213export const getTabProcessHistoryData = (
2214  leftNs: number,
2215  rightNs: number,
2216  processId: number | undefined,
2217  threadId: number | undefined
2218): Promise<Array<ProcessHistory>> =>
2219  query<ProcessHistory>(
2220    'getTabProcessHistoryData',
2221    `SELECT
2222        process.id as processId,
2223        process.isD as alive,
2224        process.startTS as firstSeen,
2225        process.endTs as lastSeen,
2226        process.name as processName,
2227        process.ppid as responsibleProcess,
2228        process.uuid as userName,
2229        process.cpu_time as cpuTime,
2230        0 as pss
2231        FROM
2232        (
2233        SELECT
2234        tt.process_id AS id,
2235        tt.process_name AS name,
2236        tt.parent_process_id AS ppid,
2237        tt.uid AS uuid,
2238        tt.cpu_time,
2239        (mt.minTT - TR.start_ts ) AS startTS,
2240        mt.maxTT - TR.start_ts as endTs,
2241        (mt.maxTT - TR.start_ts - $rightNS) > 0 as isD
2242        FROM
2243        live_process tt
2244        LEFT JOIN trace_range AS TR
2245        LEFT JOIN (select re.process_id as idd, max(re.ts) as maxTT, min(re.ts) as minTT
2246        from live_process re GROUP BY re.process_name, re.process_id ) mt
2247        on mt.idd = tt.process_id
2248        GROUP BY
2249        tt.process_name,
2250        tt.process_id
2251        ) process;`,
2252    {
2253      $leftNS: leftNs,
2254      $rightNS: rightNs,
2255      $processID: processId,
2256      $threadID: threadId,
2257    }
2258  );
2259
2260export const getTabCpuAbilityData = (leftNs: number, rightNs: number): Promise<Array<SystemCpuSummary>> =>
2261  query<SystemCpuSummary>(
2262    'getTabCpuAbilityData',
2263    `SELECT
2264        ( n.ts - TR.start_ts ) AS startTime,
2265        n.dur AS duration,
2266        n.total_load AS totalLoad,
2267        n.user_load AS userLoad,
2268        n.system_load AS systemLoad,
2269        n.process_num AS threads
2270        FROM
2271        cpu_usage AS n,
2272        trace_range AS TR
2273        WHERE
2274        ( n.ts - TR.start_ts ) >= ifnull((
2275        SELECT
2276        ( usage.ts - TR.start_ts )
2277        FROM
2278        cpu_usage usage,
2279        trace_range TR
2280        WHERE
2281        ( usage.ts - TR.start_ts ) <= $leftNS
2282        ORDER BY
2283        usage.ts DESC
2284        LIMIT 1
2285        ),0)
2286        AND ( n.ts - TR.start_ts ) <= $rightNS
2287        ORDER BY
2288        startTime ASC;
2289    `,
2290    { $leftNS: leftNs, $rightNS: rightNs }
2291  );
2292
2293export const getTabMemoryAbilityData = (
2294  leftNs: number,
2295  rightNs: number
2296): Promise<
2297  Array<{
2298    startTime: number;
2299    value: string;
2300    name: string;
2301  }>
2302> =>
2303  query(
2304    'getTabMemoryAbilityData',
2305    `SELECT
2306        m.ts AS startTime,
2307        GROUP_CONCAT( IFNULL( m.value, 0 ) ) AS value,
2308        GROUP_CONCAT( f.name ) AS name
2309        FROM
2310        sys_mem_measure AS m
2311        INNER JOIN sys_event_filter AS f ON m.filter_id = f.id
2312        AND (f.name = 'sys.mem.total'
2313         or f.name = 'sys.mem.free'
2314         or f.name = 'sys.mem.buffers'
2315         or f.name = 'sys.mem.cached'
2316         or f.name = 'sys.mem.shmem'
2317         or f.name = 'sys.mem.slab'
2318         or f.name = 'sys.mem.swap.total'
2319         or f.name = 'sys.mem.swap.free'
2320         or f.name = 'sys.mem.mapped'
2321         or f.name = 'sys.mem.vmalloc.used'
2322         or f.name = 'sys.mem.page.tables'
2323         or f.name = 'sys.mem.kernel.stack'
2324         or f.name = 'sys.mem.active'
2325         or f.name = 'sys.mem.inactive'
2326         or f.name = 'sys.mem.unevictable'
2327         or f.name = 'sys.mem.vmalloc.total'
2328         or f.name = 'sys.mem.slab.unreclaimable'
2329         or f.name = 'sys.mem.cma.total'
2330         or f.name = 'sys.mem.cma.free'
2331         or f.name = 'sys.mem.kernel.reclaimable'
2332         or f.name = 'sys.mem.zram'
2333         )
2334        AND m.ts >= ifnull((
2335        SELECT
2336        m.ts AS startTime
2337        FROM
2338        sys_mem_measure AS m
2339        INNER JOIN sys_event_filter AS f ON m.filter_id = f.id
2340        AND m.ts <= $leftNS
2341        AND (f.name = 'sys.mem.total'
2342         or f.name = 'sys.mem.free'
2343         or f.name = 'sys.mem.buffers'
2344         or f.name = 'sys.mem.cached'
2345         or f.name = 'sys.mem.shmem'
2346         or f.name = 'sys.mem.slab'
2347         or f.name = 'sys.mem.swap.total'
2348         or f.name = 'sys.mem.swap.free'
2349         or f.name = 'sys.mem.mapped'
2350         or f.name = 'sys.mem.vmalloc.used'
2351         or f.name = 'sys.mem.page.tables'
2352         or f.name = 'sys.mem.kernel.stack'
2353         or f.name = 'sys.mem.active'
2354         or f.name = 'sys.mem.inactive'
2355         or f.name = 'sys.mem.unevictable'
2356         or f.name = 'sys.mem.vmalloc.total'
2357         or f.name = 'sys.mem.slab.unreclaimable'
2358         or f.name = 'sys.mem.cma.total'
2359         or f.name = 'sys.mem.cma.free'
2360         or f.name = 'sys.mem.kernel.reclaimable'
2361         or f.name = 'sys.mem.zram'
2362         )
2363        ORDER BY
2364        m.ts DESC
2365        LIMIT 1
2366        ),0)
2367        AND m.ts <= $rightNS GROUP BY m.ts;`,
2368    { $leftNS: leftNs, $rightNS: rightNs }
2369  );
2370
2371export const getTabNetworkAbilityData = (leftNs: number, rightNs: number): Promise<Array<SystemNetworkSummary>> =>
2372  query<SystemNetworkSummary>(
2373    'getTabNetworkAbilityData',
2374    `SELECT
2375            ( n.ts - TR.start_ts ) AS startTime,
2376            n.dur AS duration,
2377            n.rx AS dataReceived,
2378            n.tx_speed AS dataReceivedSec,
2379            n.tx AS dataSend,
2380            n.rx_speed AS dataSendSec,
2381            n.packet_in AS packetsIn,
2382            n.packet_in_sec AS packetsInSec,
2383            n.packet_out AS packetsOut,
2384            n.packet_out_sec AS packetsOutSec
2385            FROM
2386            network AS n,
2387            trace_range AS TR
2388            WHERE
2389            ( n.ts - TR.start_ts ) >= ifnull((
2390            SELECT
2391            ( nn.ts - T.start_ts ) AS startTime
2392            FROM
2393            network nn,
2394            trace_range T
2395            WHERE
2396            ( nn.ts - T.start_ts ) <= $leftNS
2397            ORDER BY
2398            nn.ts DESC
2399            LIMIT 1
2400            ),0)
2401            AND ( n.ts - TR.start_ts ) <= $rightNS
2402            ORDER BY
2403            startTime ASC`,
2404    { $leftNS: leftNs, $rightNS: rightNs }
2405  );
2406
2407export const getTabDiskAbilityData = (leftNs: number, rightNs: number): Promise<Array<SystemDiskIOSummary>> =>
2408  query<SystemDiskIOSummary>(
2409    'getTabDiskAbilityData',
2410    `SELECT
2411        ( n.ts - TR.start_ts ) AS startTime,
2412        n.dur AS duration,
2413        n.rd AS dataRead,
2414        n.rd_speed AS dataReadSec,
2415        n.wr AS dataWrite,
2416        n.wr_speed AS dataWriteSec,
2417        n.rd_count AS readsIn,
2418        n.rd_count_speed AS readsInSec,
2419        n.wr_count AS writeOut,
2420        n.wr_count_speed AS writeOutSec
2421        FROM
2422        diskio AS n,
2423        trace_range AS TR
2424        WHERE
2425        ( n.ts - TR.start_ts ) >= ifnull((
2426        SELECT
2427        ( nn.ts - T.start_ts ) AS startTime
2428        FROM
2429        diskio AS nn,
2430        trace_range AS T
2431        WHERE
2432        ( nn.ts - T.start_ts ) <= $leftNS
2433        ORDER BY
2434        nn.ts DESC
2435        LIMIT 1
2436        ),0)
2437        AND ( n.ts - TR.start_ts ) <= $rightNS
2438        ORDER BY
2439        startTime ASC;
2440    `,
2441    { $leftNS: leftNs, $rightNS: rightNs }
2442  );
2443
2444export const queryCpuAbilityData = (): Promise<Array<CpuAbilityMonitorStruct>> =>
2445  query(
2446    'queryCpuAbilityData',
2447    `select
2448        (t.total_load) as value,
2449        (t.ts - TR.start_ts) as startNS
2450        from cpu_usage t, trace_range AS TR;`
2451  );
2452
2453export const queryCpuAbilityUserData = (): Promise<Array<CpuAbilityMonitorStruct>> =>
2454  query(
2455    'queryCpuAbilityUserData',
2456    `select
2457        t.user_load as value,
2458        (t.ts - TR.start_ts) as startNS
2459        from cpu_usage t, trace_range AS TR;`
2460  );
2461
2462export const queryCpuAbilitySystemData = (): Promise<Array<CpuAbilityMonitorStruct>> =>
2463  query(
2464    'queryCpuAbilitySystemData',
2465    `select
2466        t.system_load as value,
2467        (t.ts - TR.start_ts) as startNS
2468        from cpu_usage t, trace_range AS TR;`
2469  );
2470
2471export const queryMemoryUsedAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> =>
2472  query(
2473    'queryMemoryUsedAbilityData',
2474    `select
2475        t.value as value,
2476        (t.ts - TR.start_ts) as startNS
2477        from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`,
2478    { $id: id }
2479  );
2480
2481export const queryCachedFilesAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> =>
2482  query(
2483    'queryCachedFilesAbilityData',
2484    `select
2485        t.value as value,
2486        (t.ts - TR.start_ts) as startNS
2487        from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`,
2488    { $id: id }
2489  );
2490
2491export const queryCompressedAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> =>
2492  query(
2493    'queryCompressedAbilityData',
2494    `select
2495        t.value as value,
2496        (t.ts - TR.start_ts) as startNS
2497        from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`,
2498    { $id: id }
2499  );
2500
2501export const querySwapUsedAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> =>
2502  query(
2503    'querySwapUsedAbilityData',
2504    `select
2505        t.value as value,
2506        (t.ts - TR.start_ts) as startNS
2507        from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`,
2508    { $id: id }
2509  );
2510
2511export const queryBytesReadAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> =>
2512  query(
2513    'queryBytesReadAbilityData',
2514    `select
2515        t.rd_speed as value,
2516        (t.ts - TR.start_ts) as startNS
2517        from diskio t, trace_range AS TR;`
2518  );
2519
2520export const queryBytesWrittenAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> =>
2521  query(
2522    'queryBytesWrittenAbilityData',
2523    `select
2524        t.wr_speed as value,
2525        (t.ts - TR.start_ts) as startNS
2526        from diskio t, trace_range AS TR;`
2527  );
2528
2529export const queryReadAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> =>
2530  query(
2531    'queryReadAbilityData',
2532    `select
2533        t.rd_count_speed as value,
2534        (t.ts - TR.start_ts) as startNS
2535        from diskio t, trace_range AS TR;`
2536  );
2537
2538export const queryWrittenAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> =>
2539  query(
2540    'queryWrittenAbilityData',
2541    `select
2542        t.wr_count_speed as value,
2543        (t.ts - TR.start_ts) as startNS
2544        from diskio t, trace_range AS TR;`
2545  );
2546
2547export const queryBytesInAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> =>
2548  query(
2549    'queryBytesInAbilityData',
2550    `select
2551        t.tx_speed as value,
2552        (t.ts - TR.start_ts) as startNS
2553        from network t, trace_range AS TR;`
2554  );
2555
2556export const queryBytesOutAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> =>
2557  query(
2558    'queryBytesOutAbilityData',
2559    `select
2560        t.rx_speed as value,
2561        (t.ts - TR.start_ts) as startNS
2562        from network t, trace_range AS TR;`
2563  );
2564
2565export const queryPacketsInAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> =>
2566  query(
2567    'queryPacketsInAbilityData',
2568    `select
2569        t.packet_in_sec as value,
2570        (t.ts - TR.start_ts) as startNS
2571        from network t, trace_range AS TR;`
2572  );
2573
2574export const queryPacketsOutAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> =>
2575  query(
2576    'queryPacketsOutAbilityData',
2577    `select
2578        t.packet_out_sec as value,
2579        (t.ts - TR.start_ts) as startNS
2580        from network t, trace_range AS TR;`
2581  );
2582
2583export const queryNetWorkMaxData = (): Promise<Array<any>> =>
2584  query(
2585    'queryNetWorkMaxData',
2586    `select
2587     ifnull(max(tx_speed),0) as maxIn,
2588     ifnull(max(rx_speed),0) as maxOut,
2589     ifnull(max(packet_in_sec),0) as maxPacketIn,
2590     ifnull(max(packet_in_sec),0) as maxPacketOut
2591     from network`
2592  );
2593
2594export const queryMemoryMaxData = (memoryName: string): Promise<Array<any>> =>
2595  query(
2596    'queryMemoryMaxData',
2597    `SELECT ifnull(max(m.value),0) as maxValue,
2598            filter_id
2599            from sys_mem_measure m
2600            WHERE m.filter_id =
2601            (SELECT id FROM sys_event_filter WHERE name = $memoryName)
2602`,
2603    { $memoryName: memoryName }
2604  );
2605
2606export const queryDiskIoMaxData = (): Promise<Array<any>> =>
2607  query(
2608    'queryDiskIoMaxData',
2609    `select
2610    ifnull(max(rd_speed),0) as bytesRead,
2611    ifnull(max(wr_speed),0) as bytesWrite,
2612    ifnull(max(rd_count_speed),0) as readOps,
2613    ifnull(max(wr_count_speed),0)  as writeOps
2614    from diskio`
2615  );
2616
2617export const queryAbilityExits = (): Promise<Array<any>> =>
2618  query(
2619    'queryAbilityExits',
2620    `select
2621      event_name
2622      from stat s
2623      where s.event_name in ('trace_diskio','trace_network', 'trace_cpu_usage','sys_memory')
2624      and s.stat_type ='received' and s.count > 0`
2625  );
2626
2627export const queryStartTime = (): Promise<Array<any>> => query('queryStartTime', `SELECT start_ts FROM trace_range`);
2628
2629export const queryPerfFiles = (): Promise<Array<PerfFile>> =>
2630  query('queryPerfFiles', `select file_id as fileId,symbol,path from perf_files`, {});
2631
2632export const queryPerfProcess = (): Promise<Array<PerfThread>> =>
2633  query(
2634    'queryPerfThread',
2635    `select process_id as pid,thread_name as processName from perf_thread where process_id = thread_id`,
2636    {}
2637  );
2638
2639export const queryPerfThread = (): Promise<Array<PerfThread>> =>
2640  query(
2641    'queryPerfThread',
2642    `select a.thread_id as tid,a.thread_name as threadName,a.process_id as pid,b.thread_name as processName from perf_thread a left join (select * from perf_thread where thread_id = process_id) b on a.process_id = b.thread_id`,
2643    {}
2644  );
2645
2646export const queryPerfSampleListByTimeRange = (
2647  leftNs: number,
2648  rightNs: number,
2649  cpus: Array<number>,
2650  processes: Array<number>,
2651  threads: Array<number>
2652): Promise<Array<PerfSample>> => {
2653  let sql = `
2654select A.callchain_id as sampleId,
2655       A.thread_id as tid,
2656       C.thread_name as threadName,
2657       A.thread_state as state,
2658       C.process_id as pid,
2659       (timestamp_trace - R.start_ts) as time,
2660       cpu_id as core
2661from perf_sample A,trace_range R
2662left join perf_thread C on A.thread_id = C.thread_id
2663where time >= $leftNs and time <= $rightNs and A.thread_id != 0
2664    `;
2665  if (cpus.length != 0 || processes.length != 0 || threads.length != 0) {
2666    let arg1 = cpus.length > 0 ? `or core in (${cpus.join(',')}) ` : '';
2667    let arg2 = processes.length > 0 ? `or pid in (${processes.join(',')}) ` : '';
2668    let arg3 = threads.length > 0 ? `or tid in (${threads.join(',')})` : '';
2669    let arg = `${arg1}${arg2}${arg3}`.substring(3);
2670    sql = `${sql} and (${arg})`;
2671  }
2672  return query('queryPerfSampleListByTimeRange', sql, {
2673    $leftNs: leftNs,
2674    $rightNs: rightNs,
2675  });
2676};
2677
2678export const queryPerfSampleIdsByTimeRange = (
2679  leftNs: number,
2680  rightNs: number,
2681  cpus: Array<number>,
2682  processes: Array<number>,
2683  threads: Array<number>
2684): Promise<Array<PerfSample>> => {
2685  let sql = `
2686select A.callchain_id as sampleId
2687from perf_sample A,trace_range R
2688left join perf_thread C on A.thread_id = C.thread_id
2689where (timestamp_trace - R.start_ts) >= $leftNs and (timestamp_trace - R.start_ts) <= $rightNs and A.thread_id != 0
2690    `;
2691  if (cpus.length != 0 || processes.length != 0 || threads.length != 0) {
2692    let arg1 = cpus.length > 0 ? `or A.cpu_id in (${cpus.join(',')}) ` : '';
2693    let arg2 = processes.length > 0 ? `or C.process_id in (${processes.join(',')}) ` : '';
2694    let arg3 = threads.length > 0 ? `or A.thread_id in (${threads.join(',')})` : '';
2695    let arg = `${arg1}${arg2}${arg3}`.substring(3);
2696    sql = `${sql} and (${arg})`;
2697  }
2698  return query('queryPerfSampleIdsByTimeRange', sql, {
2699    $leftNs: leftNs,
2700    $rightNs: rightNs,
2701  });
2702};
2703
2704export const queryPerfSampleCallChain = (sampleId: number): Promise<Array<PerfStack>> =>
2705  query(
2706    'queryPerfSampleCallChain',
2707    `
2708    select
2709    callchain_id as callChainId,
2710    callchain_id as sampleId,
2711    file_id as fileId,
2712    symbol_id as symbolId,
2713    vaddr_in_file as vaddrInFile,
2714    name as symbol
2715from perf_callchain where callchain_id = $sampleId and symbol_id != -1 and vaddr_in_file != 0;
2716    `,
2717    { $sampleId: sampleId }
2718  );
2719
2720export const queryPerfCmdline = (): Promise<Array<PerfCmdLine>> =>
2721  query(
2722    'queryPerfCmdline',
2723    `
2724    select report_value from perf_report  where report_type = 'cmdline'
2725    `,
2726    {}
2727  );
2728
2729export const queryCPuAbilityMaxData = (): Promise<Array<any>> =>
2730  query(
2731    'queryCPuAbilityMaxData',
2732    `select ifnull(max(total_load),0) as totalLoad,
2733                ifnull(max(user_load),0) as userLoad,
2734                ifnull(max(system_load),0) as systemLoad
2735                from cpu_usage`
2736  );
2737
2738export const querySearchFunc = (search: string): Promise<Array<SearchFuncBean>> =>
2739  query(
2740    'querySearchFunc',
2741    `
2742   select c.cookie,c.id,c.name as funName,c.ts - r.start_ts as startTime,c.dur,c.depth,t.tid,t.name as threadName
2743   ,p.pid ,'func' as type from callstack c left join thread t on c.callid = t.id left join process p on t.ipid = p.id
2744   left join trace_range r
2745   where c.name like '%${search}%' and startTime > 0;
2746    `,
2747    { $search: search }
2748  );
2749
2750export const querySceneSearchFunc = (search: string, processList: Array<string>): Promise<Array<SearchFuncBean>> =>
2751  query(
2752    'querySearchFunc',
2753    `
2754   select c.cookie,c.id,c.name as funName,c.ts - r.start_ts as startTime,c.dur,c.depth,t.tid,t.name as threadName
2755   ,p.pid ,'func' as type from callstack c left join thread t on c.callid = t.id left join process p on t.ipid = p.id
2756   left join trace_range r
2757   where c.name like '%${search}%' and startTime > 0 and p.pid in (${processList.join(',')});
2758    `,
2759    { $search: search }
2760  );
2761
2762export const queryBinderBySliceId = (id: number): Promise<Array<any>> =>
2763  query(
2764    'queryBinderBySliceId',
2765    `select c.ts-D.start_ts as startTime,
2766    c.dur,
2767    t.tid,p.pid,c.depth
2768    from callstack c,trace_range D
2769    left join thread t on c.callid = t.id
2770    left join process p on p.id = t.ipid
2771where cat = 'binder' and c.id = $id;`,
2772    { $id: id }
2773  );
2774
2775export const queryThreadByItid = (itid: number, ts: number): Promise<Array<any>> =>
2776  query(
2777    'queryThreadByItid',
2778    `select tid,pid,c.dur,c.depth,c.name
2779from thread t left join process p on t.ipid = p.ipid
2780left join callstack c on t.itid = c.callid
2781where itid = $itid and c.ts = $ts;`,
2782    { $itid: itid, $ts: ts }
2783  );
2784
2785export const queryBinderByArgsId = (id: number, startTime: number, isNext: boolean): Promise<Array<any>> => {
2786  let sql = `select c.ts - D.start_ts as startTime,
2787    c.dur,
2788    t.tid,p.pid,c.depth
2789    from callstack c,trace_range D
2790    left join thread t on c.callid = t.id
2791    left join process p on p.id = t.ipid
2792where cat = 'binder' and  c.argsetid = $id`;
2793  if (isNext) {
2794    sql += ' and c.ts > $startTime +  D.start_ts';
2795  } else {
2796    sql += ' and c.ts < $startTime +  D.start_ts';
2797  }
2798  return query('queryBinderByArgsId', sql, {
2799    $id: id,
2800    $startTime: startTime,
2801  });
2802};
2803
2804export const getTabPaneFilesystemStatisticsFather = (leftNs: number, rightNs: number): Promise<Array<any>> =>
2805  query(
2806    'getTabPaneFilesystemStatisticsFather',
2807    `
2808    select SUM(dur) as allDuration,
2809    count(f.type) as count,
2810    min(dur) as minDuration,
2811    max(dur) as maxDuration,
2812    round(avg(dur),2) as avgDuration,
2813    p.name,
2814    f.type,
2815    p.pid,
2816    sum(ifnull(size,0)) as size
2817    from file_system_sample as f
2818    left join process as p on f.ipid=p.ipid
2819    where f.start_ts >= $leftNs
2820    and end_ts <= $rightNs
2821    group by f.type;
2822    `,
2823    { $leftNs: leftNs, $rightNs: rightNs }
2824  );
2825
2826export const getTabPaneFilesystemStatisticsChild = (leftNs: number, rightNs: number): Promise<Array<any>> =>
2827  query(
2828    'getTabPaneFilesystemStatisticsChild',
2829    `
2830    select SUM(dur)    as allDuration,
2831        count(f.type) as count,
2832        min(dur)    as minDuration,
2833        max(dur)    as maxDuration,
2834        round(avg(dur),2)    as avgDuration,
2835        p.name,
2836        f.type,
2837        p.pid,
2838        sum(ifnull(size,0))    as size
2839        from file_system_sample as f left join process as p on f.ipid=p.ipid
2840        where f.start_ts >= $leftNs
2841        and end_ts <= $rightNs
2842        group by f.type, f.ipid;
2843`,
2844    { $leftNs: leftNs, $rightNs: rightNs }
2845  );
2846
2847export const getTabPaneFilesystemStatisticsAll = (leftNs: number, rightNs: number): Promise<Array<any>> =>
2848  query(
2849    'getTabPaneFilesystemStatisticsAll',
2850    `
2851    select SUM(dur)    as allDuration,
2852       count(type) as count,
2853       min(dur)    as minDuration,
2854       max(dur)    as maxDuration,
2855       round(avg(dur),2)    as avgDuration,
2856       type
2857    from file_system_sample
2858    where start_ts >= $leftNs
2859    and end_ts <= $rightNs;
2860`,
2861    { $leftNs: leftNs, $rightNs: rightNs }
2862  );
2863
2864export const getTabPaneFilesystemStatistics = (leftNs: number, rightNs: number, types: number[]): Promise<Array<any>> =>
2865  query(
2866    'getTabPaneFilesystemStatistics',
2867    `
2868    select p.pid,
2869       ifnull(p.name,'Process') as name,
2870       f.type,
2871       count(f.ipid) as count,
2872       sum(ifnull(size,0)) as size,
2873       sum(case when f.type = 2 then ifnull(size,0) else 0 end) as logicalReads,
2874       sum(case when f.type = 3 then ifnull(size,0) else 0 end) as logicalWrites,
2875       sum(case when f.type != 2 and f.type != 3 then ifnull(size,0) else 0 end) as otherFile,
2876       sum(dur) as allDuration,
2877       min(dur) as minDuration,
2878       max(dur) as maxDuration,
2879       avg(dur) as avgDuration
2880    from file_system_sample as f left join process as p on f.ipid=p.ipid
2881    where end_ts >= $leftNs
2882    and end_ts <= $rightNs
2883    and f.type in (${types.join(',')})
2884    group by f.type,f.ipid
2885    order by f.type;
2886`,
2887    { $leftNs: leftNs, $rightNs: rightNs }
2888  );
2889
2890export const getTabPaneVirtualMemoryStatisticsData = (leftNs: number, rightNs: number): Promise<Array<any>> =>
2891  query(
2892    'getTabPaneVirtualMemoryStatisticsData',
2893    `
2894    select p.pid,
2895       t.tid,
2896       ifnull(p.name,'Process') as pname,
2897       ifnull(t.name,'Thread') as tname,
2898       f.type,
2899       f.ipid,
2900       f.itid,
2901       count(f.ipid) as count,
2902       sum(dur) as allDuration,
2903       min(dur) as minDuration,
2904       max(dur) as maxDuration,
2905       avg(dur) as avgDuration
2906    from paged_memory_sample as f left join process as p on f.ipid=p.ipid left join thread as t on f.itid=t.itid
2907    where f.end_ts >= $leftNs
2908    and f.end_ts <= $rightNs
2909    group by f.type,f.ipid,f.itid
2910    order by f.type;
2911`,
2912    { $leftNs: leftNs, $rightNs: rightNs }
2913  );
2914
2915export const getTabPaneIOTierStatisticsData = (
2916  leftNs: number,
2917  rightNs: number,
2918  diskIOipids: Array<number>
2919): Promise<Array<any>> => {
2920  let str = '';
2921  if (diskIOipids.length > 0) {
2922    str = ` and i.ipid in (${diskIOipids.join(',')})`;
2923  }
2924  return query(
2925    'getTabPaneIOTierStatisticsData',
2926    `
2927    select p.pid,
2928       ifnull(p.name,'Process') as pname,
2929       i.tier,
2930       i.ipid,
2931       path_id as path,
2932       count(i.ipid) as count,
2933       sum(latency_dur) as allDuration,
2934       min(latency_dur) as minDuration,
2935       max(latency_dur) as maxDuration,
2936       avg(latency_dur) as avgDuration
2937    from bio_latency_sample as i left join process as p on i.ipid=p.ipid
2938    where i.start_ts+latency_dur >= $leftNs
2939    and i.start_ts+latency_dur <= $rightNs
2940    ${str}
2941    group by i.tier,i.ipid,i.path_id
2942    order by i.tier;
2943`,
2944    { $leftNs: leftNs, $rightNs: rightNs }
2945  );
2946};
2947
2948export const getTabPaneCounterSampleData = (
2949  leftNs: number,
2950  rightNs: number,
2951  cpuStateFilterIds: Array<number>
2952): Promise<Array<any>> => {
2953  let str = '';
2954  if (cpuStateFilterIds.length > 0) {
2955    str = ` and filter_id in (${cpuStateFilterIds.join(',')})`;
2956  }
2957  return query(
2958    'getTabPaneCounterSampleData',
2959    `
2960    select value, filter_id as filterId, ts, f.cpu
2961    from measure left join cpu_measure_filter as f on f.id=filter_id
2962    where
2963    ts <= $rightNs${str} order by ts asc;
2964`,
2965    { $leftNs: leftNs, $rightNs: rightNs }
2966  );
2967};
2968
2969export const getTabPaneFrequencySampleData = (
2970  leftNs: number,
2971  rightNs: number,
2972  cpuFreqFilterIds: Array<number>
2973): Promise<Array<any>> => {
2974  let str = '';
2975  if (cpuFreqFilterIds.length > 0) {
2976    str = ` and filter_id in (${cpuFreqFilterIds.join(',')})`;
2977  }
2978  return query(
2979    'getTabPaneFrequencySampleData',
2980    `
2981    select value, filter_id as filterId, ts, f.cpu
2982    from measure left join cpu_measure_filter as f on f.id=filter_id
2983    where
2984    ts <= $rightNs${str} order by ts asc;
2985`,
2986    { $leftNs: leftNs, $rightNs: rightNs }
2987  );
2988};
2989
2990export const hasFileSysData = (): Promise<Array<any>> =>
2991  query(
2992    'hasFileSysData',
2993    `
2994    select
2995        fsCount,
2996        vmCount,
2997        ioCount from
2998        (select count(1) as fsCount from file_system_sample s,trace_range t where (s.start_ts between t.start_ts and t.end_ts) or (s.end_ts between t.start_ts and t.end_ts) )
2999        ,(select count(1) as vmCount from paged_memory_sample s,trace_range t where (s.start_ts between t.start_ts and t.end_ts) or (s.end_ts between t.start_ts and t.end_ts) )
3000        ,(select count(1) as ioCount from bio_latency_sample s,trace_range t where (s.start_ts between t.start_ts and t.end_ts) or (s.end_ts between t.start_ts and t.end_ts) );
3001    `,
3002    {}
3003  );
3004
3005export const getFileSysChartDataByType = (type: number): Promise<Array<any>> =>
3006  query(
3007    'getFileSysChartData',
3008    `
3009    select
3010       (A.start_ts -B.start_ts) as startNS,
3011       (A.end_ts - B.start_ts) as endNS,
3012       dur
3013    from file_system_sample A,trace_range B
3014    where type = $type and startNS > 0;`,
3015    { $type: type },
3016    'exec'
3017  );
3018
3019export const getFileSysVirtualMemoryChartData = (): Promise<Array<any>> =>
3020  query(
3021    'getFileSysVirtualMemoryChartData',
3022    `
3023    select
3024       (A.start_ts -B.start_ts) as startNS,
3025       (A.end_ts - B.start_ts) as endNS,
3026       dur as dur
3027    from paged_memory_sample A,trace_range B
3028    where startNS > 0
3029    order by A.start_ts;`,
3030    {},
3031    'exec'
3032  );
3033
3034export const getDiskIOProcess = (): Promise<Array<any>> =>
3035  query(
3036    'getDiskIOProcess',
3037    `
3038    select name,B.ipid,pid
3039    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
3040    left join process B on A.ipid = B.ipid;`,
3041    {}
3042  );
3043
3044export const getDiskIOLatencyChartDataByProcess = (
3045  all: boolean,
3046  ipid: number,
3047  typeArr: Array<number>
3048): Promise<Array<any>> =>
3049  query(
3050    'getDiskIOLatencyChartDataByProcess',
3051    `
3052    select
3053       (A.start_ts -B.start_ts) as startNS,
3054       (A.start_ts - B.start_ts + A.latency_dur) as endNS,
3055       latency_dur as dur
3056    from bio_latency_sample A,trace_range B
3057    where type in (${typeArr.join(',')}) and startNS > 0
3058        ${all ? '' : 'and ipid = ' + ipid}
3059    order by A.start_ts;`,
3060    {},
3061    'exec'
3062  );
3063
3064export const querySdkCount = (sql: string, componentId: number, args?: any): Promise<Array<any>> =>
3065  query('querySdkCount', sql, args, 'exec-sdk-' + componentId);
3066
3067export const querySdkCounterData = (
3068  sql: string,
3069  counter_id: number,
3070  componentId: number
3071): Promise<Array<CounterStruct>> =>
3072  query('querySdkCounterData', sql, { $counter_id: counter_id }, 'exec-sdk-' + componentId);
3073
3074export const getTabSdkCounterData = (
3075  sqlStr: string,
3076  startTime: number,
3077  leftNs: number,
3078  rightNs: number,
3079  counters: Array<string>,
3080  componentId: number
3081): Promise<Array<CounterSummary>> =>
3082  query<CounterSummary>(
3083    'getTabSdkCounterData',
3084    sqlStr,
3085    {
3086      $startTime: startTime,
3087      $leftNs: leftNs,
3088      $rightNs: rightNs,
3089      $counters: counters,
3090    },
3091    'exec-sdk-' + componentId
3092  );
3093
3094export const getTabSdkCounterLeftData = (
3095  sqlStr: string,
3096  leftNs: number,
3097  counters: Array<string>,
3098  componentId: number
3099): Promise<Array<any>> =>
3100  query<any>(
3101    'getTabSdkCounterLeftData',
3102    sqlStr,
3103    {
3104      $leftNs: leftNs,
3105      $counters: counters,
3106    },
3107    'exec-sdk-' + componentId
3108  );
3109
3110export const getTabSdkSliceData = (
3111  sqlStr: string,
3112  startTime: number,
3113  leftNs: number,
3114  rightNs: number,
3115  slices: Array<string>,
3116  componentId: number
3117): Promise<Array<SdkSliceSummary>> =>
3118  query<SdkSliceSummary>(
3119    'getTabSdkSliceData',
3120    sqlStr,
3121    {
3122      $startTime: startTime,
3123      $leftNs: leftNs,
3124      $rightNs: rightNs,
3125      $slices: slices,
3126    },
3127    'exec-sdk-' + componentId
3128  );
3129
3130export const querySdkSliceData = (
3131  sqlStr: string,
3132  column_id: number,
3133  startNS: number,
3134  endNS: number,
3135  componentId: number
3136): Promise<Array<SdkSliceStruct>> =>
3137  query(
3138    'querySdkSliceData',
3139    sqlStr,
3140    { $column_id: column_id, $startNS: startNS, $endNS: endNS },
3141    'exec-sdk-' + componentId
3142  );
3143
3144export const queryCounterMax = (sqlStr: string, counter_id: number, componentId: number): Promise<Array<any>> =>
3145  query('queryCounterMax', sqlStr, { $counter_id: counter_id }, 'exec-sdk-' + componentId);
3146
3147export const queryAnomalyData = (): Promise<Array<EnergyAnomalyStruct>> =>
3148  query(
3149    'queryAnomalyData',
3150    `select
3151      (S.ts - TR.start_ts) as startNS,
3152      D.data as eventName,
3153      D2.data as appKey,
3154      (case when S.type==1 then group_concat(S.string_value,',') else group_concat(S.int_value,',') end) as Value
3155      from trace_range AS TR,hisys_event_measure as S
3156      left join data_dict as D on D.id=S.name_id
3157      left join app_name as APP on APP.id=S.key_id
3158      left join data_dict as D2 on D2.id=APP.app_key
3159      where D.data in ('ANOMALY_SCREEN_OFF_ENERGY','ANOMALY_KERNEL_WAKELOCK','ANOMALY_CPU_HIGH_FREQUENCY','ANOMALY_WAKEUP')
3160     or (D.data in ('ANOMALY_RUNNINGLOCK','ANORMALY_APP_ENERGY','ANOMALY_GNSS_ENERGY','ANOMALY_CPU_ENERGY','ANOMALY_ALARM_WAKEUP') and D2.data in ("APPNAME"))
3161      group by S.serial,D.data`
3162  );
3163
3164export const querySystemLocationData = (): Promise<
3165  Array<{
3166    startNs: string;
3167    eventName: string;
3168    type: string;
3169    state: string;
3170  }>
3171> =>
3172  query(
3173    'querySystemLocationData',
3174    `SELECT
3175        ( S.ts - TR.start_ts ) AS ts,
3176        D.data AS eventName,
3177        D2.data AS appKey,
3178        group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS Value
3179        FROM
3180        trace_range AS TR,
3181        hisys_event_measure AS S
3182        LEFT JOIN data_dict AS D ON D.id = S.name_id
3183        LEFT JOIN app_name AS APP ON APP.id = S.key_id
3184        LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key
3185        WHERE
3186        D.data = 'GNSS_STATE' AND D2.data = 'STATE'
3187        GROUP BY
3188        S.serial,
3189        APP.app_key,
3190        D.data,
3191        D2.data;`
3192  );
3193
3194export const querySystemLockData = (): Promise<
3195  Array<{
3196    startNs: string;
3197    eventName: string;
3198    type: string;
3199    state: string;
3200  }>
3201> =>
3202  query(
3203    'querySystemLockData',
3204    `SELECT
3205        ( S.ts - TR.start_ts ) AS ts,
3206        D.data AS eventName,
3207        D2.data AS appKey,
3208        group_concat(( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS Value
3209        FROM
3210        trace_range AS TR,
3211        hisys_event_measure AS S
3212        LEFT JOIN data_dict AS D ON D.id = S.name_id
3213        LEFT JOIN app_name AS APP ON APP.id = S.key_id
3214        LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key
3215        WHERE
3216        ( D.data = 'POWER_RUNNINGLOCK' AND D2.data in ('TAG','MESSAGE'))
3217        GROUP BY
3218        S.serial;`
3219  );
3220
3221export const querySystemSchedulerData = (): Promise<
3222  Array<{
3223    startNs: string;
3224    eventName: string;
3225    appKey: string;
3226    Value: string;
3227  }>
3228> =>
3229  query(
3230    'querySystemSchedulerData',
3231    `SELECT
3232        ( S.ts - TR.start_ts ) AS startNs,
3233        D.data AS eventName,
3234        group_concat(D2.data, ',') AS appKey,
3235        group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS Value
3236        FROM
3237        trace_range AS TR,
3238        hisys_event_measure AS S
3239        LEFT JOIN data_dict AS D ON D.id = S.name_id
3240        LEFT JOIN app_name AS APP ON APP.id = S.key_id
3241        LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key
3242        WHERE
3243        D.data IN ( 'WORK_REMOVE', 'WORK_STOP', 'WORK_ADD' ) AND D2.data in ('NAME','TYPE','WORKID')
3244        GROUP BY
3245        S.serial;`
3246  );
3247
3248export const querySystemDetailsData = (rightNs: number, eventName: string): Promise<Array<SystemDetailsEnergy>> =>
3249  query(
3250    'querySystemDetailsData',
3251    `SELECT
3252        ( S.ts - TR.start_ts ) AS ts,
3253        D.data AS eventName,
3254        D2.data AS appKey,
3255        group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS appValue
3256    FROM
3257        trace_range AS TR,
3258        hisys_event_measure AS S
3259        LEFT JOIN data_dict AS D ON D.id = S.name_id
3260        LEFT JOIN app_name AS APP ON APP.id = S.key_id
3261        LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key
3262    WHERE
3263        D.data in ($eventName)
3264    AND
3265        D2.data in ('UID', 'TYPE', 'WORKID', 'NAME', 'INTERVAL', 'TAG', 'STATE', 'STACK', 'APPNAME', 'MESSAGE', 'PID', 'LOG_LEVEL')
3266    AND
3267        (S.ts - TR.start_ts) <= $rightNS
3268    GROUP BY
3269        S.serial,
3270        APP.app_key,
3271        D.data,
3272        D2.data;`,
3273    { $rightNS: rightNs, $eventName: eventName }
3274  );
3275
3276export const querySystemWorkData = (rightNs: number): Promise<Array<SystemDetailsEnergy>> =>
3277  query(
3278    'querySystemWorkData',
3279    `SELECT
3280        ( S.ts - TR.start_ts ) AS ts,
3281        D.data AS eventName,
3282        D2.data AS appKey,
3283        group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS appValue
3284        FROM
3285        trace_range AS TR,
3286        hisys_event_measure AS S
3287        LEFT JOIN data_dict AS D
3288        ON D.id = S.name_id
3289        LEFT JOIN app_name AS APP
3290        ON APP.id = S.key_id
3291        LEFT JOIN data_dict AS D2
3292        ON D2.id = APP.app_key
3293        WHERE
3294        D.data in ("WORK_REMOVE", "WORK_STOP", "WORK_ADD", "WORK_START")
3295        and
3296        D2.data in ('UID', 'TYPE', 'WORKID', 'NAME', 'INTERVAL', 'TAG', 'STATE', 'STACK', 'APPNAME', 'MESSAGE', 'PID', 'LOG_LEVEL')
3297        and (S.ts - TR.start_ts) <= $rightNS
3298        GROUP BY
3299        S.serial,
3300        APP.app_key,
3301        D.data,
3302        D2.data;`,
3303    { $rightNS: rightNs }
3304  );
3305
3306export const queryMaxPowerValue = (
3307  appName: string
3308): Promise<
3309  Array<{
3310    maxValue: number;
3311  }>
3312> =>
3313  query(
3314    'queryMaxPowerValue',
3315    `SELECT
3316        max( item ) AS maxValue
3317        FROM
3318        (
3319            SELECT
3320            sum( energy + background_energy + screen_on_energy + screen_off_energy + foreground_energy ) AS item
3321            FROM
3322            energy
3323            WHERE
3324            app_name = $appName
3325            GROUP BY
3326            startNs);`,
3327    { $appName: appName }
3328  );
3329
3330export const queryPowerData = (): Promise<
3331  Array<{
3332    startNS: number;
3333    eventName: string;
3334    appKey: string;
3335    eventValue: string;
3336  }>
3337> =>
3338  query(
3339    'queryPowerData',
3340    `SELECT
3341        ( S.ts - TR.start_ts ) AS startNS,
3342        D.data AS eventName,
3343        D2.data AS appKey,
3344        group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS eventValue
3345        FROM
3346        trace_range AS TR,
3347        hisys_event_measure AS S
3348        LEFT JOIN data_dict AS D
3349        ON D.id = S.name_id
3350        LEFT JOIN app_name AS APP
3351        ON APP.id = S.key_id
3352        LEFT JOIN data_dict AS D2
3353        ON D2.id = APP.app_key
3354        where
3355        D.data in ('POWER_IDE_CPU','POWER_IDE_LOCATION','POWER_IDE_GPU','POWER_IDE_DISPLAY','POWER_IDE_CAMERA','POWER_IDE_BLUETOOTH','POWER_IDE_FLASHLIGHT','POWER_IDE_AUDIO','POWER_IDE_WIFISCAN')
3356        and
3357        D2.data in ('BACKGROUND_ENERGY','FOREGROUND_ENERGY','SCREEN_ON_ENERGY','SCREEN_OFF_ENERGY','ENERGY','APPNAME')
3358        GROUP BY
3359        S.serial,
3360        APP.app_key,
3361        D.data,
3362        D2.data
3363        ORDER BY
3364        eventName;`,
3365    {}
3366  );
3367
3368export const getTabPowerDetailsData = (
3369  leftNs: number,
3370  rightNs: number
3371): Promise<
3372  Array<{
3373    startNS: number;
3374    eventName: string;
3375    appKey: string;
3376    eventValue: string;
3377  }>
3378> =>
3379  query(
3380    'getTabPowerDetailsData',
3381    `SELECT
3382        ( S.ts - TR.start_ts ) AS startNS,
3383        D.data AS eventName,
3384        D2.data AS appKey,
3385        group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS eventValue
3386        FROM
3387        trace_range AS TR,
3388        hisys_event_measure AS S
3389        LEFT JOIN data_dict AS D ON D.id = S.name_id
3390        LEFT JOIN app_name AS APP ON APP.id = S.key_id
3391        LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key
3392        where
3393        D.data in ('POWER_IDE_CPU','POWER_IDE_LOCATION','POWER_IDE_GPU','POWER_IDE_DISPLAY','POWER_IDE_CAMERA','POWER_IDE_BLUETOOTH','POWER_IDE_FLASHLIGHT','POWER_IDE_AUDIO','POWER_IDE_WIFISCAN')
3394        and
3395        D2.data in ('APPNAME')
3396        GROUP BY
3397        S.serial,
3398        APP.app_key,
3399        D.data,
3400        D2.data
3401        UNION
3402        SELECT
3403        ( S.ts - TR.start_ts ) AS startNS,
3404        D1.data AS eventName,
3405        D2.data AS appKey,
3406        group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS eventValue
3407        FROM
3408        trace_range AS TR,
3409        hisys_event_measure AS S
3410        LEFT JOIN data_dict AS D1 ON D1.id = S.name_id
3411        LEFT JOIN app_name AS APP ON APP.id = S.key_id
3412        LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key
3413        where
3414        D1.data in ('POWER_IDE_CPU','POWER_IDE_LOCATION','POWER_IDE_GPU','POWER_IDE_DISPLAY','POWER_IDE_CAMERA','POWER_IDE_BLUETOOTH','POWER_IDE_FLASHLIGHT','POWER_IDE_AUDIO','POWER_IDE_WIFISCAN')
3415        and
3416        D2.data in ('CHARGE','BACKGROUND_TIME','SCREEN_ON_TIME','SCREEN_OFF_TIME','LOAD','USAGE','DURATION','CAMERA_ID',
3417        'FOREGROUND_COUNT','BACKGROUND_COUNT','SCREEN_ON_COUNT','SCREEN_OFF_COUNT','COUNT','UID','FOREGROUND_DURATION',
3418        'FOREGROUND_ENERGY','BACKGROUND_DURATION','BACKGROUND_ENERGY','SCREEN_ON_DURATION','SCREEN_ON_ENERGY',
3419        'SCREEN_OFF_DURATION','SCREEN_OFF_ENERGY','ENERGY')
3420        and
3421        (S.ts - TR.start_ts) >= $leftNS
3422        and (S.ts - TR.start_ts) <= $rightNS
3423        GROUP BY
3424        S.serial,
3425        APP.app_key,
3426        D1.data,
3427        D2.data
3428        ORDER BY
3429        eventName;`,
3430    { $leftNS: leftNs, $rightNS: rightNs }
3431  );
3432
3433export const getTabPowerBatteryData = (
3434  rightNs: number
3435): Promise<
3436  Array<{
3437    ts: number;
3438    eventName: string;
3439    appKey: string;
3440    eventValue: string;
3441  }>
3442> =>
3443  query(
3444    'getTabPowerBatteryData',
3445    `select
3446      MAX(S.ts) as ts,
3447      D.data as eventName,
3448      D2.data as appKey,
3449      group_concat((case when S.type==1 then S.string_value else S.int_value end), ',') as eventValue
3450      from
3451      trace_range AS TR,
3452      hisys_event_measure as S
3453      left join
3454      data_dict as D
3455      on
3456      D.id=S.name_id
3457      left join
3458      app_name as APP
3459      on
3460      APP.id=S.key_id
3461      left join
3462      data_dict as D2
3463      on
3464      D2.id=APP.app_key
3465      where
3466      D.data = 'POWER_IDE_BATTERY'
3467      and D2.data in ('GAS_GAUGE','CHARGE','SCREEN','LEVEL','CURRENT','CAPACITY','UID')
3468      and (S.ts - TR.start_ts) >= 0
3469      and (S.ts - TR.start_ts) <= $rightNS
3470      group by APP.app_key,D.data,D2.data;`,
3471    { $rightNS: rightNs }
3472  );
3473
3474export const queryMaxStateValue = (
3475  eventName: string
3476): Promise<
3477  Array<{
3478    type: string;
3479    maxValue: number;
3480  }>
3481> =>
3482  query(
3483    'queryMaxStateValue',
3484    `select
3485  D.data as type,
3486  max(S.int_value) as maxValue
3487  from trace_range AS TR,hisys_event_measure as S
3488  left join data_dict as D on D.id=S.name_id
3489  left join app_name as APP on APP.id=S.key_id
3490  left join data_dict as D2 on D2.id=APP.app_key
3491  where (case when 'SENSOR_STATE'==$eventName then D.data like '%SENSOR%' else D.data = $eventName end)
3492  and D2.data in ('BRIGHTNESS','STATE','VALUE','LEVEL','VOLUME','OPER_TYPE','VOLUME')
3493  group by APP.app_key,D.data,D2.data;`,
3494    { $eventName: eventName }
3495  );
3496
3497export const queryStateData = (eventName: string): Promise<Array<EnergyStateStruct>> =>
3498  query(
3499    'queryStateData',
3500    `select
3501  (S.ts-TR.start_ts) as startNs,
3502  D.data as type,
3503  D2.data as appKey,
3504  S.int_value as value
3505  from trace_range AS TR,hisys_event_measure as S
3506  left join data_dict as D on D.id=S.name_id
3507  left join app_name as APP on APP.id=S.key_id
3508  left join data_dict as D2 on D2.id=APP.app_key
3509  where (case when 'SENSOR_STATE'==$eventName then D.data like '%SENSOR%' else D.data = $eventName end)
3510  and D2.data in ('BRIGHTNESS','STATE','VALUE','LEVEL','VOLUME','OPER_TYPE','VOLUME')
3511  group by S.serial,APP.app_key,D.data,D2.data;`,
3512    { $eventName: eventName }
3513  );
3514
3515export const querySyseventAppName = (): Promise<
3516  Array<{
3517    string_value: string | null;
3518  }>
3519> =>
3520  query(
3521    'querySyseventAppName',
3522    `
3523    SELECT
3524    DISTINCT hisys_event_measure.string_value from data_dict
3525    left join app_name on app_name.app_key=data_dict.id
3526    left join hisys_event_measure on hisys_event_measure.key_id = app_name.id
3527    where data_dict.data = "APPNAME"`
3528  );
3529
3530export const queryAnomalyDetailedData = (leftNs: number, rightNs: number): Promise<Array<EnergyAnomalyStruct>> =>
3531  query<EnergyAnomalyStruct>(
3532    'queryAnomalyDetailedData',
3533    `select
3534  S.ts,
3535  D.data as eventName,
3536  D2.data as appKey,
3537  group_concat((case when S.type==1 then S.string_value else S.int_value end), ',') as Value
3538  from trace_range AS TR,hisys_event_measure as S
3539  left join data_dict as D on D.id=S.name_id
3540  left join app_name as APP on APP.id=S.key_id
3541  left join data_dict as D2 on D2.id=APP.app_key
3542  where D.data in ('ANOMALY_SCREEN_OFF_ENERGY','ANOMALY_ALARM_WAKEUP','ANOMALY_KERNEL_WAKELOCK',
3543  'ANOMALY_RUNNINGLOCK','ANORMALY_APP_ENERGY','ANOMALY_GNSS_ENERGY','ANOMALY_CPU_HIGH_FREQUENCY','ANOMALY_CPU_ENERGY','ANOMALY_WAKEUP')
3544  and D2.data in ('APPNAME')
3545  and (S.ts - TR.start_ts) >= $leftNS
3546   and (S.ts - TR.start_ts) <= $rightNS
3547  group by S.serial,APP.app_key,D.data,D2.data
3548  union
3549  select
3550  S.ts,
3551  D.data as eventName,
3552  D2.data as appKey,
3553  group_concat((case when S.type == 1 then S.string_value else S.int_value end), ',') as Value
3554  from trace_range AS TR,hisys_event_measure as S
3555  left join data_dict as D on D.id = S.name_id
3556  left join app_name as APP on APP.id = S.key_id
3557  left join data_dict as D2 on D2.id = APP.app_key
3558  where D.data in ('ANOMALY_SCREEN_OFF_ENERGY', 'ANOMALY_ALARM_WAKEUP', 'ANOMALY_KERNEL_WAKELOCK',
3559  'ANOMALY_RUNNINGLOCK', 'ANORMALY_APP_ENERGY', 'ANOMALY_GNSS_ENERGY', 'ANOMALY_CPU_HIGH_FREQUENCY', 'ANOMALY_CPU_ENERGY', 'ANOMALY_WAKEUP')
3560  and D2.data not in ('pid_', 'tid_', 'type_', 'tz_', 'uid_', 'domain_', 'id_', 'level_', 'info_', 'tag_', 'APPNAME')
3561  and (S.ts - TR.start_ts) >= $leftNS
3562  and (S.ts - TR.start_ts) <= $rightNS
3563  group by S.serial, APP.app_key, D.data, D2.data;`,
3564    { $leftNS: leftNs, $rightNS: rightNs }
3565  );
3566
3567export const querySmapsExits = (): Promise<Array<any>> =>
3568  query(
3569    'querySmapsExits',
3570    `select
3571      event_name
3572      from stat s
3573      where s.event_name = 'trace_smaps'
3574      and s.stat_type ='received' and s.count > 0`
3575  );
3576
3577export const querySmapsData = (columnName: string): Promise<Array<any>> =>
3578  query(
3579    'querySmapsCounterData',
3580    `SELECT (A.timestamp - B.start_ts) as startNS, sum(${columnName}) as value FROM smaps A,trace_range B GROUP by A.timestamp;`
3581  );
3582
3583export const querySmapsDataMax = (columnName: string): Promise<Array<any>> =>
3584  query(
3585    'querySmapsDataMax',
3586    `
3587   SELECT (A.timestamp - B.start_ts) as startNS,sum(${columnName}) as max_value FROM smaps A,trace_range B GROUP by A.timestamp order by max_value desc LIMIT 1`
3588  );
3589
3590export const getTabSmapsMaxRss = (leftNs: number, rightNs: number): Promise<Array<any>> =>
3591  query<Smaps>(
3592    'getTabSmapsMaxRss',
3593    `
3594SELECT (A.timestamp - B.start_ts) as startNS, sum(resident_size) as max_value FROM smaps A,trace_range B where startNS <= $rightNs`,
3595    { $rightNs: rightNs }
3596  );
3597
3598export const getTabSmapsData = (leftNs: number, rightNs: number): Promise<Array<Smaps>> =>
3599  query<Smaps>(
3600    'getTabSmapsData',
3601    `
3602    SELECT
3603     (A.timestamp - t.start_ts) AS tsNS,
3604     start_addr,
3605     end_addr,
3606     dirty,
3607     swapper,
3608     resident_size AS rss,
3609     pss,virtaul_size AS size,reside,f.data AS permission,d.data AS path
3610     FROM smaps A
3611     LEFT JOIN data_dict d ON a.path_id = d.id LEFT
3612     JOIN data_dict f ON a.protection_id = f.id,
3613     trace_range AS t
3614     WHERE tsNS <= $rightNs`,
3615    { $rightNs: rightNs },
3616    'exec'
3617  );
3618
3619export const getTabVirtualMemoryType = (startTime: number, endTime: number): Promise<Array<string>> =>
3620  query(
3621    'getTabVirtualMemoryType',
3622    `
3623    SELECT type from paged_memory_sample s,trace_range t
3624     WHERE s.end_ts between $startTime + t.start_ts and $endTime + t.start_ts group by type`,
3625    { $startTime: startTime, $endTime: endTime },
3626    'exec'
3627  );
3628
3629export const getTabIoCompletionTimesType = (startTime: number, endTime: number): Promise<Array<string>> =>
3630  query(
3631    'getTabIoCompletionTimesType',
3632    `
3633    SELECT tier from bio_latency_sample s,trace_range t
3634     WHERE s.start_ts + s.latency_dur between $startTime + t.start_ts and $endTime + t.start_ts group by tier`,
3635    { $startTime: startTime, $endTime: endTime },
3636    'exec'
3637  );
3638
3639export const getCpuLimitFreqId = (): Promise<Array<CpuFreqRowLimit>> =>
3640  query(
3641    'getCpuMaxMinFreqId',
3642    `
3643    select cpu,MAX(iif(name = 'cpu_frequency_limits_max',id,0)) as maxFilterId,MAX(iif(name = 'cpu_frequency_limits_min',id,0)) as minFilterId from cpu_measure_filter where name in ('cpu_frequency_limits_max','cpu_frequency_limits_min') group by cpu
3644`,
3645    {}
3646  );
3647
3648export const getCpuLimitFreqMax = (filterIds: string): Promise<Array<any>> => {
3649  return query(
3650    'getCpuLimitFreqMax',
3651    `
3652    select max(value) as maxValue,filter_id as filterId from measure where filter_id in (${filterIds}) group by filter_id
3653`,
3654    {}
3655  );
3656};
3657
3658export const getCpuLimitFreq = (maxId: number, minId: number, cpu: number): Promise<Array<CpuFreqLimitsStruct>> =>
3659  query(
3660    'getCpuLimitFreq',
3661    `
3662    select ts - T.start_ts as startNs,dur,max(value) as max,min(value) as min,$cpu as cpu from measure,trace_range T where filter_id in ($maxId,$minId) group by ts
3663`,
3664    { $maxId: maxId, $minId: minId, $cpu: cpu }
3665  );
3666
3667export const queryHisystemEventExits = (): Promise<Array<any>> =>
3668  query(
3669    'queryHisystemEventExits',
3670    `select
3671      event_name
3672      from stat s
3673      where s.event_name = 'trace_hisys_event'
3674      and s.stat_type ='received' and s.count > 0`
3675  );
3676
3677export const queryEbpfSamplesCount = (startTime: number, endTime: number, ipids: number[]): Promise<Array<any>> =>
3678  query(
3679    'queryEbpfSamplesCount',
3680    `
3681    select
3682fsCount,
3683    vmCount from
3684(select count(1) as fsCount from file_system_sample s,trace_range t where s.end_ts between $startTime + t.start_ts and $endTime + t.start_ts ${
3685      ipids.length > 0 ? `and s.ipid in (${ipids.join(',')})` : ''
3686    })
3687,(select count(1) as vmCount from paged_memory_sample s,trace_range t where s.end_ts between $startTime + t.start_ts and $endTime + t.start_ts ${
3688      ipids.length > 0 ? `and s.ipid in (${ipids.join(',')})` : ''
3689    });
3690`,
3691    { $startTime: startTime, $endTime: endTime }
3692  );
3693
3694export const querySysLockDetailsData = (rightNs: number, eventName: string): Promise<Array<SystemDetailsEnergy>> =>
3695  query(
3696    'querySysLockDetailsData',
3697    `SELECT
3698        ( S.ts - TR.start_ts ) AS ts,
3699        D.data AS eventName,
3700        D2.data AS appKey,
3701        group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS appValue
3702    FROM
3703        trace_range AS TR,
3704        hisys_event_measure AS S
3705        LEFT JOIN data_dict AS D ON D.id = S.name_id
3706        LEFT JOIN app_name AS APP ON APP.id = S.key_id
3707        LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key
3708    WHERE
3709        D.data in ($eventName)
3710    AND
3711        D2.data in ('UID', 'TYPE', 'WORKID', 'NAME', 'INTERVAL', 'TAG', 'STATE', 'STACK', 'APPNAME', 'MESSAGE', 'PID', 'LOG_LEVEL')
3712    AND
3713        (S.ts - TR.start_ts) <= $rightNS
3714    GROUP BY
3715        S.serial, APP.app_key, D.data, D2.data;`,
3716    { $rightNS: rightNs, $eventName: eventName }
3717  );
3718
3719export const queryStateInitValue = (eventName: string, keyName: string): Promise<Array<EnergyStateStruct>> =>
3720  query(
3721    'queryStateInitValue',
3722    `select
3723  0 as startNs,
3724  $eventName as type,
3725  '' as appKey,
3726  (case $keyName
3727  when 'brightness' then device_state.brightness
3728  when 'wifi' then device_state.wifi
3729  when 'bt_state' then device_state.bt_state
3730  when 'location' then device_state.location
3731  else 0 end) as value
3732  from device_state;`,
3733    { $eventName: eventName, $keyName: keyName }
3734  );
3735
3736export const querySysLocationDetailsData = (rightNs: number, eventName: string): Promise<Array<SystemDetailsEnergy>> =>
3737  query(
3738    'querySysLocationDetailsData',
3739    `SELECT
3740        ( S.ts - TR.start_ts ) AS ts,
3741        D.data AS eventName,
3742        D2.data AS appKey,
3743        group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS appValue
3744        FROM
3745        trace_range AS TR,
3746        hisys_event_measure AS S
3747        LEFT JOIN data_dict AS D ON D.id = S.name_id
3748        LEFT JOIN app_name AS APP ON APP.id = S.key_id
3749        LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key
3750        WHERE
3751        D.data in ($eventName)
3752        and
3753        D2.data in ('UID', 'TYPE', 'WORKID', 'NAME', 'INTERVAL', 'TAG', 'STATE', 'STACK', 'APPNAME', 'MESSAGE', 'PID', 'LOG_LEVEL')
3754        and (S.ts - TR.start_ts) <= $rightNS
3755        GROUP BY
3756        S.serial,
3757        APP.app_key,
3758        D.data,
3759        D2.data;`,
3760    { $rightNS: rightNs, $eventName: eventName }
3761  );
3762export const queryNativeMemoryRealTime = (): Promise<Array<any>> =>
3763  query(
3764    'queryNativeMemoryRealTime',
3765    `select cs.ts,cs.clock_name from datasource_clockid dc left join clock_snapshot cs on dc.clock_id = cs.clock_id where data_source_name = 'memory-plugin' or data_source_name = 'nativehook'
3766`,
3767    {}
3768  );
3769
3770export const queryBootTime = (): Promise<Array<any>> =>
3771  query(
3772    'queryBootTime',
3773    `select CS.ts -TR.start_ts as ts ,clock_name from clock_snapshot as CS ,trace_range as TR
3774      where clock_name = 'boottime'`,
3775    {}
3776  );
3777
3778export const queryConfigSysEventAppName = (): Promise<
3779  Array<{
3780    process_name: string;
3781  }>
3782> =>
3783  query(
3784    'queryConfigSysEventAppName',
3785    `
3786    SELECT value from trace_config where trace_source = 'hisys_event' and key = 'process_name'`
3787  );
3788
3789export const queryClockData = (): Promise<
3790  Array<{
3791    name: string;
3792    num: number;
3793    srcname: string;
3794  }>
3795> =>
3796  query(
3797    'queryClockData',
3798    `
3799    select name || ' Frequency' name, COUNT(*) num, name srcname
3800from (select id, name
3801      from clock_event_filter
3802      where type = 'clock_set_rate')
3803group by name
3804union
3805select name || ' State' name, COUNT(*) num, name srcname
3806from (select id, name
3807      from clock_event_filter
3808      where type != 'clock_set_rate')
3809group by name;
3810`
3811  );
3812
3813export const queryClockFrequency = (clockName: string): Promise<Array<ClockStruct>> =>
3814  query(
3815    'queryClockFrequency',
3816    `with freq as (  select measure.filter_id, measure.ts, measure.type, measure.value from clock_event_filter
3817left join measure
3818where clock_event_filter.name = $clockName and clock_event_filter.type = 'clock_set_rate' and clock_event_filter.id = measure.filter_id
3819order by measure.ts)
3820select freq.filter_id as filterId,freq.ts - r.start_ts as startNS,freq.type,freq.value from freq,trace_range r order by startNS`,
3821    { $clockName: clockName }
3822  );
3823
3824export const queryClockState = (clockName: string): Promise<Array<ClockStruct>> =>
3825  query(
3826    'queryClockState',
3827    `with state as (
3828select filter_id, ts, endts, endts-ts as dur, type, value from
3829(select measure.filter_id, measure.ts, lead(ts, 1, null) over( order by measure.ts) endts, measure.type, measure.value from clock_event_filter,trace_range
3830left join measure
3831where clock_event_filter.name = $clockName and clock_event_filter.type != 'clock_set_rate' and clock_event_filter.id = measure.filter_id
3832order by measure.ts))
3833select s.filter_id as filterId,s.ts-r.start_ts as startNS,s.type,s.value,s.dur from state s,trace_range r`,
3834    { $clockName: clockName }
3835  );
3836
3837export const queryScreenState = (): Promise<Array<ClockStruct>> =>
3838  query(
3839    'queryScreenState',
3840    `select m.type, m.ts-r.start_ts as startNS, value, filter_id  as filterId from measure m,trace_range r where filter_id in (select id from process_measure_filter where name = 'ScreenState')  order by startNS;
3841`
3842  );
3843
3844export const queryIrqList = (): Promise<Array<{ name: string; cpu: number }>> =>
3845  query('queryIrqList', `select cat as name,callid as cpu from irq where cat!= 'ipi' group by cat,callid`);
3846
3847export const queryIrqData = (callid: number, cat: string): Promise<Array<IrqStruct>> => {
3848  let sqlSoftIrq = `
3849    select i.ts - t.start_ts as startNS,i.dur,i.name,i.depth,argsetid as argSetId,i.id from irq i,
3850trace_range t where i.callid = ${callid} and i.cat = 'softirq'
3851    `;
3852  let sqlIrq = `
3853    select i.ts - t.start_ts as startNS,i.dur,
3854        case when i.cat = 'ipi' then 'IPI' || i.name else i.name end as name,
3855        i.depth,
3856        argsetid as argSetId,
3857        i.id
3858        from irq i,trace_range t
3859        where i.callid = ${callid} and ((i.cat = 'irq' and i.flag ='1') or i.cat = 'ipi')
3860    `;
3861  return query('queryIrqData', cat === 'irq' ? sqlIrq : sqlSoftIrq, {});
3862};
3863
3864export const queryAllJankProcess = (): Promise<
3865  Array<{
3866    pid: number;
3867  }>
3868> =>
3869  query(
3870    'queryAllJankProcess',
3871    `
3872        SELECT DISTINCT p.pid
3873        FROM frame_slice AS a
3874        LEFT JOIN process AS p ON a.ipid = p.ipid
3875        `
3876  );
3877
3878export const queryAllExpectedData = (): Promise<Array<any>> =>
3879  query(
3880    'queryAllExpectedData',
3881    `
3882        SELECT
3883            a.id,
3884            (a.ts - TR.start_ts) AS ts,
3885            a.vsync as name,
3886            a.type,
3887            a.dur,
3888            p.pid,
3889            p.name as cmdline
3890        FROM frame_slice AS a, trace_range AS TR
3891             LEFT JOIN process AS p ON a.ipid = p.ipid
3892        WHERE a.type = 1
3893          and (a.flag <> 2 or a.flag is null)
3894        ORDER BY a.ipid,ts;`
3895  );
3896
3897export const queryAllActualData = (): Promise<Array<any>> =>
3898  query(
3899    'queryAllActualData',
3900    `
3901        SELECT
3902               a.id,
3903               (a.ts - TR.start_ts) AS ts,
3904               a.vsync AS name,
3905               a.type,
3906               a.dur,
3907               a.src AS src_slice,
3908               a.flag AS jank_tag,
3909               a.dst AS dst_slice,
3910               p.pid,
3911               p.name AS cmdline,
3912               (case when p.name like '%render_service' then 'render_service' else 'app' end) as frame_type
3913        FROM frame_slice AS a, trace_range AS TR
3914                 LEFT JOIN process AS p ON a.ipid = p.ipid
3915        WHERE a.type = 0
3916          AND a.flag <> 2
3917        ORDER BY a.ipid, ts;`
3918  );
3919
3920export const queryActualFrameDate = (): Promise<Array<any>> =>
3921  query(
3922    'queryActualFrameDate',
3923    `SELECT
3924         sf.id,
3925         'frameTime' as frame_type,
3926         fs.ipid,
3927         fs.vsync as name,
3928         fs.dur as app_dur,
3929         (sf.ts + sf.dur - fs.ts) as dur,
3930         (fs.ts - TR.start_ts) AS ts,
3931         fs.type,
3932         (case when (sf.flag == 1 or fs.flag == 1 ) then 1  when (sf.flag == 3 or fs.flag == 3 ) then 3 else 0 end) as jank_tag,
3933         pro.pid,
3934         pro.name as cmdline,
3935         (sf.ts - TR.start_ts) AS rs_ts,
3936         sf.vsync AS rs_vsync,
3937         sf.dur AS rs_dur,
3938         sf.ipid AS rs_ipid,
3939         proc.pid AS rs_pid,
3940         proc.name AS rs_name
3941     FROM frame_slice AS fs
3942              LEFT JOIN process AS pro ON pro.id = fs.ipid
3943              LEFT JOIN frame_slice AS sf ON fs.dst = sf.id
3944              LEFT JOIN process AS proc ON proc.id = sf.ipid
3945              LEFT JOIN trace_range TR
3946     WHERE fs.dst IS NOT NULL
3947       AND fs.type = 0
3948       AND fs.flag <> 2
3949     UNION
3950     SELECT
3951         -1 as id,
3952         'frameTime' as frame_type,
3953         fs.ipid,
3954         fs.vsync  as name,
3955         fs.dur as app_dur,
3956         fs.dur,
3957         (fs.ts - TR.start_ts) AS ts,
3958         fs.type,
3959         fs.flag as jank_tag,
3960         pro.pid,
3961         pro.name as cmdline,
3962         NULL AS rs_ts,
3963         NULL AS rs_vsync,
3964         NULL AS rs_dur,
3965         NULL AS rs_ipid,
3966         NULL AS rs_pid,
3967         NULL AS rs_name
3968     FROM frame_slice AS fs
3969              LEFT JOIN process AS pro ON pro.id = fs.ipid
3970              LEFT JOIN trace_range TR
3971     WHERE fs.dst IS NULL
3972       AND pro.name NOT LIKE '%render_service%'
3973       AND fs.type = 0
3974       AND fs.flag <> 2
3975     ORDER BY ts;`
3976  );
3977
3978export const queryExpectedFrameDate = (): Promise<Array<any>> =>
3979  query(
3980    'queryExpectedFrameDate',
3981    `
3982    SELECT
3983        sf.id,
3984        'frameTime' as frame_type,
3985        fs.ipid,
3986        fs.vsync as name,
3987        fs.dur as app_dur,
3988        (sf.ts + sf.dur - fs.ts) as dur,
3989        (fs.ts - TR.start_ts) AS ts,
3990        fs.type,
3991        fs.flag,
3992        pro.pid,
3993        pro.name as cmdline,
3994        (sf.ts - TR.start_ts) AS rs_ts,
3995        sf.vsync AS rs_vsync,
3996        sf.dur AS rs_dur,
3997        sf.ipid AS rs_ipid,
3998        proc.pid AS rs_pid,
3999        proc.name AS rs_name
4000    FROM frame_slice AS fs
4001    LEFT JOIN process AS pro ON pro.id = fs.ipid
4002    LEFT JOIN frame_slice AS sf ON fs.dst = sf.id
4003    LEFT JOIN process AS proc ON proc.id = sf.ipid
4004    LEFT JOIN trace_range TR
4005    WHERE fs.dst IS NOT NULL
4006        AND fs.type = 1
4007    UNION
4008    SELECT
4009        -1 as id,
4010        'frameTime' as frame_type,
4011        fs.ipid,
4012        fs.vsync  as name,
4013        fs.dur as app_dur,
4014        fs.dur,
4015        (fs.ts - TR.start_ts) AS ts,
4016        fs.type,
4017        fs.flag,
4018        pro.pid,
4019        pro.name as cmdline,
4020        NULL AS rs_ts,
4021        NULL AS rs_vsync,
4022        NULL AS rs_dur,
4023        NULL AS rs_ipid,
4024        NULL AS rs_pid,
4025        NULL AS rs_name
4026    FROM frame_slice AS fs
4027    LEFT JOIN process AS pro ON pro.id = fs.ipid
4028    LEFT JOIN trace_range TR
4029    WHERE fs.dst IS NULL
4030    AND pro.name NOT LIKE '%render_service%'
4031    AND fs.type = 1
4032    ORDER BY ts;`
4033  );
4034
4035export const queryFlowsData = (src_slice: Array<string>): Promise<Array<any>> =>
4036  query(
4037    'queryFlowsData',
4038    `
4039    SELECT fs.vsync AS name,
4040        p.pid,
4041        p.name  AS cmdline,
4042        fs.type
4043    FROM frame_slice AS fs
4044    LEFT JOIN process AS p ON fs.ipid = p.ipid
4045    WHERE fs.type = 0
4046        AND fs.id IN (${src_slice.join(',')});`
4047  );
4048
4049export const queryPrecedingData = (dst_slice: string): Promise<Array<any>> =>
4050  query(
4051    'queryFlowsData',
4052    `
4053        SELECT a.vsync AS name,
4054               p.pid,
4055               p.name  AS cmdline,
4056               a.type
4057        FROM frame_slice AS a
4058                 LEFT JOIN process AS p ON a.ipid = p.ipid
4059        WHERE a.type = 0
4060          AND a.id = $dst_slice;`,
4061    { $dst_slice: dst_slice }
4062  );
4063
4064export const queryFrameTimeData = (): Promise<Array<any>> =>
4065  query(
4066    'queryFrameTimeData',
4067    `
4068        SELECT DISTINCT p.pid
4069        FROM frame_slice AS a
4070            LEFT JOIN process AS p
4071            ON a.ipid = p.ipid;`
4072  );
4073
4074export const queryGpuDur = (id: number): Promise<any> =>
4075  query(
4076    'queryGpuDur',
4077    `
4078        SELECT dur AS gpu_dur
4079        FROM gpu_slice
4080        WHERE frame_row = $id;`,
4081    { $id: id }
4082  );
4083
4084export const queryHeapFile = (): Promise<Array<FileInfo>> =>
4085  query(
4086    'queryHeapFile',
4087    `SELECT f.id, f.file_name as name, f.start_time as startTs, f.end_time as endTs, f.pid, f.self_size as size
4088    FROM js_heap_files f,trace_range t
4089    WHERE (t.end_ts >= f.end_time and f.file_name != 'Timeline')
4090    OR f.file_name = 'Timeline'`
4091  );
4092
4093export const queryHeapInfo = (fileId: number): Promise<Array<any>> =>
4094  query(
4095    'queryHeapInfo',
4096    `SELECT file_id as fileId, key, type, int_value as intValue, str_value as strValue
4097      FROM js_heap_info WHERE file_id = ${fileId}`
4098  );
4099
4100export const queryHeapNode = (fileId: number): Promise<Array<HeapNode>> =>
4101  query(
4102    'queryHeapNode',
4103    `SELECT node_index as nodeIndex,type,name as nameIdx,id,self_size as selfSize,edge_count as edgeCount,trace_node_id as traceNodeId,detachedness
4104      FROM js_heap_nodes WHERE file_id = ${fileId}`
4105  );
4106
4107export const queryHeapEdge = (fileId: number): Promise<Array<HeapEdge>> =>
4108  query(
4109    'queryHeapEdge',
4110    `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
4111      FROM js_heap_edges WHERE file_id = ${fileId}`
4112  );
4113
4114export const queryHeapFunction = (fileId: number): Promise<Array<HeapTraceFunctionInfo>> =>
4115  query(
4116    'queryHeapFunction',
4117    `SELECT function_index as index ,function_id as id ,name,script_name as scriptName,script_id as scriptId,line,column
4118      FROM js_heap_trace_function_info WHERE file_id = ${fileId}`
4119  );
4120
4121export const queryHeapTraceNode = (fileId: number): Promise<Array<any>> =>
4122  query(
4123    'queryHeapTraceNode',
4124    `SELECT F.name,
4125        F.script_name as scriptName,
4126        F.script_id as scriptId,
4127        F.column,
4128        F.line,
4129        N.id,
4130        N.function_info_index as functionInfoIndex,
4131        N.parent_id as parentId,
4132        N.count,
4133        N.size,
4134        IFNULL( S.live_count, 0 ) AS liveCount,
4135        IFNULL( S.live_size, 0 ) AS liveSize
4136    FROM
4137        js_heap_trace_node N
4138        LEFT JOIN (
4139            SELECT
4140                trace_node_id as traceNodeId,
4141                SUM( self_size ) AS liveSize,
4142                count( * ) AS liveCount
4143            FROM
4144                js_heap_nodes
4145            WHERE
4146                file_id = ${fileId}
4147                AND trace_node_id != 0
4148            GROUP BY
4149                trace_node_id
4150        ) S ON N.id = S.trace_node_id
4151    LEFT JOIN js_heap_trace_function_info F ON (F.file_id = N.file_id
4152                AND F.function_index = N.function_info_index)
4153    WHERE
4154        N.file_id = ${fileId}
4155    ORDER BY
4156        N.id`
4157  );
4158
4159export const queryHeapSample = (fileId: number): Promise<Array<HeapSample>> =>
4160  query(
4161    'queryHeapSample',
4162    `SELECT timestamp_us as timestamp , last_assigned_id as lastAssignedId, 0 as size
4163      FROM js_heap_sample WHERE file_id = ${fileId}`
4164  );
4165
4166export const queryHeapLocation = (fileId: number): Promise<Array<HeapLocation>> =>
4167  query(
4168    'queryHeapLocation',
4169    `SELECT object_index as objectIndex,script_id as scriptId ,column
4170      FROM js_heap_location WHERE file_id = ${fileId}`
4171  );
4172
4173export const queryHeapString = (fileId: number): Promise<Array<any>> =>
4174  query(
4175    'queryHeapString',
4176    `SELECT string
4177      FROM js_heap_string WHERE file_id = ${fileId}`
4178  );
4179export const queryTraceRange = (): Promise<Array<any>> =>
4180  query('queryTraceRange', `SELECT t.start_ts as startTs, t.end_ts as endTs FROM trace_range t`);
4181
4182export const queryHiPerfProcessCount = (
4183  leftNs: number,
4184  rightNs: number,
4185  cpus: Array<number>,
4186  threads: Array<number>,
4187  processes: Array<number>
4188): Promise<Array<any>> => {
4189  let str = '';
4190  if (processes.length > 0) {
4191    str = ` and C.process_id in (${processes.join(',')})`;
4192  }
4193  if (threads.length > 0) {
4194    str = ` and A.thread_id in (${threads.join(',')}) `;
4195  }
4196  if (processes.length > 0 && threads.length > 0) {
4197    str = ` and (C.process_id in (${processes.join(',')}) or A.thread_id in (${threads.join(',')}))`;
4198  }
4199  if (cpus.length > 0) {
4200    str = ` and A.cpu_id in (${cpus.join(',')})`;
4201  }
4202  if (cpus.length > 0 && processes.length > 0) {
4203    str = ` and (C.process_id in (${processes.join(',')}) or A.cpu_id in (${cpus.join(',')}))`;
4204  }
4205  return query(
4206    'queryHiPerfProcessCount',
4207    `
4208    select     C.process_id as pid,
4209               (A.timestamp_trace - R.start_ts) as time,
4210               C.thread_name as threadName,
4211               A.thread_id as tid,
4212               A.id,
4213               A.callchain_id
4214        from perf_sample A,trace_range R
4215             left join perf_thread C on A.thread_id = C.thread_id  and  A.thread_id != 0
4216        where time >= $leftNs and time <= $rightNs and A.callchain_id > 0
4217        ${str}
4218    `,
4219    { $leftNs: leftNs, $rightNs: rightNs }
4220  );
4221};
4222
4223export const queryConcurrencyTask = (funName: string, selectStartTime: number, selectEndTime: number) =>
4224  query<TaskTabStruct>(
4225    'queryConcurrencyTask',
4226    `SELECT thread.tid,
4227            thread.ipid,
4228            callstack.name                AS funName,
4229            callstack.ts                  AS startTs,
4230            callstack.dur,
4231            callstack.id,
4232            task_pool.priority,
4233            task_pool.allocation_task_row AS allocationTaskRow,
4234            task_pool.execute_task_row    AS executeTaskRow,
4235            task_pool.return_task_row     AS returnTaskRow,
4236            task_pool.execute_id          AS executeId
4237     FROM thread
4238            LEFT JOIN callstack ON thread.id = callstack.callid
4239            LEFT JOIN task_pool ON callstack.id = task_pool.execute_task_row
4240     WHERE ipid = (SELECT thread.ipid
4241                   FROM thread
4242                          LEFT JOIN callstack ON thread.id = callstack.callid
4243                   WHERE callstack.name = $funName)
4244       AND thread.name = 'TaskWorkThread'
4245       AND -- 左包含
4246           ($selectStartTime <= callstack.ts AND $selectEndTime > callstack.ts AND callstack.name LIKE 'H:Task Perform:%')
4247        OR -- 右包含
4248       ($selectStartTime < callstack.ts + callstack.dur AND $selectEndTime >= callstack.ts + callstack.dur AND callstack.name LIKE 'H:Task Perform:%')
4249        OR -- 包含
4250       ($selectStartTime >= callstack.ts AND $selectEndTime <= callstack.ts + callstack.dur AND callstack.name LIKE 'H:Task Perform:%')
4251        OR -- 被包含
4252       ($selectStartTime <= callstack.ts AND $selectEndTime >= callstack.ts + callstack.dur AND callstack.name LIKE 'H:Task Perform:%')
4253     ORDER BY callstack.ts;`,
4254    { $funName: funName, $selectStartTime: selectStartTime, $selectEndTime: selectEndTime}
4255  );
4256
4257export const queryBySelectExecute = (
4258  executeId: string
4259): Promise<
4260  Array<{
4261    tid: number;
4262    allocation_task_row: number;
4263    execute_task_row: number;
4264    return_task_row: number;
4265    priority: number;
4266  }>
4267> => {
4268  let sqlStr = `SELECT thread.tid,
4269                       task_pool.allocation_task_row,
4270                       task_pool.execute_task_row,
4271                       task_pool.return_task_row,
4272                       task_pool.priority
4273                FROM task_pool
4274                       LEFT JOIN callstack ON callstack.id = task_pool.allocation_task_row
4275                       LEFT JOIN thread ON thread.id = callstack.callid
4276                WHERE task_pool.execute_id = $executeId;
4277    `;
4278  return query('queryBySelectExecute', sqlStr, { $executeId: executeId });
4279};
4280
4281export const queryBySelectAllocationOrReturn = (
4282  executeId: string
4283): Promise<
4284  Array<{
4285    tid: number;
4286    allocation_task_row: number;
4287    execute_task_row: number;
4288    return_task_row: number;
4289    priority: number;
4290  }>
4291> => {
4292  let sqlStr = `SELECT thread.tid,
4293                       task_pool.allocation_task_row,
4294                       task_pool.execute_task_row,
4295                       task_pool.return_task_row,
4296                       task_pool.priority
4297                FROM task_pool
4298                       LEFT JOIN callstack ON callstack.id = task_pool.execute_task_row
4299                       LEFT JOIN thread ON thread.id = callstack.callid
4300                WHERE task_pool.execute_task_row IS NOT NULL AND task_pool.execute_id = $executeId;
4301    `;
4302  return query('queryBySelectAllocationOrReturn', sqlStr, { $executeId: executeId });
4303};
4304
4305export const queryTaskListByExecuteTaskIds = (executeTaskIds: Array<number>): Promise<Array<TaskTabStruct>> => {
4306  let sqlStr = `
4307  SELECT
4308    task_pool.allocation_task_row as allocationTaskRow,
4309    task_pool.execute_task_row as executeTaskRow,
4310    task_pool.return_task_row as returnTaskRow,
4311    task_pool.execute_id as executeId,
4312    task_pool.priority
4313  FROM task_pool
4314         LEFT JOIN callstack ON callstack.id = task_pool.allocation_task_row
4315  WHERE task_pool.execute_id IN (${executeTaskIds.join(',')}) AND task_pool.execute_task_row IS NOT NULL;
4316    `;
4317  return query('queryTaskListByExecuteTaskIds', sqlStr, { $executeTaskIds: executeTaskIds });
4318};
4319
4320export const queryTaskPoolCallStack = (): Promise<Array<{ id: number; ts: number; dur: number; name: string }>> => {
4321  let sqlStr = `select * from callstack where name like 'H:Task%';`;
4322  return query('queryTaskPoolCallStack', sqlStr, {});
4323};
4324
4325
4326export const queryTaskPoolTotalNum = (funName: string) =>
4327    query<number>(
4328        'queryTaskPoolTotalNum',
4329        `SELECT thread.tid
4330         FROM thread
4331                LEFT JOIN callstack ON thread.id = callstack.callid
4332         WHERE ipid = (SELECT thread.ipid
4333                       FROM thread
4334                              LEFT JOIN callstack ON thread.id = callstack.callid
4335                       WHERE callstack.name = $funName)
4336           AND thread.name = 'TaskWorkThread'
4337         GROUP BY thread.tid;`,
4338        { $funName: funName}
4339    );
4340