• 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'
17import {CpuStruct} from "../bean/CpuStruct.js";
18import {CpuFreqStruct} from "../bean/CpuFreqStruct.js";
19import {ThreadStruct} from "../bean/ThreadStruct.js";
20import {ProcessMemStruct} from "../bean/ProcessMemStruct.js";
21import {Counter, Fps, SelectionData} from "../bean/BoxSelection.js";
22import {FuncStruct} from "../bean/FuncStruct.js";
23import {WakeUpTimeBean} from "../bean/WakeUpTimeBean.js";
24import {WakeupBean} from "../bean/WakeupBean.js";
25import {BinderArgBean} from "../bean/BinderArgBean.js";
26import {FpsStruct} from "../bean/FpsStruct.js";
27import {SPT, SPTChild} from "../bean/StateProcessThread.js";
28import {CpuUsage, Freq} from "../bean/CpuUsage.js";
29import {HeapTreeDataBean} from "../bean/HeapTreeDataBean.js";
30import {
31    NativeEvent,
32    NativeEventHeap,
33    NativeHookMalloc,
34    NativeHookProcess,
35    NativeHookSampleQueryInfo,
36    NativeHookStatistics
37} from "../bean/NativeHook.js";
38import {
39    LiveProcess,
40    ProcessHistory,
41    SystemCpuSummary,
42    SystemDiskIOSummary,
43    SystemNetworkSummary
44} from "../bean/AbilityMonitor.js";
45import {NetworkAbilityMonitorStruct} from "../bean/NetworkAbilityMonitorStruct.js";
46import {DiskAbilityMonitorStruct} from "../bean/DiskAbilityMonitorStruct.js";
47import {MemoryAbilityMonitorStruct} from "../bean/MemoryAbilityMonitorStruct.js";
48import {CpuAbilityMonitorStruct} from "../bean/CpuAbilityMonitorStruct.js";
49import {
50    PerfCall,
51    PerfCallChain,
52    PerfCmdLine,
53    PerfFile,
54    PerfSample,
55    PerfStack,
56    PerfThread
57} from "../bean/PerfProfile.js";
58import {SearchFuncBean} from "../bean/SearchFuncBean.js";
59import {info} from "../../log/Log.js";
60import {CounterStruct, SdkSliceStruct} from "../bean/SdkStruct.js";
61import {CounterSummary, SdkSliceSummary} from "../bean/SdkSummary.js";
62import {
63    EnergyAnomalyStruct,
64    EnergyPowerStruct,
65    EnergyStateStruct,
66    EnergySystemStruct,
67    PowerBatteryEnergy,
68    PowerDetailsEnergy, SystemDetailsEnergy
69} from "../bean/EnergyStruct.js";
70import {Smaps} from "../bean/SmapsStruct.js";
71import {CpuFreqRowLimit} from "../component/chart/SpFreqChart.js";
72import {CpuFreqLimitsStruct} from "./ui-worker/ProcedureWorkerCpuFreqLimits.js";
73
74class DbThread extends Worker {
75    busy: boolean = false;
76    isCancelled: boolean = false;
77    id: number = -1;
78    taskMap: any = {};
79    cacheArray: Array<any> = [];
80
81    uuid(): string {
82        // @ts-ignore
83        return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11)
84            .replace(/[018]/g, (c: any) => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));
85    }
86
87    queryFunc(name: string, sql: string, args: any, handler: Function, action: string | null) {
88        this.busy = true;
89        let id = this.uuid();
90        this.taskMap[id] = handler
91        let msg = {
92            id: id,
93            name: name,
94            action: action || "exec",
95            sql: sql,
96            params: args,
97        }
98        this.postMessage(msg);
99    }
100
101    dbOpen = async (sdkWasmConfig?:string): Promise<{ status: boolean, msg: string, buffer: ArrayBuffer, sdkConfigMap: any}> => {
102        return new Promise<any>((resolve, reject) => {
103            let id = this.uuid();
104            this.taskMap[id] = (res: any) => {
105                if (res.init) {
106                    resolve({status: res.init, msg: res.msg, sdkConfigMap:res.configSqlMap, buffer: res.buffer});
107                } else {
108                    resolve({status: res.init, msg: res.msg});
109                }
110            }
111            this.postMessage({
112                id: id,
113                action: "open",
114                wasmConfig: sdkWasmConfig,
115                buffer: DbPool.sharedBuffer!, /*Optional. An ArrayBuffer representing an SQLite Database file*/
116            }, [DbPool.sharedBuffer!]);
117        })
118    }
119}
120
121export class DbPool {
122    static sharedBuffer: ArrayBuffer | null = null;
123    maxThreadNumber: number = 0;
124    works: Array<DbThread> = [];
125    progress: Function | undefined | null;
126    num = Math.floor(Math.random() * 10 + 1) + 20;
127    init = async (type: string, threadBuild: (() => DbThread) | undefined = undefined) => { // wasm | server | sqlite
128        await this.close();
129        if (type === "wasm") {
130            this.maxThreadNumber = 1;
131        } else if (type === "server") {
132            this.maxThreadNumber = 1;
133        } else if (type === "sqlite") {
134            this.maxThreadNumber = 1;
135        } else if (type === "duck") {
136            this.maxThreadNumber = 1;
137        }
138        for (let i = 0; i < this.maxThreadNumber; i++) {
139            let thread: DbThread
140            if (threadBuild) {
141                thread = threadBuild()
142            } else {
143                if (type === "wasm") {
144                    thread = new DbThread("trace/database/TraceWorker.js")
145                } else if (type === "server") {
146                    thread = new DbThread("trace/database/SqlLiteWorker.js")
147                } else if (type === "sqlite") {
148                    thread = new DbThread("trace/database/SqlLiteWorker.js")
149                }
150            }
151            thread!.onmessage = (event: MessageEvent) => {
152                thread.busy = false;
153                if (Reflect.has(thread.taskMap, event.data.id)) {
154                    if (event.data.results) {
155                        let fun = thread.taskMap[event.data.id];
156                        if (fun) {
157                            fun(event.data.results);
158                        }
159                        Reflect.deleteProperty(thread.taskMap, event.data.id);
160                    } else if (Reflect.has(event.data, 'ready')) {
161                        this.progress!("database opened", this.num + event.data.index)
162                    } else if (Reflect.has(event.data, 'init')) {
163                        this.progress!("database ready", 40)
164                        let fun = thread.taskMap[event.data.id];
165                        if (fun) {
166                            fun(event.data)
167                        }
168                        Reflect.deleteProperty(thread.taskMap, event.data.id)
169                    } else {
170                        let fun = thread.taskMap[event.data.id];
171                        if (fun) {
172                            fun([])
173                        }
174                        Reflect.deleteProperty(thread.taskMap, event.data.id)
175                    }
176
177                }
178            }
179            thread!.onmessageerror = e => {
180            }
181            thread!.onerror = e => {
182            }
183            thread!.id = i;
184            thread!.busy = false;
185            this.works?.push(thread!);
186        }
187    }
188
189    initServer = async (url: string, progress: Function) => {
190        this.progress = progress;
191        progress("database loaded", 15)
192        let buf = await fetch(url).then(res => res.arrayBuffer());
193        DbPool.sharedBuffer = buf;
194        progress("open database", 20)
195        for (let i = 0; i < this.works.length; i++) {
196            let thread = this.works[i];
197            let {status, msg} = await thread.dbOpen()
198            if (!status) {
199                return {status, msg}
200            }
201        }
202        return {status: true, msg: "ok"};
203    }
204    initSqlite = async (buf: ArrayBuffer, sdkWasmConfig: string, progress: Function) => {
205        this.progress = progress;
206        progress("database loaded", 15)
207        DbPool.sharedBuffer = buf;
208        progress("parse database", 20)
209        let configMap;
210        for (let i = 0; i < this.works.length; i++) {
211            let thread = this.works[i];
212            let {status, msg, buffer, sdkConfigMap} = await thread.dbOpen(sdkWasmConfig)
213            if (!status) {
214                return {status, msg}
215            } else {
216                configMap = sdkConfigMap;
217                DbPool.sharedBuffer = buffer;
218            }
219        }
220        return {status: true, msg: "ok", sdkConfigMap: configMap};
221    }
222
223    close = async () => {
224        for (let i = 0; i < this.works.length; i++) {
225            let thread = this.works[i];
226            thread.terminate();
227        }
228        this.works.length = 0;
229    }
230
231    submit(name: string, sql: string, args: any, handler: Function, action: string | null) {
232        let noBusyThreads = this.works.filter(it => !it.busy);
233        let thread: DbThread
234        if (noBusyThreads.length > 0) { //取第一个空闲的线程进行任务
235            thread = noBusyThreads[0];
236            thread.queryFunc(name, sql, args, handler, action)
237        } else { // 随机插入一个线程中
238            thread = this.works[Math.floor(Math.random() * this.works.length)]
239            thread.queryFunc(name, sql, args, handler, action)
240        }
241    }
242}
243
244export const threadPool = new DbPool()
245
246export function query<T extends any>(name: string, sql: string, args: any = null, action: string | null = null): Promise<Array<T>> {
247    return new Promise<Array<T>>((resolve, reject) => {
248        threadPool.submit(name, sql, args, (res: any) => {
249            resolve(res)
250        }, action);
251    })
252}
253
254export const queryEventCountMap = ():Promise<Array<{
255    eventName:string,
256    count:number
257}>> => query("queryEventCountMap",`select event_name as eventName,count from stat where stat_type = 'received';`);
258
259export const queryProcess = (): Promise<Array<{
260    pid: number | null
261    processName: string | null
262}>> =>
263    query("queryProcess", `
264    SELECT
265      pid, processName
266    FROM
267      temp_query_process where pid != 0`)
268
269export const queryProcessByTable = (): Promise<Array<{
270    pid: number | null
271    processName: string | null
272}>> =>
273    query("queryProcessByTable", `
274    SELECT
275      pid, name as processName
276    FROM
277      process where pid != 0`)
278
279export const queryProcessAsyncFunc = ():Promise<Array<any>> => query("queryProcessAsyncFunc",`
280select tid,
281    P.pid,
282    A.name as threadName,
283    is_main_thread,
284    c.callid as track_id,
285    c.ts-D.start_ts as startTs,
286    c.dur,
287    c.name as funName,
288    c.parent_id,
289    c.id,
290    c.cookie,
291    c.depth,
292    c.argsetid
293from thread A,trace_range D
294left join callstack C on A.id = C.callid
295left join process P on P.id = A.ipid
296where startTs not null and cookie not null ;`, {})
297
298export const queryTotalTime = (): Promise<Array<{ total: number ,recordStartNS:number,recordEndNS:number}>> =>
299    query("queryTotalTime", `
300    select
301      start_ts as recordStartNS,end_ts as recordEndNS,end_ts-start_ts as total
302    from
303      trace_range;`)
304
305export const getAsyncEvents = (): Promise<Array<any>> =>
306    query("getAsyncEvents", `
307    select
308      *,
309      p.pid as pid,
310      c.ts - t.start_ts as "startTime"
311    from
312      callstack c,trace_range t
313    left join
314      process p
315    on
316      c.callid = p.id
317    where
318      cookie is not null;`)
319
320export const getCpuUtilizationRate = (startNS: number, endNS: number): Promise<Array<{
321    cpu: number
322    ro: number
323    rate: number
324}>> =>
325    query("getCpuUtilizationRate", `
326    with cpu as (
327    select
328      cpu,
329      ts,
330      dur,
331      (case when ro < 99 then ro else 99 end) as ro ,
332      (case when ro < 99 then stime+ro*cell else stime + 99 * cell end) as st,
333      (case when ro < 99 then stime + (ro+1)*cell else etime end) as et
334    from (
335        select
336          cpu,
337          ts,
338          A.dur,
339          ((ts+A.dur)-D.start_ts)/((D.end_ts-D.start_ts)/100) as ro,
340          D.start_ts as stime,
341          D.end_ts etime,
342          (D.end_ts-D.start_ts)/100 as cell
343        from
344          sched_slice A
345        left join
346          trace_range D
347        left join
348          thread B on A.itid = B.id
349        left join
350          process C on B.ipid = C.id
351        where
352          tid != 0
353        and (A.ts)
354          between D.start_ts and D.end_ts))
355    select cpu,ro,
356       sum(case
357               when ts <= st and ts + dur <= et then (ts + dur - st)
358               when ts <= st and ts + dur > et then et-st
359               when ts > st and ts + dur <= et then dur
360               when ts > st and ts + dur > et then et - ts end)/cast(et-st as float) as rate
361    from cpu
362    group by cpu,ro;`, {})
363
364export const getFps = () =>
365    query<FpsStruct>("getFps", `
366    select
367      distinct(ts-tb.start_ts) as startNS, fps
368    from
369      hidump c ,trace_range tb
370    where
371      startNS >= 0
372    --order by startNS;
373    `, {})
374
375export const getFunDataByTid = (tid: number): Promise<Array<FuncStruct>> =>
376    query("getFunDataByTid", `
377    select
378    --tid,
379    --A.name as threadName,
380    c.ts-D.start_ts as startTs,
381    c.dur,
382    c.name as funName,
383    c.argsetid,
384    c.depth
385from thread A,trace_range D
386left join callstack C on A.id = C.callid
387where startTs not null and c.cookie is null and tid = $tid`, {$tid: tid})
388
389export const getStatesProcessThreadDataByRange = (leftNs: number, rightNs: number): Promise<Array<SPT>> =>
390    query<SPT>("getStatesProcessThreadDataByRange", `
391    select
392      IP.name as process,
393      IP.pid as processId,
394      A.name as thread,
395      B.state as state,
396      A.tid as threadId,
397      B.dur,
398      (B.ts - TR.start_ts + B.dur) as end_ts,
399      (B.ts - TR.start_ts) as start_ts,
400      B.cpu
401    from
402      thread_state as B
403    left join thread as A on B.itid = A.id
404    left join process as IP on A.ipid = IP.id
405    left join trace_range as TR
406    where B.dur > 0
407    and IP.pid not null
408    and (B.ts - TR.start_ts) >= $leftNs
409    and (B.ts - TR.start_ts + B.dur) <= $rightNs
410`, {$leftNs:leftNs,$rightNs:rightNs});
411
412export const getTabBoxChildData = (leftNs: number, rightNs: number, state: string | undefined,
413                                   processId: number | undefined, threadId: number | undefined): Promise<Array<SPTChild>> =>
414    query<SPTChild>("getTabBoxChildData", `
415    select
416      IP.name as process,
417      IP.pid as processId,
418      A.name as thread,
419      B.state as state,
420      A.tid as threadId,
421      B.dur as duration,
422      B.ts - TR.start_ts as startNs,
423      B.cpu,
424      C.priority
425    from
426      thread_state AS B
427    left join
428      thread as A
429    on
430      B.itid = A.id
431    left join
432      process AS IP
433    on
434      A.ipid = IP.id
435    left join
436      trace_range AS TR
437    left join
438      sched_slice as C
439    on
440      B.itid = C.itid
441    and
442      C.ts = B.ts
443    where
444      B.dur > 0
445    and
446      IP.pid not null
447    and
448      not ((B.ts - TR.start_ts + B.dur < $leftNS) or (B.ts - TR.start_ts > $rightNS))
449      ${state != undefined && state != '' ? 'and B.state = $state' : ''}
450      ${processId != undefined && processId != -1 ? 'and IP.pid = $processID' : ''}
451      ${threadId != undefined && threadId != -1 ? 'and A.tid = $threadID' : ''}
452    `, {$leftNS: leftNs, $rightNS: rightNs, $state: state, $processID: processId, $threadID: threadId})
453
454export const getTabCpuUsage = (cpus: Array<number>, leftNs: number, rightNs: number): Promise<Array<CpuUsage>> =>
455    query<CpuUsage>("getTabCpuUsage", `
456    select
457      cpu,
458      sum(case
459        when (A.ts - B.start_ts) < $leftNS
460          then (A.ts - B.start_ts + A.dur - $leftNS)
461        when (A.ts - B.start_ts) >= $leftNS
462          and (A.ts - B.start_ts + A.dur) <= $rightNS
463          then A.dur
464        when (A.ts - B.start_ts + A.dur) > $rightNS
465          then ($rightNS - (A.ts - B.start_ts)) end) / cast($rightNS - $leftNS as float) as usage
466    from
467      thread_state A,
468      trace_range B
469    where
470      (A.ts - B.start_ts) > 0 and A.dur > 0
471    and
472      cpu in (${cpus.join(",")})
473    and
474      (A.ts - B.start_ts + A.dur) > $leftNS
475    and
476      (A.ts - B.start_ts) < $rightNS
477    group by
478      cpu`, {$leftNS: leftNs, $rightNS: rightNs})
479
480export const getTabCpuFreq = (cpus: Array<number>, leftNs: number, rightNs: number): Promise<Array<Freq>> =>
481    query<Freq>("getTabCpuFreq", `
482    select
483      cpu,
484      value,
485      (ts - tb.start_ts) as startNs
486    from
487      measure c,
488      trace_range tb
489    inner join
490      cpu_measure_filter t
491    on
492      c.filter_id = t.id
493    where
494      (name = 'cpufreq' or name='cpu_frequency')
495    and
496      cpu in (${cpus.join(",")})
497    and
498      startNs > 0
499    and
500      startNs < $rightNS
501    --order by startNs
502    `, {$leftNS: leftNs, $rightNS: rightNs})
503
504export const getTabFps = (leftNs: number, rightNs: number): Promise<Array<Fps>> =>
505    query<Fps>("getTabFps", `
506    select
507      distinct(ts-tb.start_ts) as startNS,
508      fps
509    from
510      hidump c,
511      trace_range tb
512    where
513      startNS <= $rightNS
514    and
515      startNS >= 0
516    --order by startNS;
517    `, {$leftNS: leftNs, $rightNS: rightNs})
518
519export const getTabCounters = (processFilterIds: Array<number>,virtualFilterIds:Array<number>, startTime: number) =>
520    query<Counter>("getTabCounters", `
521    select
522      t1.filter_id as trackId,
523      t2.name,
524      value,
525      t1.ts - t3.start_ts as startTime
526    from
527      process_measure t1
528    left join
529      process_measure_filter t2
530    on
531      t1.filter_id = t2.id
532    left join
533      trace_range t3
534    where
535      filter_id in (${processFilterIds.join(",")})
536    and
537      startTime <= $startTime
538union
539 select
540      t1.filter_id as trackId,
541      t2.name,
542      value,
543      t1.ts - t3.start_ts as startTime
544    from
545      sys_mem_measure t1
546    left join
547      sys_event_filter t2
548    on
549      t1.filter_id = t2.id
550    left join
551      trace_range t3
552    where
553      filter_id in (${virtualFilterIds.join(",")})
554    and
555      startTime <= $startTime
556    `, {$startTime: startTime})
557
558export const getTabVirtualCounters = (virtualFilterIds:Array<number>, startTime: number) =>
559    query<Counter>("getTabVirtualCounters", `
560    select
561      t1.filter_id as trackId,
562      t2.name,
563      value,
564      t1.ts - t3.start_ts as startTime
565    from
566      sys_mem_measure t1
567    left join
568      sys_event_filter t2
569    on
570      t1.filter_id = t2.id
571    left join
572      trace_range t3
573    where
574      filter_id in (${virtualFilterIds.join(",")})
575    and
576      startTime <= $startTime
577    `, {$startTime: startTime})
578
579export const getTabCpuByProcess = (cpus: Array<number>, leftNS: number, rightNS: number) =>
580    query<SelectionData>("getTabCpuByProcess", `
581    select
582      IP.name as process,
583      IP.pid as pid,
584      sum(B.dur) as wallDuration,
585      avg(B.dur) as avgDuration,
586      count(A.tid) as occurrences
587    from
588      thread_state AS B
589    left join
590      thread as A
591    on
592      B.itid = A.id
593    left join
594      trace_range AS TR
595    left join
596      process AS IP
597    on
598      A.ipid = IP.id
599    where
600      B.cpu in (${cpus.join(",")})
601    and
602      not ((B.ts - TR.start_ts + B.dur < $leftNS) or (B.ts - TR.start_ts > $rightNS ))
603    group by
604      IP.name,
605      IP.pid
606    order by
607      wallDuration desc;`, {$rightNS: rightNS, $leftNS: leftNS})
608
609export const getTabCpuByThread = (cpus: Array<number>, leftNS: number, rightNS: number) =>
610    query<SelectionData>("getTabCpuByThread", `
611    select
612      IP.name as process,
613      IP.pid as pid,
614      A.name as thread,
615      A.tid as tid,
616      sum(B.dur) as wallDuration,
617      avg(B.dur) as avgDuration,
618      count(A.tid) as occurrences
619    from
620      thread_state AS B
621    left join
622      thread as A
623    on
624      B.itid = A.id
625    left join
626      trace_range AS TR
627    left join
628      process AS IP
629    on
630      A.ipid = IP.id
631    where
632      B.cpu in (${cpus.join(",")})
633    and
634      not ((B.ts - TR.start_ts + B.dur < $leftNS) or (B.ts - TR.start_ts > $rightNS))
635    group by
636      IP.name,
637      IP.pid,
638      A.name,
639      A.tid
640    order by
641      wallDuration desc;`, {$rightNS: rightNS, $leftNS: leftNS})
642
643export const getTabSlices = (funTids: Array<number>, leftNS: number, rightNS: number): Promise<Array<any>> =>
644    query<SelectionData>("getTabSlices", `
645    select
646      c.name as name,
647      sum(c.dur) as wallDuration,
648      avg(c.dur) as avgDuration,
649      count(c.name) as occurrences
650    from
651      thread A, trace_range D
652    left join
653      callstack C
654    on
655      A.id = C.callid
656    where
657      C.ts not null
658    and
659      c.dur >= 0
660    and
661      A.tid in (${funTids.join(",")})
662    and
663      c.name != 'binder transaction async'
664    and
665      c.name != 'binder async rcv'
666    and
667      c.cookie is null
668    and
669      not ((C.ts - D.start_ts + C.dur < $leftNS) or (C.ts - D.start_ts > $rightNS))
670    group by
671      c.name
672    order by
673      wallDuration desc;`, {$leftNS: leftNS, $rightNS: rightNS})
674
675export const getTabSlicesAsyncFunc = (asyncNames:Array<string>,asyncPid: Array<number>, leftNS: number, rightNS: number): Promise<Array<any>> =>
676    query<SelectionData>("getTabSlicesAsyncFunc", `
677    select
678      c.name as name,
679      sum(c.dur) as wallDuration,
680      avg(c.dur) as avgDuration,
681      count(c.name) as occurrences
682    from
683      thread A, trace_range D
684    left join
685      callstack C
686    on
687      A.id = C.callid
688    left join process P on P.id = A.ipid
689    where
690      C.ts not null
691    and
692      c.dur >= -1
693    and
694      c.cookie not null
695    and
696      P.pid in (${asyncPid.join(",")})
697    and
698      c.name in (${asyncNames.map(it=>"'"+it+"'").join(",")})
699    and
700      not ((C.ts - D.start_ts + C.dur < $leftNS) or (C.ts - D.start_ts > $rightNS))
701    group by
702      c.name
703    order by
704      wallDuration desc;`, {$leftNS: leftNS, $rightNS: rightNS})
705
706export const getTabThreadStates = (tIds: Array<number>, leftNS: number, rightNS: number): Promise<Array<any>> =>
707    query<SelectionData>("getTabThreadStates", `
708    select
709      IP.name as process,
710      IP.pid,
711      A.name as thread,
712      A.tid,
713      B.state,
714      sum(B.dur) as wallDuration,
715      avg(ifnull(B.dur,0)) as avgDuration,
716      count(A.tid) as occurrences
717    from
718      thread_state AS B
719    left join
720      thread as A
721    on
722      A.id = B.itid
723    left join
724      trace_range AS TR
725    left join
726      process AS IP
727    on
728      IP.id=A.ipid
729    where
730      A.tid in (${tIds.join(",")})
731    and
732      not ((B.ts - TR.start_ts + ifnull(B.dur,0) < $leftNS) or (B.ts - TR.start_ts > $rightNS))
733    group by
734      IP.name, IP.pid, A.name, A.tid, B.state
735    order by
736      wallDuration desc;`, {$leftNS: leftNS, $rightNS: rightNS})
737
738export const queryBinderArgsByArgset = (argset: number): Promise<Array<BinderArgBean>> =>
739    query("queryBinderArgsByArgset", `
740    select
741      *
742    from
743      args_view
744    where
745      argset = $argset;`, {$argset: argset})
746
747export const queryCpuData = (cpu: number, startNS: number, endNS: number): Promise<Array<CpuStruct>> =>
748    query("queryCpuData", `
749    SELECT
750    IP.name as processName,
751    IP.name processCmdLine,
752    IP.pid as processId,
753    B.cpu,
754    A.name,
755    C.id as schedId,
756    A.tid,
757    A.id,
758    A.type,
759    B.dur,
760    B.ts - TR.start_ts AS startTime,
761    C.priority,
762    C.end_state
763from thread_state AS B
764    left join  thread as A on B.itid = A.id
765    left join sched_slice AS C on B.itid = C.itid and B.ts = C.ts
766    left join trace_range AS TR
767    left join process AS IP on A.ipid = IP.id
768where C.itid is not null
769    and
770      B.cpu = $cpu
771    and
772      startTime between $startNS and $endNS;`, {
773        $cpu: cpu,
774        $startNS: startNS,
775        $endNS: endNS
776    })
777
778export const queryCpuFreq = (): Promise<Array<{ cpu: number,filterId:number }>> =>
779    query("queryCpuFreq", `
780    select
781      cpu,id as filterId
782    from
783      cpu_measure_filter
784    where
785      (name='cpufreq' or name='cpu_frequency')
786    order by cpu;
787    `)
788
789export const queryCpuFreqData = (cpu: number): Promise<Array<CpuFreqStruct>> =>
790    query<CpuFreqStruct>("queryCpuFreqData", `
791    select
792      cpu,
793      value,
794      ts-tb.start_ts as startNS
795    from
796      measure c,
797      trace_range tb
798    inner join
799      cpu_measure_filter t
800    on
801      c.filter_id = t.id
802    where
803      (name = 'cpufreq' or name='cpu_frequency')
804    and
805      cpu= $cpu
806    --order by ts;
807    `, {$cpu: cpu},);
808
809export const queryCpuMax = (): Promise<Array<any>> =>
810    query("queryCpuMax", `
811    select
812      cpu
813    from
814      sched_slice
815    order by
816      cpu
817    desc limit 1;`)
818
819export const queryCpuStateFilter = ():Promise<Array<any>> =>
820    query("queryCpuStateFilter",`select cpu,id as filterId from cpu_measure_filter where name = 'cpu_idle' order by cpu;`,{})
821
822export const queryCpuState = (cpuFilterId:number) :Promise<Array<any>> =>
823    query('queryCpuState',`
824        select (A.ts - B.start_ts) as startTs,
825            value
826        from measure A,trace_range B
827        where filter_id = $filterId;`,{$filterId:cpuFilterId},"exec-buf")
828
829export const queryCpuMaxFreq = (): Promise<Array<any>> =>
830    query("queryCpuMaxFreq", `
831    select
832      max(value) as maxFreq
833    from
834      measure c
835    inner join
836      cpu_measure_filter t
837    on
838      c.filter_id = t.id
839    where
840      (name = 'cpufreq' or name='cpu_frequency');`)
841
842export const queryProcessData = (pid:number,startNS:number,endNS:number):Promise<Array<any>> =>
843    query("queryProcessData",`
844    select  ta.cpu,
845        dur,
846        ts-${(window as any).recordStartNS} as startTime
847from thread_state ta
848where ta.cpu is not null and pid=$pid and startTime between $startNS and $endNS;`, {
849        $pid: pid,
850        $startNS: startNS,
851        $endNS: endNS
852    });
853
854export const queryProcessMem = (): Promise<Array<any>> =>
855    query("queryProcessMem", `
856    select
857      process_measure_filter.id as trackId,
858      process_measure_filter.name as trackName,
859      ipid as upid,
860      process.pid,
861      process.name as processName
862    from
863      process_measure_filter
864    join
865      process using (ipid)
866    order by trackName;`)
867
868export const queryProcessThreadDataCount = ():Promise<Array<any>> =>
869    query(`queryProcessThreadDataCount`,`select pid,count(id) as count
870    from thread_state
871    where ts between ${(window as any).recordStartNS} and ${(window as any).recordEndNS} group by pid;`,{});
872
873export const queryProcessFuncDataCount = ():Promise<Array<any>> =>
874    query(`queryProcessFuncDataCount`,`select
875        P.pid,
876        count(tid) as count
877    from callstack C
878    left join thread A on A.id = C.callid
879    left join process AS P on P.id = A.ipid
880    where  C.ts between ${(window as any).recordStartNS} and ${(window as any).recordEndNS}
881    group by pid;`,{});
882
883export const queryProcessMemDataCount = ():Promise<Array<any>> =>
884    query(`queryProcessMemDataCount`,`select
885      p.pid as pid, count(value) count
886    from process_measure c
887    left join process_measure_filter f on f.id = c.filter_id
888    left join process p on p.ipid = f.ipid
889where f.id not NULL and value>0
890 and c.ts between ${(window as any).recordStartNS} and ${(window as any).recordEndNS}
891group by p.pid`,{});
892
893export const queryProcessMemData = (trackId: number): Promise<Array<ProcessMemStruct>> =>
894    query("queryProcessMemData", `
895    select
896      c.type,
897      ts,
898      value,
899      filter_id as track_id,
900      c.ts-tb.start_ts startTime
901    from
902      process_measure c,
903      trace_range tb
904    where
905      filter_id = $id;`, {$id: trackId})
906
907export const queryDataDICT = (): Promise<Array<any>> =>
908    query("queryDataDICT", `select * from data_dict;`)
909export const queryProcessContentCount = ():Promise<Array<any>> =>
910    query(`queryProcessContentCount`,`select pid,swtich_count as switch_count,thread_count,slice_count,mem_count from process;`);
911export const queryProcessThreadsByTable = (): Promise<Array<ThreadStruct>> =>
912    query("queryProcessThreadsByTable", `
913        select p.pid as pid,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;
914    `)
915export const queryVirtualMemory = ():Promise<Array<any>> =>
916    query("queryVirtualMemory",`select id,name from sys_event_filter where type='sys_virtual_memory_filter'`);
917export const queryVirtualMemoryData = (filterId:number):Promise<Array<any>> =>
918    query("queryVirtualMemoryData",`select ts-${(window as any).recordStartNS} as startTime,value,filter_id as filterID from sys_mem_measure where filter_id=$filter_id`,{$filter_id:filterId});
919export const queryProcessThreads = (): Promise<Array<ThreadStruct>> =>
920    query("queryProcessThreads", `
921    select
922      the_tracks.ipid as upid,
923      the_tracks.itid as utid,
924      total_dur as hasSched,
925      process.pid as pid,
926      thread.tid as tid,
927      process.name as processName,
928      thread.name as threadName
929    from (
930      select ipid,itid from sched_slice group by itid
931    ) the_tracks
932    left join (select itid,sum(dur) as total_dur from thread_state where state != 'S' group by itid) using(itid)
933    left join thread using(itid)
934    left join process using(ipid)
935    order by total_dur desc,the_tracks.ipid,the_tracks.itid;`, {})
936
937export const queryThreadData = (tid: number): Promise<Array<ThreadStruct>> =>
938    query("queryThreadData", `
939    select
940      A.id
941     , B.tid
942     , A.name
943     , B.cpu
944     , B.ts - TR.start_ts AS startTime
945     , B.dur
946     , B.state
947     , B.pid
948     , IP.name            as processName
949from thread_state AS B
950         left join thread as A on A.id = B.itid
951         left join trace_range AS TR
952         left join process AS IP on IP.id = A.ipid
953where B.tid = $tid;`, {$tid: tid})
954
955export const queryWakeUpThread_Desc = (): Promise<Array<any>> =>
956    query("queryWakeUpThread_Desc", `This is the interval from when the task became eligible to run
957(e.g.because of notifying a wait queue it was a suspended on) to when it started running.`)
958
959/*-------------------------------------------------------------------------------------*/
960export const queryWakeUpFromThread_WakeThread = (wakets: number): Promise<Array<WakeupBean>> =>
961    query("queryWakeUpFromThread_WakeThread", `select TB.tid,TB.name as thread,TA.cpu,(TA.ts - TR.start_ts) as ts,TC.pid,TC.name as process
962from sched_slice TA
963left join thread TB on TA.itid = TB.id
964left join process TC on TB.ipid = TC.id
965left join trace_range TR
966where TA.itid = (select itid from raw where name = 'sched_waking' and ts = $wakets )
967    and TA.ts < $wakets
968    and TA.ts + Ta.dur >= $wakets`, {$wakets: wakets})
969
970/*-------------------------------------------------------------------------------------*/
971export const queryWakeUpFromThread_WakeTime = (itid: number, startTime: number): Promise<Array<WakeUpTimeBean>> =>
972    query("queryWakeUpFromThread_WakeTime", `select * from
973    ( select ts as wakeTs,start_ts as startTs from instant,trace_range
974       where name = 'sched_waking'
975       and ref = $itid
976       and ts < start_ts + $startTime
977       order by ts desc limit 1) TA
978       left join
979    (select ts as preRow from sched_slice,trace_range
980       where itid = $itid
981       and ts < start_ts + $startTime
982       order by ts desc limit 1) TB`, {$itid: itid, $startTime: startTime})
983/*-------------------------------------------------------------------------------------*/
984
985export const queryThreadWakeUp = (itid: number, startTime: number,dur:number): Promise<Array<WakeupBean>> =>
986    query("queryThreadWakeUp", `
987select TA.tid,min(TA.ts - TR.start_ts) as ts,TA.pid
988from
989  (select min(ts) as wakeTs,ref as itid from instant,trace_range
990       where name = 'sched_wakeup'
991       and wakeup_from = $itid
992       and ts > start_ts + $startTime
993       and ts < start_ts + $startTime + $dur
994      group by ref
995       ) TW
996left join thread_state TA on TW.itid = TA.itid
997left join trace_range TR
998where TA.ts > TW.wakeTs
999group by TA.tid,TA.pid;
1000    `, {$itid: itid, $startTime: startTime,$dur:dur})
1001
1002export const queryThreadWakeUpFrom = (itid: number, startTime: number,dur:number): Promise<Array<WakeupBean>> =>
1003    query("queryThreadWakeUpFrom", `
1004select TA.tid,TA.cpu,(TA.ts - TR.start_ts) as ts,TA.pid
1005from
1006  (select ts as wakeTs,wakeup_from as wakeupFromTid from instant,trace_range
1007       where name = 'sched_wakeup'
1008       and ref = $itid
1009       and ts > start_ts + $startTime
1010       and ts < start_ts + $startTime + $dur) TW
1011left join thread_state TA on TW.wakeupFromTid = TA.itid
1012left join trace_range TR
1013where TA.ts < TW.wakeTs and TA.ts + TA.dur >= TW.wakeTs
1014limit 1;
1015    `, {$itid: itid, $startTime: startTime,$dur:dur})
1016/*-------------------------------------------------------------------------------------*/
1017
1018export const queryHeapGroupByEvent = (): Promise<Array<NativeEventHeap>> =>
1019    query("queryHeapGroupByEvent", `
1020    select
1021      event_type as eventType,
1022      sum(heap_size) as sumHeapSize
1023    from
1024      native_hook
1025    where event_type = 'AllocEvent' or event_type = 'MmapEvent'
1026    group by event_type`, {})
1027
1028export const queryAllHeapByEvent = (): Promise<Array<NativeEvent>> =>
1029    query("queryAllHeapByEvent", `
1030    select * from (
1031      select h.start_ts - t.start_ts as startTime,
1032       h.heap_size as heapSize,
1033       h.event_type as eventType
1034from native_hook h ,trace_range t
1035where h.start_ts >= t.start_ts and h.start_ts <= t.end_ts
1036and (h.event_type = 'AllocEvent' or h.event_type = 'MmapEvent')
1037union
1038select h.end_ts - t.start_ts as startTime,
1039       h.heap_size as heapSize,
1040       (case when h.event_type = 'AllocEvent' then 'FreeEvent' else 'MunmapEvent' end) as eventType
1041from native_hook h ,trace_range t
1042where h.start_ts >= t.start_ts and h.start_ts <= t.end_ts
1043and (h.event_type = 'AllocEvent' or h.event_type = 'MmapEvent')
1044and h.end_ts not null ) order by startTime;
1045`, {})
1046
1047export const queryHeapAllData = (startTs: number, endTs: number, ipids: Array<number>): Promise<Array<HeapTreeDataBean>> =>
1048    query("queryHeapAllData", `
1049    select
1050      h.start_ts - t.start_ts as startTs,
1051      h.end_ts - t.start_ts as endTs,
1052      h.heap_size as heapSize,
1053      h.event_type as eventType,
1054      h.callchain_id as eventId
1055    from
1056      native_hook h
1057    inner join
1058      trace_range  t
1059    where
1060      event_type = 'AllocEvent'
1061    and
1062      ipid in (${ipids.join(",")})
1063    and
1064      (h.start_ts - t.start_ts between ${startTs} and ${endTs} or h.end_ts - t.start_ts between ${startTs} and ${endTs})`,
1065        {ipids: ipids, $startTs: startTs, $endTs: endTs})
1066
1067export const queryNativeHookStatistics = (leftNs: number, rightNs: number): Promise<Array<NativeHookMalloc>> =>
1068    query("queryNativeHookStatistics", `
1069    select
1070      event_type as eventType,
1071      sub_type_id as subTypeId,
1072      max(heap_size) as max,
1073      sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then heap_size else 0 end) as allocByte,
1074      sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then 1 else 0 end) as allocCount,
1075      sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then heap_size else 0 end) as freeByte,
1076      sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then 1 else 0 end) as freeCount
1077    from
1078      native_hook A,
1079      trace_range B
1080    where
1081      (A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}
1082     and (event_type = 'AllocEvent' or event_type = 'MmapEvent')
1083    group by event_type;`, {$leftNs: leftNs, $rightNs: rightNs})
1084
1085export const queryNativeHookStatisticsMalloc = (leftNs: number, rightNs: number): Promise<Array<NativeHookMalloc>> =>
1086    query('queryNativeHookStatisticsMalloc', `
1087    select
1088      event_type as eventType,
1089      heap_size as heapSize,
1090      sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then heap_size else 0 end) as allocByte,
1091      sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then 1 else 0 end) as allocCount,
1092      sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then heap_size else 0 end) as freeByte,
1093      sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then 1 else 0 end) as freeCount
1094    from
1095      native_hook A,
1096      trace_range B
1097    where
1098      (A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}
1099    and
1100      (event_type = 'AllocEvent' or event_type = 'MmapEvent')
1101    and
1102      sub_type_id is null
1103    group by
1104      event_type,
1105      heap_size
1106    order by heap_size desc
1107    `, {$leftNs: leftNs, $rightNs: rightNs})
1108
1109export const queryNativeHookStatisticsSubType = (leftNs: number, rightNs: number): Promise<Array<NativeHookMalloc>> =>
1110    query('queryNativeHookStatisticsSubType', `
1111    select
1112      event_type as eventType,
1113      sub_type_id as subTypeId,
1114      max(heap_size) as max,
1115      sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then heap_size else 0 end) as allocByte,
1116      sum(case when ((A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}) then 1 else 0 end) as allocCount,
1117      sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then heap_size else 0 end) as freeByte,
1118      sum(case when ((A.end_ts - B.start_ts) between ${leftNs} and ${rightNs} ) then 1 else 0 end) as freeCount
1119    from
1120      native_hook A,
1121      trace_range B
1122    where
1123      (A.start_ts - B.start_ts) between ${leftNs} and ${rightNs}
1124    and
1125      (event_type = 'MmapEvent')
1126    group by
1127      event_type,sub_type_id;
1128        `, {$leftNs: leftNs, $rightNs: rightNs})
1129
1130
1131export const queryNativeHookEventTid = (leftNs: number, rightNs: number, types: Array<string>): Promise<Array<NativeHookStatistics>> =>
1132    query("queryNativeHookEventTid", `
1133    select
1134      callchain_id as eventId,
1135      event_type as eventType,
1136      heap_size as heapSize,
1137      addr,
1138      (A.start_ts - B.start_ts) as startTs,
1139      (A.end_ts - B.start_ts) as endTs,
1140      tid,
1141      t.name as threadName
1142    from
1143      native_hook A,
1144      trace_range B
1145    left join
1146      thread t
1147    on
1148      A.itid = t.id
1149    where
1150      A.start_ts - B.start_ts
1151    between ${leftNs} and ${rightNs} and A.event_type in (${types.join(",")})`
1152        , {$leftNs: leftNs, $rightNs: rightNs, $types: types})
1153
1154export const queryNativeHookProcess = (): Promise<Array<NativeHookProcess>> =>
1155    query("queryNativeHookProcess", `
1156    select
1157      distinct native_hook.ipid,
1158      pid,
1159      name
1160    from
1161      native_hook
1162    left join
1163      process p
1164    on
1165      native_hook.ipid = p.id`, {})
1166
1167export const queryNativeHookSnapshotTypes = (): Promise<Array<NativeHookSampleQueryInfo>> =>
1168    query("queryNativeHookSnapshotTypes", `
1169select
1170      event_type as eventType,
1171      data as subType
1172    from
1173      native_hook left join data_dict on native_hook.sub_type_id = data_dict.id
1174    where
1175      (event_type = 'AllocEvent' or event_type = 'MmapEvent')
1176    group by
1177      event_type,data;`, {})
1178
1179export const queryAllHookData = (rightNs: number): Promise<Array<NativeHookSampleQueryInfo>> =>
1180    query("queryAllHookData", `
1181    select
1182      callchain_id as eventId,
1183      event_type as eventType,
1184      data as subType,
1185      addr,
1186      heap_size as growth,
1187      (n.start_ts - t.start_ts) as startTs,
1188      (n.end_ts - t.start_ts) as endTs
1189    from
1190      native_hook n left join data_dict on n.sub_type_id = data_dict.id,
1191      trace_range t
1192    where
1193      (event_type = 'AllocEvent' or event_type = 'MmapEvent')
1194    and
1195      n.start_ts between t.start_ts and ${rightNs} + t.start_ts`, {$rightNs: rightNs})
1196
1197
1198/**
1199 * HiPerf
1200 */
1201export const queryHiPerfEventList = (): Promise<Array<any>> => query("queryHiPerfEventList", `select id,report_value from perf_report where report_type='config_name'`, {},"exec-buf")
1202export const queryHiPerfEventListData = (eventTypeId:number): Promise<Array<any>> => query("queryHiPerfEventListData", `
1203    select s.*,(s.timestamp_trace-t.start_ts) startNS from perf_sample s,trace_range t where event_type_id=${eventTypeId} and s.thread_id != 0;
1204`, {$eventTypeId:eventTypeId},"exec-buf")
1205export const queryHiPerfEventData = (eventTypeId:number,cpu:number): Promise<Array<any>> => query("queryHiPerfEventList", `
1206    select s.*,(s.timestamp_trace-t.start_ts) startNS from perf_sample s,trace_range t where event_type_id=${eventTypeId} and cpu_id=${cpu} and s.thread_id != 0;
1207`, {$eventTypeId:eventTypeId,$cpu:cpu},"exec-buf")
1208export const queryHiPerfCpuData = (cpu: number): Promise<Array<any>> =>
1209    query("queryHiPerfCpuData", `select s.*,(s.timestamp_trace-t.start_ts) startNS from perf_sample s,trace_range t where cpu_id=${cpu} and s.thread_id != 0;`, {$cpu: cpu},"exec-buf")
1210export const queryHiPerfCpuMergeData = (): Promise<Array<any>> =>
1211    query("queryHiPerfCpuData", `select s.*,(s.timestamp_trace-t.start_ts) startNS from perf_sample s,trace_range t where s.thread_id != 0;`, {},"exec-buf")
1212export const queryHiPerfCpuMergeData2 = (): Promise<Array<any>> =>
1213    query("queryHiPerfCpuData2", `select s.*,(s.timestamp_trace-t.start_ts) startNS from perf_sample s,trace_range t where s.thread_id != 0;`, {})
1214
1215export const queryHiPerfProcessData = (pid: number): Promise<Array<any>> => query("queryHiPerfProcessData", `SELECT sp.*,
1216       th.thread_name,
1217       th.thread_id                     tid,
1218       th.process_id                    pid,
1219       sp.timestamp_trace - tr.start_ts startNS
1220from perf_sample sp,
1221     trace_range tr
1222         left join perf_thread th on th.thread_id = sp.thread_id
1223where pid = ${pid} and sp.thread_id != 0;;`, {$pid: pid},"exec-buf")
1224
1225export const queryHiPerfThreadData = (tid: number): Promise<Array<any>> => query("queryHiPerfThreadData", `SELECT sp.*,
1226       th.thread_name,
1227       th.thread_id                     tid,
1228       th.process_id                    pid,
1229       sp.timestamp_trace - tr.start_ts startNS
1230from perf_sample sp,
1231     trace_range tr
1232         left join perf_thread th on th.thread_id = sp.thread_id
1233where tid = ${tid} and sp.thread_id != 0;`, {$tid: tid},"exec-buf")
1234
1235export const querySelectTraceStats = (): Promise<Array<{
1236    event_name: string
1237    stat_type: string
1238    count: number
1239    source: string
1240    serverity: string
1241}>> =>
1242    query('querySelectTraceStats', 'select event_name,stat_type,count,source,serverity from stat');
1243
1244export const queryCustomizeSelect = (sql: string): Promise<Array<any>> =>
1245    query('queryCustomizeSelect', sql);
1246
1247export const queryDistributedTerm = (): Promise<Array<{
1248    threadId: string
1249    threadName: string
1250    processId: string
1251    processName: string
1252    funName: string
1253    dur: string
1254    ts: string
1255    chainId: string
1256    spanId: string
1257    parentSpanId: string
1258    flag: string
1259    trace_name: string
1260}>> =>
1261    query('queryDistributedTerm', `
1262    select
1263      group_concat(thread.id,',') as threadId,
1264      group_concat(thread.name,',') as threadName,
1265      group_concat(process.id,',') as processId,
1266      group_concat(process.name,',') as processName,
1267      group_concat(callstack.name,',') as funName,
1268      group_concat(callstack.dur,',') as dur,
1269      group_concat(callstack.ts,',') as ts,
1270      cast(callstack.chainId as varchar) as chainId,
1271      callstack.spanId as spanId,
1272      callstack.parentSpanId as parentSpanId,
1273      group_concat(callstack.flag,',') as flag,
1274      (select
1275        value
1276      from
1277        meta
1278      where
1279        name='source_name') as trace_name
1280      from
1281        callstack
1282      inner join thread on callstack.callid = thread.id
1283      inner join process on process.id = thread.ipid
1284      where (callstack.flag='S' or callstack.flag='C')
1285      group by callstack.chainId,callstack.spanId,callstack.parentSpanId`);
1286
1287export const queryTraceCpu = (): Promise<Array<{
1288    tid: string
1289    pid: string
1290    cpu: string
1291    dur: string
1292    min_freq: string
1293    max_freq: string
1294    avg_frequency: string
1295}>> =>
1296    query('queryTraceCpu', `SELECT
1297        itid AS tid,
1298        ipid AS pid,
1299        group_concat(cpu, ',') AS cpu,
1300        group_concat(dur, ',') AS dur,
1301        group_concat(min_freq, ',') AS min_freq,
1302        group_concat(max_freq, ',') AS max_freq,
1303        group_concat(avg_frequency, ',') AS avg_frequency
1304        FROM
1305        (SELECT
1306            itid,
1307            ipid,
1308            cpu,
1309            CAST (SUM(dur) AS INT) AS dur,
1310            CAST (MIN(freq) AS INT) AS min_freq,
1311            CAST (MAX(freq) AS INT) AS max_freq,
1312            CAST ( (SUM(dur * freq) / SUM(dur) ) AS INT) AS avg_frequency
1313            from
1314            result
1315            group by
1316            itid, cpu
1317        )
1318        GROUP BY
1319        ipid, itid
1320        ORDER BY
1321        ipid
1322    `);
1323
1324export const queryTraceCpuTop = (): Promise<Array<{
1325    tid: string
1326    pid: string
1327    cpu: string
1328    duration: string
1329    min_freq: string
1330    max_freq: string
1331    avg_frequency: string
1332    sumNum: string
1333}>> =>
1334    query('queryTraceCpuTop', `SELECT
1335        itid AS tid,
1336        ipid AS pid,
1337        group_concat(cpu, ',') AS cpu,
1338        group_concat(dur, ',') AS dur,
1339        group_concat(min_freq, ',') AS min_freq,
1340        group_concat(max_freq, ',') AS max_freq,
1341        group_concat(avg_frequency, ',') AS avg_frequency,
1342        sum(dur * avg_frequency) AS sumNum
1343        FROM
1344        (SELECT
1345            itid,
1346            ipid,
1347            cpu,
1348            CAST (SUM(dur) AS INT) AS dur,
1349            CAST (MIN(freq) AS INT) AS min_freq,
1350            CAST (MAX(freq) AS INT) AS max_freq,
1351            CAST ( (SUM(dur * freq) / SUM(dur) ) AS INT) AS avg_frequency
1352            from result group by itid, cpu
1353        )
1354        GROUP BY
1355        ipid, itid
1356        ORDER BY
1357        sumNum
1358        DESC
1359        LIMIT 10;
1360    `);
1361
1362export const queryTraceMemory = (): Promise<Array<{
1363    maxNum: string
1364    minNum: string
1365    avgNum: string
1366    name: string
1367    processName: string
1368}>> =>
1369    query('queryTraceMemory', `
1370    select
1371        max(value) as maxNum,
1372        min(value) as minNum,
1373        avg(value) as avgNum,
1374        filter.name as name,
1375        p.name as processName
1376        from process_measure
1377        left join process_measure_filter as filter on filter.id= filter_id
1378        left join process as p on p.id = filter.ipid
1379    where
1380    filter_id > 0
1381    and
1382    filter.name = 'mem.rss.anon'
1383    group by
1384    filter_id
1385    order by
1386    avgNum desc`);
1387
1388export const queryTraceMemoryTop = (): Promise<Array<{
1389    maxNum: string
1390    minNum: string
1391    avgNum: string
1392    name: string
1393    processName: string
1394}>> =>
1395    query('queryTraceMemoryTop', `
1396    select
1397        max(value) as maxNum,
1398        min(value) as minNum,
1399        avg(value) as avgNum,
1400        filter.name as name,
1401        p.name as processName
1402        from process_measure
1403        left join process_measure_filter as filter on filter.id= filter_id
1404        left join process as p on p.id = filter.ipid
1405    where
1406    filter_id > 0
1407    and
1408    filter.name = 'mem.rss.anon'
1409    group by
1410    filter_id
1411    order by
1412    avgNum desc limit 10`);
1413
1414export const queryTraceMemoryUnAgg = (): Promise<Array<{
1415    processName: string
1416    name: string
1417    value: string
1418    ts: string
1419}>> =>
1420    query('queryTraceMemoryUnAgg', `
1421    select
1422        p.name as processName,
1423        group_concat(filter.name) as name,
1424        cast(group_concat(value) as varchar) as value,
1425        cast(group_concat(ts) as varchar) as ts
1426        from process_measure m
1427        left join process_measure_filter as filter on filter.id= m.filter_id
1428        left join process as p on p.id = filter.ipid
1429        where
1430        filter.name = 'mem.rss.anon'
1431        or
1432        filter.name = 'mem.rss.file'
1433        or
1434        filter.name = 'mem.swap'
1435        or
1436        filter.name = 'oom_score_adj'
1437    group by
1438    p.name,filter.ipid
1439    order by
1440    filter.ipid`);
1441
1442export const queryTraceTaskName = (): Promise<Array<{
1443    id: string
1444    pid: string
1445    process_name: string
1446    thread_name: string
1447}>> =>
1448    query('queryTraceTaskName', `
1449    select
1450        P.id as id,
1451        P.pid as pid,
1452        P.name as process_name,
1453        group_concat(T.name,',') as thread_name
1454    from process as P left join thread as T where P.id = T.ipid
1455    group by pid`);
1456
1457export const queryTraceMetaData = (): Promise<Array<{
1458    name: string
1459    valueText: string
1460}>> =>
1461    query('queryTraceMetaData', `
1462    select
1463        cast(name as varchar) as name,
1464        cast(value as varchar) as valueText
1465        from meta
1466        UNION
1467        select 'start_ts',cast(start_ts as varchar) from trace_range
1468        UNION
1469        select 'end_ts',cast(end_ts as varchar) from trace_range`);
1470
1471export const querySystemCalls = (): Promise<Array<{
1472    frequency: string
1473    minDur: string
1474    maxDur: string
1475    avgDur: string
1476    funName: string
1477}>> =>
1478    query('querySystemCalls', `
1479    select
1480      count(*) as frequency,
1481      min(dur) as minDur,
1482      max(dur) as maxDur,
1483      avg(dur) as avgDur,
1484      name as funName
1485    from
1486      callstack
1487      group by name
1488      order by
1489    frequency desc limit 100`);
1490
1491export const querySystemCallsTop = (): Promise<Array<{
1492    tid: string
1493    pid: string
1494    funName: string
1495    frequency: string
1496    minDur: string
1497    maxDur: string
1498    avgDur: string
1499}>> =>
1500    query('querySystemCallsTop', `SELECT
1501        cpu.tid AS tid,
1502        cpu.pid AS pid,
1503        callstack.name AS funName,
1504        count(callstack.name) AS frequency,
1505        min(callstack.dur) AS minDur,
1506        max(callstack.dur) AS maxDur,
1507        round(avg(callstack.dur)) AS avgDur
1508        FROM
1509        callstack
1510        INNER JOIN
1511        (SELECT
1512            itid AS tid,
1513            ipid AS pid,
1514            group_concat(cpu, ',') AS cpu,
1515            group_concat(dur, ',') AS dur,
1516            group_concat(min_freq, ',') AS min_freq,
1517            group_concat(max_freq, ',') AS max_freq,
1518            group_concat(avg_frequency, ',') AS avg_frequency,
1519            sum(dur * avg_frequency) AS sumNum
1520            FROM
1521            (SELECT
1522                itid,
1523                ipid,
1524                cpu,
1525                CAST (SUM(dur) AS INT) AS dur,
1526                CAST (MIN(freq) AS INT) AS min_freq,
1527                CAST (MAX(freq) AS INT) AS max_freq,
1528                CAST ( (SUM(dur * freq) / SUM(dur) ) AS INT) AS avg_frequency
1529                FROM
1530                result
1531                GROUP BY
1532                itid, cpu
1533            )
1534            GROUP BY
1535            ipid, itid
1536            ORDER BY
1537            sumNum
1538            DESC
1539            LIMIT 10
1540        ) AS cpu
1541        ON
1542        callstack.callid = cpu.tid
1543        GROUP BY
1544        callstack.name
1545        ORDER BY
1546        frequency
1547        DESC
1548    LIMIT 10`);
1549
1550export const getTabLiveProcessData = (leftNs: number, rightNs: number): Promise<Array<LiveProcess>> =>
1551    query<LiveProcess>("getTabLiveProcessData", `SELECT
1552        process.id as processId,
1553        process.name as processName,
1554        process.ppid as responsibleProcess,
1555        process.uud as userName,
1556        process.usag as cpu,
1557        process.threadN as threads,
1558        process.pss as memory,
1559        process.cpu_time as cpuTime,
1560        process.disk_reads as diskReads,
1561        process.disk_writes as diskWrite
1562        FROM
1563        (
1564        SELECT
1565        tt.process_id AS id,
1566        tt.process_name AS name,
1567        tt.parent_process_id AS ppid,
1568        tt.uid as uud,
1569        tt.cpu_usage as usag,
1570        tt.thread_num AS threadN,
1571        mt.maxTT - TR.start_ts as endTs,
1572        tt.pss_info as pss,
1573        tt.cpu_time,
1574        tt.disk_reads,
1575        tt.disk_writes
1576        FROM
1577        live_process tt
1578        LEFT JOIN trace_range AS TR
1579        LEFT JOIN (select re.process_id as idd, max(re.ts) as maxTT, min(re.ts) as minTT
1580        from live_process re GROUP BY re.process_name, re.process_id ) mt
1581        on mt.idd = tt.process_id where endTs >= $rightNS
1582        GROUP BY
1583        tt.process_name,
1584        tt.process_id
1585        ) process ;`, {$leftNS: leftNs, $rightNS: rightNs})
1586
1587export const getTabProcessHistoryData = (leftNs: number, rightNs: number,
1588                                         processId: number | undefined, threadId: number | undefined): Promise<Array<ProcessHistory>> =>
1589    query<ProcessHistory>("getTabProcessHistoryData", `SELECT
1590        process.id as processId,
1591        process.isD as alive,
1592        process.startTS as firstSeen,
1593        process.endTs as lastSeen,
1594        process.name as processName,
1595        process.ppid as responsibleProcess,
1596        process.uuid as userName,
1597        process.cpu_time as cpuTime,
1598        0 as pss
1599        FROM
1600        (
1601        SELECT
1602        tt.process_id AS id,
1603        tt.process_name AS name,
1604        tt.parent_process_id AS ppid,
1605        tt.uid AS uuid,
1606        tt.cpu_time,
1607        (mt.minTT - TR.start_ts ) AS startTS,
1608        mt.maxTT - TR.start_ts as endTs,
1609        (mt.maxTT - TR.start_ts - $rightNS) > 0 as isD
1610        FROM
1611        live_process tt
1612        LEFT JOIN trace_range AS TR
1613        LEFT JOIN (select re.process_id as idd, max(re.ts) as maxTT, min(re.ts) as minTT
1614        from live_process re GROUP BY re.process_name, re.process_id ) mt
1615        on mt.idd = tt.process_id
1616        GROUP BY
1617        tt.process_name,
1618        tt.process_id
1619        ) process;`
1620        , {$leftNS: leftNs, $rightNS: rightNs, $processID: processId, $threadID: threadId})
1621
1622export const getTabCpuAbilityData = (leftNs: number, rightNs: number): Promise<Array<SystemCpuSummary>> =>
1623    query<SystemCpuSummary>("getTabCpuAbilityData", `SELECT
1624        ( n.ts - TR.start_ts ) AS startTime,
1625        n.dur AS duration,
1626        n.total_load AS totalLoad,
1627        n.user_load AS userLoad,
1628        n.system_load AS systemLoad,
1629        n.process_num AS threads
1630        FROM
1631        cpu_usage AS n,
1632        trace_range AS TR
1633        WHERE
1634        ( n.ts - TR.start_ts ) >= ifnull((
1635        SELECT
1636        ( usage.ts - TR.start_ts )
1637        FROM
1638        cpu_usage usage,
1639        trace_range TR
1640        WHERE
1641        ( usage.ts - TR.start_ts ) <= $leftNS
1642        ORDER BY
1643        usage.ts DESC
1644        LIMIT 1
1645        ),0)
1646        AND ( n.ts - TR.start_ts ) <= $rightNS
1647        ORDER BY
1648        startTime ASC;
1649    `, {$leftNS: leftNs, $rightNS: rightNs})
1650
1651export const getTabMemoryAbilityData = (leftNs: number, rightNs: number): Promise<Array<{
1652    startTime: number,
1653    value: string,
1654    name: string;
1655}>> =>
1656    query("getTabMemoryAbilityData", `SELECT
1657        m.ts AS startTime,
1658        GROUP_CONCAT( IFNULL( m.value, 0 ) ) AS value,
1659        GROUP_CONCAT( f.name ) AS name
1660        FROM
1661        sys_mem_measure AS m
1662        INNER JOIN sys_event_filter AS f ON m.filter_id = f.id
1663        AND (f.name = 'sys.mem.total'
1664         or f.name = 'sys.mem.free'
1665         or f.name = 'sys.mem.buffers'
1666         or f.name = 'sys.mem.cached'
1667         or f.name = 'sys.mem.shmem'
1668         or f.name = 'sys.mem.slab'
1669         or f.name = 'sys.mem.swap.total'
1670         or f.name = 'sys.mem.swap.free'
1671         or f.name = 'sys.mem.mapped'
1672         or f.name = 'sys.mem.vmalloc.used'
1673         or f.name = 'sys.mem.page.tables'
1674         or f.name = 'sys.mem.kernel.stack'
1675         or f.name = 'sys.mem.active'
1676         or f.name = 'sys.mem.inactive'
1677         or f.name = 'sys.mem.unevictable'
1678         or f.name = 'sys.mem.vmalloc.total'
1679         or f.name = 'sys.mem.slab.unreclaimable'
1680         or f.name = 'sys.mem.cma.total'
1681         or f.name = 'sys.mem.cma.free'
1682         or f.name = 'sys.mem.kernel.reclaimable'
1683         or f.name = 'sys.mem.zram'
1684         )
1685        AND m.ts >= ifnull((
1686        SELECT
1687        m.ts AS startTime
1688        FROM
1689        sys_mem_measure AS m
1690        INNER JOIN sys_event_filter AS f ON m.filter_id = f.id
1691        AND m.ts <= $leftNS
1692        AND (f.name = 'sys.mem.total'
1693         or f.name = 'sys.mem.free'
1694         or f.name = 'sys.mem.buffers'
1695         or f.name = 'sys.mem.cached'
1696         or f.name = 'sys.mem.shmem'
1697         or f.name = 'sys.mem.slab'
1698         or f.name = 'sys.mem.swap.total'
1699         or f.name = 'sys.mem.swap.free'
1700         or f.name = 'sys.mem.mapped'
1701         or f.name = 'sys.mem.vmalloc.used'
1702         or f.name = 'sys.mem.page.tables'
1703         or f.name = 'sys.mem.kernel.stack'
1704         or f.name = 'sys.mem.active'
1705         or f.name = 'sys.mem.inactive'
1706         or f.name = 'sys.mem.unevictable'
1707         or f.name = 'sys.mem.vmalloc.total'
1708         or f.name = 'sys.mem.slab.unreclaimable'
1709         or f.name = 'sys.mem.cma.total'
1710         or f.name = 'sys.mem.cma.free'
1711         or f.name = 'sys.mem.kernel.reclaimable'
1712         or f.name = 'sys.mem.zram'
1713         )
1714        ORDER BY
1715        m.ts DESC
1716        LIMIT 1
1717        ),0)
1718        AND m.ts <= $rightNS GROUP BY m.ts;`, {$leftNS: leftNs, $rightNS: rightNs})
1719
1720export const getTabNetworkAbilityData = (leftNs: number, rightNs: number): Promise<Array<SystemNetworkSummary>> =>
1721    query<SystemNetworkSummary>("getTabNetworkAbilityData", `SELECT
1722            ( n.ts - TR.start_ts ) AS startTime,
1723            n.dur AS duration,
1724            n.rx AS dataReceived,
1725            n.tx_speed AS dataReceivedSec,
1726            n.tx AS dataSend,
1727            n.rx_speed AS dataSendSec,
1728            n.packet_in AS packetsIn,
1729            n.packet_in_sec AS packetsInSec,
1730            n.packet_out AS packetsOut,
1731            n.packet_out_sec AS packetsOutSec
1732            FROM
1733            network AS n,
1734            trace_range AS TR
1735            WHERE
1736            ( n.ts - TR.start_ts ) >= ifnull((
1737            SELECT
1738            ( nn.ts - T.start_ts ) AS startTime
1739            FROM
1740            network nn,
1741            trace_range T
1742            WHERE
1743            ( nn.ts - T.start_ts ) <= $leftNS
1744            ORDER BY
1745            nn.ts DESC
1746            LIMIT 1
1747            ),0)
1748            AND ( n.ts - TR.start_ts ) <= $rightNS
1749            ORDER BY
1750            startTime ASC`, {$leftNS: leftNs, $rightNS: rightNs})
1751
1752/*-------------------------------------------------------------------------------------*/
1753export const getTabDiskAbilityData = (leftNs: number, rightNs: number): Promise<Array<SystemDiskIOSummary>> =>
1754    query<SystemDiskIOSummary>("getTabDiskAbilityData", `SELECT
1755        ( n.ts - TR.start_ts ) AS startTime,
1756        n.dur AS duration,
1757        n.rd AS dataRead,
1758        n.rd_speed AS dataReadSec,
1759        n.wr AS dataWrite,
1760        n.wr_speed AS dataWriteSec,
1761        n.rd_count AS readsIn,
1762        n.rd_count_speed AS readsInSec,
1763        n.wr_count AS writeOut,
1764        n.wr_count_speed AS writeOutSec
1765        FROM
1766        diskio AS n,
1767        trace_range AS TR
1768        WHERE
1769        ( n.ts - TR.start_ts ) >= ifnull((
1770        SELECT
1771        ( nn.ts - T.start_ts ) AS startTime
1772        FROM
1773        diskio AS nn,
1774        trace_range AS T
1775        WHERE
1776        ( nn.ts - T.start_ts ) <= $leftNS
1777        ORDER BY
1778        nn.ts DESC
1779        LIMIT 1
1780        ),0)
1781        AND ( n.ts - TR.start_ts ) <= $rightNS
1782        ORDER BY
1783        startTime ASC;
1784    `, {$leftNS: leftNs, $rightNS: rightNs})
1785
1786export const queryCpuAbilityData = (): Promise<Array<CpuAbilityMonitorStruct>> =>
1787    query("queryCpuAbilityData", `select
1788        (t.total_load) as value,
1789        (t.ts - TR.start_ts) as startNS
1790        from cpu_usage t, trace_range AS TR;`)
1791
1792export const queryCpuAbilityUserData = (): Promise<Array<CpuAbilityMonitorStruct>> =>
1793    query("queryCpuAbilityUserData", `select
1794        t.user_load as value,
1795        (t.ts - TR.start_ts) as startNS
1796        from cpu_usage t, trace_range AS TR;`)
1797
1798export const queryCpuAbilitySystemData = (): Promise<Array<CpuAbilityMonitorStruct>> =>
1799    query("queryCpuAbilitySystemData", `select
1800        t.system_load as value,
1801        (t.ts - TR.start_ts) as startNS
1802        from cpu_usage t, trace_range AS TR;`)
1803
1804export const queryMemoryUsedAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> =>
1805    query("queryMemoryUsedAbilityData", `select
1806        t.value as value,
1807        (t.ts - TR.start_ts) as startNS
1808        from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`, {$id: id})
1809
1810export const queryCachedFilesAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> =>
1811    query("queryCachedFilesAbilityData", `select
1812        t.value as value,
1813        (t.ts - TR.start_ts) as startNS
1814        from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`, {$id: id})
1815
1816export const queryCompressedAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> =>
1817    query("queryCompressedAbilityData", `select
1818        t.value as value,
1819        (t.ts - TR.start_ts) as startNS
1820        from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`, {$id: id})
1821
1822export const querySwapUsedAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> =>
1823    query("querySwapUsedAbilityData", `select
1824        t.value as value,
1825        (t.ts - TR.start_ts) as startNS
1826        from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`, {$id: id})
1827
1828export const queryBytesReadAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> =>
1829    query("queryBytesReadAbilityData", `select
1830        t.rd_speed as value,
1831        (t.ts - TR.start_ts) as startNS
1832        from diskio t, trace_range AS TR;`)
1833
1834export const queryBytesWrittenAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> =>
1835    query("queryBytesWrittenAbilityData", `select
1836        t.wr_speed as value,
1837        (t.ts - TR.start_ts) as startNS
1838        from diskio t, trace_range AS TR;`)
1839
1840export const queryReadAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> =>
1841    query("queryReadAbilityData", `select
1842        t.rd_count_speed as value,
1843        (t.ts - TR.start_ts) as startNS
1844        from diskio t, trace_range AS TR;`)
1845
1846
1847export const queryWrittenAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> =>
1848    query("queryWrittenAbilityData", `select
1849        t.wr_count_speed as value,
1850        (t.ts - TR.start_ts) as startNS
1851        from diskio t, trace_range AS TR;`)
1852
1853export const queryBytesInAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> =>
1854    query("queryBytesInAbilityData", `select
1855        t.tx_speed as value,
1856        (t.ts - TR.start_ts) as startNS
1857        from network t, trace_range AS TR;`)
1858
1859export const queryBytesOutAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> =>
1860    query("queryBytesOutAbilityData", `select
1861        t.rx_speed as value,
1862        (t.ts - TR.start_ts) as startNS
1863        from network t, trace_range AS TR;`,)
1864
1865export const queryPacketsInAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> =>
1866    query("queryPacketsInAbilityData", `select
1867        t.packet_in_sec as value,
1868        (t.ts - TR.start_ts) as startNS
1869        from network t, trace_range AS TR;`,)
1870
1871export const queryPacketsOutAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> =>
1872    query("queryPacketsOutAbilityData", `select
1873        t.packet_out_sec as value,
1874        (t.ts - TR.start_ts) as startNS
1875        from network t, trace_range AS TR;`)
1876
1877export const queryNetWorkMaxData = (): Promise<Array<any>> =>
1878    query("queryNetWorkMaxData", `select
1879     ifnull(max(tx_speed),0) as maxIn,
1880     ifnull(max(rx_speed),0) as maxOut,
1881     ifnull(max(packet_in_sec),0) as maxPacketIn,
1882     ifnull(max(packet_in_sec),0) as maxPacketOut
1883     from network`)
1884
1885export const queryMemoryMaxData = (memoryName: string): Promise<Array<any>> =>
1886    query("queryMemoryMaxData",
1887        `SELECT ifnull(max(m.value),0) as maxValue,
1888            filter_id
1889            from sys_mem_measure m
1890            WHERE m.filter_id =
1891            (SELECT id FROM sys_event_filter WHERE name = $memoryName)
1892`, {$memoryName: memoryName})
1893
1894export const queryDiskIoMaxData = (): Promise<Array<any>> =>
1895    query("queryDiskIoMaxData", `select
1896    ifnull(max(rd_speed),0) as bytesRead,
1897    ifnull(max(wr_speed),0) as bytesWrite,
1898    ifnull(max(rd_count_speed),0) as readOps,
1899    ifnull(max(wr_count_speed),0)  as writeOps
1900    from diskio`)
1901
1902export const queryAbilityExits = (): Promise<Array<any>> =>
1903    query("queryAbilityExits", `select
1904      event_name
1905      from stat s
1906      where s.event_name in ('trace_diskio','trace_network', 'trace_cpu_usage','sys_memory')
1907      and s.stat_type ='received' and s.count > 0`)
1908
1909export const queryStartTime = (): Promise<Array<any>> =>
1910    query("queryStartTime", `SELECT start_ts FROM trace_range`)
1911
1912export const queryPerfFiles = (): Promise<Array<PerfFile>> =>
1913    query("queryPerfFiles", `select file_id as fileId,symbol,path from perf_files`, {})
1914
1915export const queryPerfProcess = (): Promise<Array<PerfThread>> =>
1916    query("queryPerfThread", `select process_id as pid,thread_name as processName from perf_thread where process_id = thread_id`, {})
1917
1918export const queryPerfThread = (): Promise<Array<PerfThread>> =>
1919    query("queryPerfThread", `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`, {})
1920
1921export const queryPerfSampleListByTimeRange = (leftNs: number, rightNs: number, cpus: Array<number>, processes: Array<number>, threads: Array<number>): Promise<Array<PerfSample>> => {
1922    let sql = `
1923select A.callchain_id as sampleId,
1924       A.thread_id as tid,
1925       C.thread_name as threadName,
1926       A.thread_state as state,
1927       C.process_id as pid,
1928       (timestamp_trace - R.start_ts) as time,
1929       cpu_id as core
1930from perf_sample A,trace_range R
1931left join perf_thread C on A.thread_id = C.thread_id
1932where time >= $leftNs and time <= $rightNs and A.thread_id != 0
1933    `
1934    if (cpus.length != 0 || processes.length != 0 || threads.length != 0) {
1935        let arg1 = cpus.length > 0 ? `or core in (${cpus.join(",")}) ` : '';
1936        let arg2 = processes.length > 0 ? `or pid in (${processes.join(",")}) ` : '';
1937        let arg3 = threads.length > 0 ? `or tid in (${threads.join(",")})` : '';
1938        let arg = `${arg1}${arg2}${arg3}`.substring(3);
1939        sql = `${sql} and (${arg})`
1940    }
1941    return query("queryPerfSampleListByTimeRange", sql, {$leftNs: leftNs, $rightNs: rightNs});
1942}
1943
1944export const queryPerfSampleIdsByTimeRange = (leftNs: number, rightNs: number, cpus: Array<number>, processes: Array<number>, threads: Array<number>): Promise<Array<PerfSample>> => {
1945    let sql = `
1946select A.callchain_id as sampleId
1947from perf_sample A,trace_range R
1948left join perf_thread C on A.thread_id = C.thread_id
1949where (timestamp_trace - R.start_ts) >= $leftNs and (timestamp_trace - R.start_ts) <= $rightNs and A.thread_id != 0
1950    `
1951    if (cpus.length != 0 || processes.length != 0 || threads.length != 0) {
1952        let arg1 = cpus.length > 0 ? `or A.cpu_id in (${cpus.join(",")}) ` : '';
1953        let arg2 = processes.length > 0 ? `or C.process_id in (${processes.join(",")}) ` : '';
1954        let arg3 = threads.length > 0 ? `or A.thread_id in (${threads.join(",")})` : '';
1955        let arg = `${arg1}${arg2}${arg3}`.substring(3);
1956        sql = `${sql} and (${arg})`
1957    }
1958    return query("queryPerfSampleIdsByTimeRange", sql, {$leftNs: leftNs, $rightNs: rightNs});
1959}
1960
1961export const queryPerfSampleCallChain = (sampleId: number): Promise<Array<PerfStack>> =>
1962    query("queryPerfSampleCallChain", `
1963    select
1964    callchain_id as callChainId,
1965    callchain_id as sampleId,
1966    file_id as fileId,
1967    symbol_id as symbolId,
1968    vaddr_in_file as vaddrInFile,
1969    name as symbol
1970from perf_callchain where callchain_id = $sampleId and symbol_id != -1 and vaddr_in_file != 0;
1971    `, {$sampleId: sampleId})
1972
1973export const queryPerfCmdline = ():Promise<Array<PerfCmdLine>> =>
1974    query("queryPerfCmdline",`
1975    select report_value from perf_report  where report_type = 'cmdline'
1976    `,{})
1977
1978export const queryCPuAbilityMaxData = (): Promise<Array<any>> =>
1979    query("queryCPuAbilityMaxData",
1980        `select ifnull(max(total_load),0) as totalLoad,
1981                ifnull(max(user_load),0) as userLoad,
1982                ifnull(max(system_load),0) as systemLoad
1983                from cpu_usage`)
1984
1985export const querySearchFunc = (search:string):Promise<Array<SearchFuncBean>> =>
1986    query("querySearchFunc",`
1987   select c.id,c.name as funName,c.ts - r.start_ts as startTime,c.dur,c.depth,t.tid,t.name as threadName
1988   ,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
1989   left join trace_range r
1990   where c.name like '%${search}%' and startTime > 0;
1991    `,{$search:search})
1992
1993export const queryBinderBySliceId = (id:number): Promise<Array<any>> =>
1994    query("queryBinderBySliceId",
1995        `select c.ts-D.start_ts as startTime,
1996    c.dur,
1997    t.tid,p.pid,c.depth
1998    from callstack c,trace_range D
1999    left join thread t on c.callid = t.id
2000    left join process p on p.id = t.ipid
2001where cat = 'binder' and c.id = $id;`,{$id:id})
2002
2003export const queryBinderByArgsId = (id:number,startTime:number,isNext:boolean): Promise<Array<any>> =>{
2004    let sql = `select c.ts - D.start_ts as startTime,
2005    c.dur,
2006    t.tid,p.pid,c.depth
2007    from callstack c,trace_range D
2008    left join thread t on c.callid = t.id
2009    left join process p on p.id = t.ipid
2010where cat = 'binder' and  c.argsetid = $id`
2011    if(isNext){
2012        sql += " and c.ts > $startTime +  D.start_ts"
2013    }else {
2014        sql += " and c.ts < $startTime +  D.start_ts"
2015    }
2016    return query("queryBinderByArgsId",sql,{$id:id,$startTime:startTime})
2017}
2018
2019export const getTabPaneFilesystemStatisticsFather = (leftNs: number, rightNs: number): Promise<Array<any>> =>
2020    query("getTabPaneFilesystemStatisticsFather", `
2021        select SUM(dur)    as allDuration,
2022        count(f.type) as count,
2023        min(dur)    as minDuration,
2024        max(dur)    as maxDuration,
2025        round(avg(dur),2)    as avgDuration,
2026        p.name,
2027        f.type,
2028        p.pid,
2029        sum(ifnull(size,0))    as size
2030        from file_system_sample as f left join process as p on f.ipid=p.ipid
2031        where f.start_ts >= $leftNs
2032        and end_ts <= $rightNs
2033        group by f.type;
2034`, {$leftNs:leftNs,$rightNs:rightNs});
2035
2036export const getTabPaneFilesystemStatisticsChild = (leftNs: number, rightNs: number): Promise<Array<any>> =>
2037    query("getTabPaneFilesystemStatisticsChild", `
2038    select SUM(dur)    as allDuration,
2039        count(f.type) as count,
2040        min(dur)    as minDuration,
2041        max(dur)    as maxDuration,
2042        round(avg(dur),2)    as avgDuration,
2043        p.name,
2044        f.type,
2045        p.pid,
2046        sum(ifnull(size,0))    as size
2047        from file_system_sample as f left join process as p on f.ipid=p.ipid
2048        where f.start_ts >= $leftNs
2049        and end_ts <= $rightNs
2050        group by f.type, f.ipid;
2051`, {$leftNs:leftNs,$rightNs:rightNs});
2052
2053export const getTabPaneFilesystemStatisticsAll = (leftNs: number, rightNs: number): Promise<Array<any>> =>
2054    query("getTabPaneFilesystemStatisticsAll", `
2055    select SUM(dur)    as allDuration,
2056       count(type) as count,
2057       min(dur)    as minDuration,
2058       max(dur)    as maxDuration,
2059       round(avg(dur),2)    as avgDuration,
2060       type
2061    from file_system_sample
2062    where start_ts >= $leftNs
2063    and end_ts <= $rightNs;
2064`, {$leftNs:leftNs,$rightNs:rightNs});
2065
2066export const getTabPaneFilesystemStatistics = (leftNs: number, rightNs: number): Promise<Array<any>> =>
2067    query("getTabPaneFilesystemStatistics", `
2068    select p.pid,
2069       ifnull(p.name,'Process') as name,
2070       f.type,
2071       count(f.ipid) as count,
2072       sum(ifnull(size,0)) as size,
2073       sum(case when f.type = 2 then ifnull(size,0) else 0 end) as logicalReads,
2074       sum(case when f.type = 3 then ifnull(size,0) else 0 end) as logicalWrites,
2075       sum(case when f.type != 2 and f.type != 3 then ifnull(size,0) else 0 end) as otherFile,
2076       sum(dur) as allDuration,
2077       min(dur) as minDuration,
2078       max(dur) as maxDuration,
2079       avg(dur) as avgDuration
2080    from file_system_sample as f left join process as p on f.ipid=p.ipid
2081    where end_ts >= $leftNs
2082    and end_ts <= $rightNs
2083    group by f.type,f.ipid
2084    order by f.type;
2085`, {$leftNs:leftNs,$rightNs:rightNs});
2086
2087export const getTabPaneVirtualMemoryStatisticsData = (leftNs: number, rightNs: number): Promise<Array<any>> =>
2088    query("getTabPaneVirtualMemoryStatisticsData", `
2089    select p.pid,
2090       t.tid,
2091       ifnull(p.name,'Process') as pname,
2092       ifnull(t.name,'Thread') as tname,
2093       f.type,
2094       f.ipid,
2095       f.itid,
2096       count(f.ipid) as count,
2097       sum(dur) as allDuration,
2098       min(dur) as minDuration,
2099       max(dur) as maxDuration,
2100       avg(dur) as avgDuration
2101    from virtual_memory_sample as f left join process as p on f.ipid=p.ipid left join thread as t on f.itid=t.itid
2102    where f.end_ts >= $leftNs
2103    and f.end_ts <= $rightNs
2104    group by f.type,f.ipid,f.itid
2105    order by f.type;
2106`, {$leftNs:leftNs,$rightNs:rightNs});
2107
2108export const getTabPaneIOTierStatisticsData = (leftNs: number, rightNs: number, diskIOipids:Array<number>): Promise<Array<any>> =>{
2109    let str = "";
2110    if (diskIOipids.length > 0) {
2111        str = ` and f.ipid in (${diskIOipids.join(",")})`;
2112    }
2113    return query("getTabPaneIOTierStatisticsData", `
2114    select p.pid,
2115       ifnull(p.name,'Process') as pname,
2116       i.tier,
2117       i.ipid,
2118       path,
2119       count(i.ipid) as count,
2120       sum(latency_dur) as allDuration,
2121       min(latency_dur) as minDuration,
2122       max(latency_dur) as maxDuration,
2123       avg(latency_dur) as avgDuration
2124    from io_latency_sample as i left join process as p on i.ipid=p.ipid
2125    where i.start_ts >= $leftNs
2126    and i.start_ts+latency_dur <= $rightNs
2127    ${str}
2128    group by i.tier,i.ipid,i.path
2129    order by i.tier;
2130`, {$leftNs:leftNs,$rightNs:rightNs})
2131};
2132
2133export const getTabPaneCounterSampleData = (leftNs: number, rightNs: number, cpuStateFilterIds: Array<number>): Promise<Array<any>> =>{
2134    let str = "";
2135    if (cpuStateFilterIds.length > 0) {
2136        str = ` and filter_id in (${cpuStateFilterIds.join(",")})`;
2137    }
2138    return query("getTabPaneCounterSampleData", `
2139    select value, filter_id as filterId, ts, f.cpu
2140    from measure left join cpu_measure_filter as f on f.id=filter_id
2141    where
2142    ts <= $rightNs${str} order by ts asc;
2143`, {$leftNs:leftNs,$rightNs:rightNs})
2144};
2145
2146export const getTabPaneFrequencySampleData = (leftNs: number, rightNs: number, cpuFreqFilterIds: Array<number>): Promise<Array<any>> =>{
2147    let str = "";
2148    if (cpuFreqFilterIds.length > 0) {
2149        str = ` and filter_id in (${cpuFreqFilterIds.join(",")})`;
2150    }
2151    return query("getTabPaneFrequencySampleData", `
2152    select value, filter_id as filterId, ts, f.cpu
2153    from measure left join cpu_measure_filter as f on f.id=filter_id
2154    where
2155    ts <= $rightNs${str} order by ts asc;
2156`, {$leftNs:leftNs,$rightNs:rightNs})
2157};
2158
2159export const hasFileSysData = () : Promise<Array<any>> =>
2160    query("hasFileSysData",`
2161    select
2162        fsCount,
2163        vmCount,
2164         0 as ioCount from
2165        (select count(1) as fsCount from file_system_sample)
2166        ,(select count(1) as vmCount from virtual_memory_sample)
2167        --,(select count(1) as ioCount from io_latency_sample);
2168    `,{})
2169
2170export const getFileSysChartDataByType = (type:number) : Promise<Array<any>> =>
2171    query("getFileSysChartData",`
2172    select
2173       (A.start_ts -B.start_ts) as startNS,
2174       (A.end_ts - B.start_ts) as endNS,
2175       dur
2176    from file_system_sample A,trace_range B
2177    where type = $type and startNS > 0;`,{$type:type},"exec-buf")
2178
2179export const getFileSysVirtualMemoryChartData = () : Promise<Array<any>> =>
2180    query("getFileSysVirtualMemoryChartData",`
2181    select
2182       (A.start_ts -B.start_ts) as startNS,
2183       (A.end_ts - B.start_ts) as endNS,
2184       dur as dur
2185    from virtual_memory_sample A,trace_range B
2186    where startNS > 0
2187    order by A.start_ts;`,{},"exec-buf")
2188
2189export const getDiskIOProcess = () : Promise<Array<any>> =>
2190    query("getDiskIOProcess",`
2191    select name,B.ipid,pid
2192    from (select distinct ipid from io_latency_sample) A
2193    left join process B on A.ipid = B.ipid;`,{})
2194
2195export const getDiskIOLatencyChartDataByProcess = (all:boolean,ipid:number,typeArr:Array<number>) : Promise<Array<any>> =>
2196    query("getDiskIOLatencyChartDataByProcess",`
2197    select
2198       (A.start_ts -B.start_ts) as startNS,
2199       (A.start_ts - B.start_ts + A.latency_dur) as endNS,
2200       latency_dur as dur
2201    from io_latency_sample A,trace_range B
2202    where type in (${typeArr.join(",")}) and startNS > 0
2203        ${ all ? '' : 'and ipid = ' + ipid }
2204    order by A.start_ts;`,{},"exec-buf")
2205
2206export const querySdkCount = (sql:string, componentId:number ): Promise<Array<any>> =>
2207    query("querySdkCount", sql,{},"exec-sdk-" + componentId)
2208
2209export const querySdkCounterData = (sql:string, counter_id:number, componentId:number): Promise<Array<CounterStruct>> =>
2210    query("querySdkCounterData", sql,{$counter_id:counter_id}, "exec-sdk-" + componentId)
2211
2212export const getTabSdkCounterData = (sqlStr: string, startTime: number, leftNs: number, rightNs: number, counters: Array<string>, componentId: number): Promise<Array<CounterSummary>> =>
2213    query<CounterSummary>("getTabSdkCounterData", sqlStr, {
2214        $startTime:startTime,
2215        $leftNs: leftNs,
2216        $rightNs: rightNs,
2217        $counters:counters
2218    },"exec-sdk-" + componentId)
2219
2220
2221export const getTabSdkCounterLeftData = (sqlStr: string, leftNs: number, counters: Array<string>, componentId: number): Promise<Array<any>> =>
2222    query<any>("getTabSdkCounterLeftData", sqlStr, {
2223        $leftNs: leftNs,
2224        $counters:counters
2225    },"exec-sdk-" + componentId)
2226
2227export const getTabSdkSliceData = (sqlStr: string, startTime:number, leftNs: number, rightNs: number, slices: Array<string>,componentId: number): Promise<Array<SdkSliceSummary>> =>
2228    query<SdkSliceSummary>("getTabSdkSliceData", sqlStr, {
2229        $startTime:startTime,
2230        $leftNs: leftNs,
2231        $rightNs: rightNs,
2232        $slices: slices
2233    },"exec-sdk-" + componentId)
2234
2235export const querySdkSliceData = (sqlStr:string, column_id: number, startNS: number, endNS: number, componentId:number): Promise<Array<SdkSliceStruct>> =>
2236    query("querySdkSliceData", sqlStr, {$column_id: column_id, $startNS: startNS, $endNS: endNS},"exec-sdk-" + componentId)
2237
2238export const queryCounterMax = (sqlStr:string, counter_id:number, componentId:number): Promise<Array<any>> =>
2239    query("queryCounterMax", sqlStr,{$counter_id:counter_id}, "exec-sdk-" + componentId)
2240
2241export const queryAnomalyData = (): Promise<Array<EnergyAnomalyStruct>> =>
2242    query("queryAnomalyData", `select
2243      (S.ts - TR.start_ts) as startNS,
2244      D.data as eventName,
2245      D2.data as appKey,
2246      (case when S.type==1 then group_concat(S.string_value,',') else group_concat(S.int_value,',') end) as Value
2247      from trace_range AS TR,hisys_event_measure as S
2248      left join data_dict as D on D.id=S.name_id
2249      left join app_name as APP on APP.id=S.key_id
2250      left join data_dict as D2 on D2.id=APP.app_key
2251      where D.data in ('ANOMALY_SCREEN_OFF_ENERGY','ANOMALY_KERNEL_WAKELOCK','ANOMALY_CPU_HIGH_FREQUENCY','ANOMALY_WAKEUP')
2252     or (D.data in ('ANOMALY_RUNNINGLOCK','ANORMALY_APP_ENERGY','ANOMALY_GNSS_ENERGY','ANOMALY_CPU_ENERGY','ANOMALY_ALARM_WAKEUP') and D2.data in ("APPNAME"))
2253      group by S.ts,D.data`)
2254
2255export const querySystemData = (): Promise<Array<{
2256    startNs: string
2257    eventName: string
2258    type: string
2259    state: string
2260}>> =>
2261    query("querySystemData", `SELECT
2262        ( S.ts - TR.start_ts ) AS ts,
2263        D.data AS eventName,
2264        D2.data AS appKey,
2265        group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS Value
2266        FROM
2267        trace_range AS TR,
2268        hisys_event_measure AS S
2269        LEFT JOIN data_dict AS D ON D.id = S.name_id
2270        LEFT JOIN app_name AS APP ON APP.id = S.key_id
2271        LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key
2272        WHERE
2273        ( D.data = 'POWER_RUNNINGLOCK' AND D2.data = 'TAG' )
2274        OR ( D.data = 'GNSS_STATE' AND D2.data = 'STATE' )
2275        OR ( D.data IN ( 'WORK_REMOVE', 'WORK_STOP', 'WORK_ADD' ) AND D2.data = 'TYPE' )
2276        GROUP BY
2277        S.ts,
2278        APP.app_key,
2279        D.data,
2280        D2.data;`)
2281
2282export const querySystemDetailsData = (leftNs: number, rightNs: number): Promise<Array<SystemDetailsEnergy>> =>
2283    query("querySystemDetailsData", `SELECT
2284        ( S.ts - TR.start_ts ) AS ts,
2285        D.data AS eventName,
2286        D2.data AS appKey,
2287        group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS appValue
2288        FROM
2289        trace_range AS TR,
2290        hisys_event_measure AS S
2291        LEFT JOIN data_dict AS D ON D.id = S.name_id
2292        LEFT JOIN app_name AS APP ON APP.id = S.key_id
2293        LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key
2294        WHERE
2295        D.data in ('POWER_RUNNINGLOCK', 'GNSS_STATE', 'WORK_REMOVE', 'WORK_STOP', 'WORK_ADD', 'WORK_START')
2296        and
2297        D2.data in ('UID', 'TYPE', 'WORKID', 'NAME', 'INTERVAL', 'TAG', 'STATE', 'STACK', 'APPNAME', 'MESSAGE', 'PID', 'LOG_LEVEL')
2298        and (S.ts - TR.start_ts) >= $leftNS
2299        and (S.ts - TR.start_ts) <= $rightNS
2300        GROUP BY
2301        S.ts,
2302        APP.app_key,
2303        D.data,
2304        D2.data;`, {$leftNS: leftNs, $rightNS: rightNs})
2305
2306export const queryMaxPowerValue = (appName: string): Promise<Array<{
2307    maxValue: number
2308}>> =>
2309    query("queryMaxPowerValue", `SELECT
2310        max( item ) AS maxValue
2311        FROM
2312        (
2313            SELECT
2314            sum( energy + background_energy + screen_on_energy + screen_off_energy + foreground_energy ) AS item
2315            FROM
2316            energy
2317            WHERE
2318            app_name = $appName
2319            GROUP BY
2320            startNs);`, {$appName: appName})
2321
2322export const queryPowerData = (): Promise<Array<{
2323    startNS: number,
2324    eventName: string,
2325    appKey: string,
2326    eventValue: string
2327}>> =>
2328    query("queryPowerData", `SELECT
2329        ( S.ts - TR.start_ts ) AS startNS,
2330        D.data AS eventName,
2331        D2.data AS appKey,
2332        group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS eventValue
2333        FROM
2334        trace_range AS TR,
2335        hisys_event_measure AS S
2336        LEFT JOIN data_dict AS D ON D.id = S.name_id
2337        LEFT JOIN app_name AS APP ON APP.id = S.key_id
2338        LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key
2339        where
2340        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')
2341        and
2342        D2.data in ('BACKGROUND_ENERGY','FOREGROUND_ENERGY','SCREEN_ON_ENERGY','SCREEN_OFF_ENERGY','ENERGY','APPNAME')
2343        GROUP BY
2344        S.ts,
2345        APP.app_key,
2346        D.data,
2347        D2.data
2348        ORDER BY
2349        eventName;`,{})
2350
2351export const getTabPowerDetailsData = (leftNs: number, rightNs: number): Promise<Array<{
2352    startNS: number,
2353    eventName: string,
2354    appKey: string,
2355    eventValue: string,
2356}>> =>
2357    query("getTabPowerDetailsData", `SELECT
2358        ( S.ts - TR.start_ts ) AS startNS,
2359        D.data AS eventName,
2360        D2.data AS appKey,
2361        group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS eventValue
2362        FROM
2363        trace_range AS TR,
2364        hisys_event_measure AS S
2365        LEFT JOIN data_dict AS D ON D.id = S.name_id
2366        LEFT JOIN app_name AS APP ON APP.id = S.key_id
2367        LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key
2368        where
2369        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')
2370        and
2371        D2.data in ('APPNAME')
2372        GROUP BY
2373        S.ts,
2374        APP.app_key,
2375        D.data,
2376        D2.data
2377        UNION
2378        SELECT
2379        ( S.ts - TR.start_ts ) AS startNS,
2380        D.data AS eventName,
2381        D2.data AS appKey,
2382        group_concat( ( CASE WHEN S.type == 1 THEN S.string_value ELSE S.int_value END ), ',' ) AS eventValue
2383        FROM
2384        trace_range AS TR,
2385        hisys_event_measure AS S
2386        LEFT JOIN data_dict AS D ON D.id = S.name_id
2387        LEFT JOIN app_name AS APP ON APP.id = S.key_id
2388        LEFT JOIN data_dict AS D2 ON D2.id = APP.app_key
2389        where
2390        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')
2391        and
2392        D2.data in ('CHARGE','BACKGROUND_TIME','SCREEN_ON_TIME','SCREEN_OFF_TIME','LOAD','USAGE','DURATION','CAMERA_ID',
2393        'FOREGROUND_COUNT','BACKGROUND_COUNT','SCREEN_ON_COUNT','SCREEN_OFF_COUNT','COUNT','UID','FOREGROUND_DURATION',
2394        'FOREGROUND_ENERGY','BACKGROUND_DURATION','BACKGROUND_ENERGY','SCREEN_ON_DURATION','SCREEN_ON_ENERGY',
2395        'SCREEN_OFF_DURATION','SCREEN_OFF_ENERGY','ENERGY')
2396        and
2397        (S.ts - TR.start_ts) >= $leftNS
2398        and (S.ts - TR.start_ts) <= $rightNS
2399        GROUP BY
2400        S.ts,
2401        APP.app_key,
2402        D.data,
2403        D2.data
2404        ORDER BY
2405        eventName;`, {$leftNS: leftNs, $rightNS: rightNs})
2406
2407export const getTabPowerBatteryData = (rightNs: number): Promise<Array<{
2408    ts: number,
2409    eventName: string,
2410    appKey: string
2411    eventValue: string
2412}>> =>
2413    query("getTabPowerBatteryData", `select
2414      MAX(S.ts) as ts,
2415      D.data as eventName,
2416      D2.data as appKey,
2417      group_concat((case when S.type==1 then S.string_value else S.int_value end), ',') as eventValue
2418      from
2419      trace_range AS TR,
2420      hisys_event_measure as S
2421      left join
2422      data_dict as D
2423      on
2424      D.id=S.name_id
2425      left join
2426      app_name as APP
2427      on
2428      APP.id=S.key_id
2429      left join
2430      data_dict as D2
2431      on
2432      D2.id=APP.app_key
2433      where
2434      D.data = 'POWER_IDE_BATTERY'
2435      and D2.data in ('GAS_GAUGE','CHARGE','SCREEN','LEVEL','CURRENT','CAPACITY')
2436      and (S.ts - TR.start_ts) >= 0
2437      and (S.ts - TR.start_ts) <= $rightNS
2438      group by APP.app_key,D.data,D2.data;`, {$rightNS: rightNs})
2439
2440export const queryMaxStateValue = (eventName: string): Promise<Array<{
2441    type: string
2442    maxValue: number
2443}>> =>
2444    query("queryMaxStateValue", `select
2445  D.data as type,
2446  max(S.int_value) as maxValue
2447  from trace_range AS TR,hisys_event_measure as S
2448  left join data_dict as D on D.id=S.name_id
2449  left join app_name as APP on APP.id=S.key_id
2450  left join data_dict as D2 on D2.id=APP.app_key
2451  where (case when 'SENSOR_STATE'==$eventName then D.data like '%SENSOR%' else D.data = $eventName end)
2452  and D2.data in ('BRIGHTNESS','STATE','VALUE','LEVEL','VOLUME','OPER_TYPE','VOLUME')
2453  group by APP.app_key,D.data,D2.data;`, {$eventName: eventName})
2454
2455export const queryStateData = (eventName: string): Promise<Array<EnergyStateStruct>> =>
2456    query("queryStateData", `select
2457  (S.ts-TR.start_ts) as startNs,
2458  D.data as type,
2459  D2.data as appKey,
2460  S.int_value as value
2461  from trace_range AS TR,hisys_event_measure as S
2462  left join data_dict as D on D.id=S.name_id
2463  left join app_name as APP on APP.id=S.key_id
2464  left join data_dict as D2 on D2.id=APP.app_key
2465  where (case when 'SENSOR_STATE'==$eventName then D.data like '%SENSOR%' else D.data = $eventName end)
2466  and D2.data in ('BRIGHTNESS','STATE','VALUE','LEVEL','VOLUME','OPER_TYPE','VOLUME')
2467  group by S.ts,APP.app_key,D.data,D2.data;`, {$eventName: eventName})
2468
2469export const querySyseventAppName = (): Promise<Array<{
2470    string_value: string | null
2471}>> =>
2472    query("querySyseventAppName", `
2473    SELECT
2474    DISTINCT hisys_event_measure.string_value from data_dict
2475    left join app_name on app_name.app_key=data_dict.id
2476    left join hisys_event_measure on hisys_event_measure.key_id = app_name.id
2477    where data_dict.data = "APPNAME"`)
2478
2479export const queryAnomalyDetailedData = (leftNs: number, rightNs: number): Promise<Array<EnergyAnomalyStruct>> =>
2480    query<EnergyAnomalyStruct>("queryAnomalyDetailedData", `select
2481  S.ts,
2482  D.data as eventName,
2483  D2.data as appKey,
2484  group_concat((case when S.type==1 then S.string_value else S.int_value end), ',') as Value
2485  from trace_range AS TR,hisys_event_measure as S
2486  left join data_dict as D on D.id=S.name_id
2487  left join app_name as APP on APP.id=S.key_id
2488  left join data_dict as D2 on D2.id=APP.app_key
2489  where D.data in ('ANOMALY_SCREEN_OFF_ENERGY','ANOMALY_ALARM_WAKEUP','ANOMALY_KERNEL_WAKELOCK',
2490  'ANOMALY_RUNNINGLOCK','ANORMALY_APP_ENERGY','ANOMALY_GNSS_ENERGY','ANOMALY_CPU_HIGH_FREQUENCY','ANOMALY_CPU_ENERGY','ANOMALY_WAKEUP')
2491  and D2.data in ('APPNAME')
2492  and (S.ts - TR.start_ts) >= $leftNS
2493   and (S.ts - TR.start_ts) <= $rightNS
2494  group by S.ts,APP.app_key,D.data,D2.data
2495  union
2496  select
2497  S.ts,
2498  D.data as eventName,
2499  D2.data as appKey,
2500  group_concat((case when S.type==1 then S.string_value else S.int_value end), ',') as Value
2501  from trace_range AS TR,hisys_event_measure as S
2502  left join data_dict as D on D.id=S.name_id
2503  left join app_name as APP on APP.id=S.key_id
2504  left join data_dict as D2 on D2.id=APP.app_key
2505  where D.data in ('ANOMALY_SCREEN_OFF_ENERGY','ANOMALY_ALARM_WAKEUP','ANOMALY_KERNEL_WAKELOCK',
2506  'ANOMALY_RUNNINGLOCK','ANORMALY_APP_ENERGY','ANOMALY_GNSS_ENERGY','ANOMALY_CPU_HIGH_FREQUENCY','ANOMALY_CPU_ENERGY','ANOMALY_WAKEUP')
2507  and D2.data not in ('pid_','tid_','type_','tz_','uid_','domain_', 'id_', 'level_', 'info_', 'tag_', 'APPNAME')
2508  and (S.ts - TR.start_ts) >= $leftNS
2509   and (S.ts - TR.start_ts) <= $rightNS
2510  group by S.ts,APP.app_key,D.data,D2.data;`, {$leftNS: leftNs, $rightNS: rightNs})
2511
2512export const querySmapsExits = (): Promise<Array<any>> =>
2513    query("querySmapsExits", `select
2514      event_name
2515      from stat s
2516      where s.event_name = 'trace_smaps'
2517      and s.stat_type ='received' and s.count > 0`)
2518
2519export const querySmapsData = (columnName: string): Promise<Array<any>> =>
2520    query("querySmapsCounterData",
2521        `SELECT (A.timestamp - B.start_ts) as startNS, sum(${columnName}) as value FROM smaps A,trace_range B GROUP by A.timestamp;`)
2522
2523export const querySmapsDataMax = (columnName: string): Promise<Array<any>> =>
2524    query("querySmapsDataMax", `
2525   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`)
2526
2527export const getTabSmapsMaxRss = (leftNs: number, rightNs: number): Promise<Array<any>> =>
2528    query<Smaps>("getTabSmapsMaxRss", `
2529SELECT (A.timestamp - B.start_ts) as startNS, sum(resident_size) as max_value FROM smaps A,trace_range B where startNS <= $rightNs`, {$rightNs:rightNs})
2530
2531export const getTabSmapsData = (leftNs: number, rightNs: number): Promise<Array<Smaps>> =>
2532    query<Smaps>("getTabSmapsData", `
2533    SELECT
2534     (A.timestamp - t.start_ts) AS tsNS,
2535     start_addr,
2536     end_addr,
2537     dirty,
2538     swapper,
2539     resident_size AS rss,
2540     pss,virtaul_size AS size,reside,f.data AS permission,d.data AS path
2541     FROM smaps A
2542     LEFT JOIN data_dict d ON a.path_id = d.id LEFT
2543     JOIN data_dict f ON a.protection_id = f.id,
2544     trace_range AS t
2545     WHERE tsNS <= $rightNs`, {$rightNs : rightNs},"exec")
2546
2547export const getTabVirtualMemoryType = (startTime: number, endTime: number): Promise<Array<string>> =>
2548    query("getTabVirtualMemoryType", `
2549    SELECT type from virtual_memory_sample s,trace_range t
2550     WHERE s.end_ts between $startTime + t.start_ts and $endTime + t.start_ts group by type`, {$startTime : startTime,$endTime:endTime},"exec")
2551
2552export const getCpuLimitFreqId = (): Promise<Array<CpuFreqRowLimit>> =>
2553    query("getCpuMaxMinFreqId", `
2554    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
2555`, {})
2556
2557export const getCpuLimitFreqMax = (filterIds:string): Promise<Array<any>> =>{
2558    return query("getCpuLimitFreqMax", `
2559    select max(value) as maxValue,filter_id as filterId from measure where filter_id in (${filterIds}) group by filter_id
2560`, {})
2561}
2562
2563export const getCpuLimitFreq = (maxId: number, minId: number,cpu:number): Promise<Array<CpuFreqLimitsStruct>> =>
2564    query("getCpuLimitFreq", `
2565    select ts - T.start_ts as startNs,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
2566`, {$maxId : maxId,$minId : minId,$cpu : cpu})
2567
2568export const queryHisystemEventExits = (): Promise<Array<any>> =>
2569    query("queryHisystemEventExits", `select
2570      event_name
2571      from stat s
2572      where s.event_name = 'trace_hisys_event'
2573      and s.stat_type ='received' and s.count > 0`)
2574
2575