1fb726d48Sopenharmony_ci/*
2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd.
3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb726d48Sopenharmony_ci * You may obtain a copy of the License at
6fb726d48Sopenharmony_ci *
7fb726d48Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fb726d48Sopenharmony_ci *
9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and
13fb726d48Sopenharmony_ci * limitations under the License.
14fb726d48Sopenharmony_ci */
15fb726d48Sopenharmony_ci
16fb726d48Sopenharmony_ciimport { query } from '../SqlLite';
17fb726d48Sopenharmony_ciimport { IrqStruct } from '../ui-worker/ProcedureWorkerIrq';
18fb726d48Sopenharmony_ciimport { IrqAndSoftirqBean } from '../../component/trace/sheet/irq/irqAndSoftirqBean'
19fb726d48Sopenharmony_ciimport { Utils } from '../../component/trace/base/Utils';
20fb726d48Sopenharmony_ci
21fb726d48Sopenharmony_ciexport const queryIrqList = (traceId?: string): Promise<Array<{ name: string; cpu: number }>> =>
22fb726d48Sopenharmony_ci  query('queryIrqList',
23fb726d48Sopenharmony_ci  `SELECT 
24fb726d48Sopenharmony_ci  * 
25fb726d48Sopenharmony_ci  FROM
26fb726d48Sopenharmony_ci    (SELECT DISTINCT cat AS name, callid AS cpu FROM irq WHERE cat<>'ipi')
27fb726d48Sopenharmony_ci  ORDER By 
28fb726d48Sopenharmony_ci    name,
29fb726d48Sopenharmony_ci    cpu`
30fb726d48Sopenharmony_ci    , {}, { traceId: traceId });
31fb726d48Sopenharmony_ci
32fb726d48Sopenharmony_ciexport const queryAllIrqNames = async (traceId?: string): Promise<Array<{ ipiName: string; name: string; id: number }>> => {
33fb726d48Sopenharmony_ci  let allIrqNamesBuffer = await query(
34fb726d48Sopenharmony_ci    'queryAllIrqNames',
35fb726d48Sopenharmony_ci    `select
36fb726d48Sopenharmony_ci      id,
37fb726d48Sopenharmony_ci      case 
38fb726d48Sopenharmony_ci    when 
39fb726d48Sopenharmony_ci      cat = 'ipi' then 'IPI' || name else name end as ipiName from irq;`,
40fb726d48Sopenharmony_ci    {}, 
41fb726d48Sopenharmony_ci    { traceId: traceId, action: 'exec-buf' }
42fb726d48Sopenharmony_ci  );
43fb726d48Sopenharmony_ci  // @ts-ignore
44fb726d48Sopenharmony_ci  return Utils.convertJSON(allIrqNamesBuffer);
45fb726d48Sopenharmony_ci};
46fb726d48Sopenharmony_ci
47fb726d48Sopenharmony_ciexport const queryIrqData = (callid: number, cat: string): Promise<Array<IrqStruct>> => {
48fb726d48Sopenharmony_ci  let sqlSoftIrq = `
49fb726d48Sopenharmony_ci    select i.ts - t.start_ts as startNS,i.dur,i.name,i.depth,argsetid as argSetId,i.id from irq i,
50fb726d48Sopenharmony_citrace_range t where i.callid = ${callid} and i.cat = 'softirq'
51fb726d48Sopenharmony_ci    `;
52fb726d48Sopenharmony_ci  let sqlIrq = `
53fb726d48Sopenharmony_ci    select i.ts - t.start_ts as startNS,i.dur,
54fb726d48Sopenharmony_ci        case when i.cat = 'ipi' then 'IPI' || i.name else i.name end as name,
55fb726d48Sopenharmony_ci        i.depth,
56fb726d48Sopenharmony_ci        argsetid as argSetId,
57fb726d48Sopenharmony_ci        i.id 
58fb726d48Sopenharmony_ci        from irq i,trace_range t 
59fb726d48Sopenharmony_ci        where i.callid = ${callid} and ((i.cat = 'irq' and i.flag ='1') or i.cat = 'ipi') 
60fb726d48Sopenharmony_ci    `;
61fb726d48Sopenharmony_ci  return query('queryIrqData', cat === 'irq' ? sqlIrq : sqlSoftIrq, {});
62fb726d48Sopenharmony_ci};
63fb726d48Sopenharmony_ci
64fb726d48Sopenharmony_ciexport const queryIrqDataBoxSelect = (
65fb726d48Sopenharmony_ci  callIds: Array<number>,
66fb726d48Sopenharmony_ci  startNS: number,
67fb726d48Sopenharmony_ci  endNS: number
68fb726d48Sopenharmony_ci): Promise<Array<unknown>> => {
69fb726d48Sopenharmony_ci  let sqlIrq = `
70fb726d48Sopenharmony_ciselect case when i.cat = 'ipi' then 'IPI' || i.name else i.name end as irqName,
71fb726d48Sopenharmony_ci       'irq'                                                        as cat,
72fb726d48Sopenharmony_ci       sum(
73fb726d48Sopenharmony_ci        min(${endNS},(i.ts - t.start_ts + iif(i.dur = -1 or i.dur is null, 0, i.dur))) - max(${startNS},i.ts - t.start_ts)
74fb726d48Sopenharmony_ci        )                                                           as wallDuration,
75fb726d48Sopenharmony_ci       max(dur)                                                     as maxDuration,
76fb726d48Sopenharmony_ci       count(1)                                                     as count,
77fb726d48Sopenharmony_ci       avg(ifnull(dur, 0))                                          as avgDuration
78fb726d48Sopenharmony_cifrom irq i,
79fb726d48Sopenharmony_ci     trace_range t
80fb726d48Sopenharmony_ciwhere ((i.cat = 'irq' and i.flag = '1') or i.cat = 'ipi')
81fb726d48Sopenharmony_ci  and callid in (${callIds.join(',')})
82fb726d48Sopenharmony_ci  and max(i.ts - t.start_ts, ${startNS}) <= min(i.ts - t.start_ts + dur, ${endNS})
83fb726d48Sopenharmony_cigroup by irqName;
84fb726d48Sopenharmony_ci    `;
85fb726d48Sopenharmony_ci  return query('queryIrqDataBoxSelect', callIds.length > 0 ? sqlIrq : '', {}, { traceId: Utils.currentSelectTrace });
86fb726d48Sopenharmony_ci};
87fb726d48Sopenharmony_ci
88fb726d48Sopenharmony_ciexport const querySoftIrqDataBoxSelect = (
89fb726d48Sopenharmony_ci  callIds: Array<number>,
90fb726d48Sopenharmony_ci  startNS: number,
91fb726d48Sopenharmony_ci  endNS: number
92fb726d48Sopenharmony_ci): Promise<Array<unknown>> => {
93fb726d48Sopenharmony_ci  let sqlIrq = `
94fb726d48Sopenharmony_ciselect i.name              as irqName,
95fb726d48Sopenharmony_ci       i.cat,
96fb726d48Sopenharmony_ci       sum(
97fb726d48Sopenharmony_ci         min(${endNS},(i.ts - t.start_ts + iif(i.dur = -1 or i.dur is null, 0, i.dur))) - max(${startNS},i.ts - t.start_ts)
98fb726d48Sopenharmony_ci         )                 as wallDuration,
99fb726d48Sopenharmony_ci       max(dur)            as maxDuration,
100fb726d48Sopenharmony_ci       count(1)            as count,
101fb726d48Sopenharmony_ci       avg(ifnull(dur, 0)) as avgDuration
102fb726d48Sopenharmony_cifrom irq i,
103fb726d48Sopenharmony_ci     trace_range t
104fb726d48Sopenharmony_ciwhere callid in (${callIds.join(',')})
105fb726d48Sopenharmony_ci  and i.cat = 'softirq'
106fb726d48Sopenharmony_ci  and max(i.ts - t.start_ts, ${startNS}) <= min(i.ts - t.start_ts + dur, ${endNS})
107fb726d48Sopenharmony_cigroup by irqName;
108fb726d48Sopenharmony_ci    `;
109fb726d48Sopenharmony_ci  return query('querySoftIrqDataBoxSelect', callIds.length > 0 ? sqlIrq : '', {}, { traceId: Utils.currentSelectTrace });
110fb726d48Sopenharmony_ci};
111fb726d48Sopenharmony_ci
112fb726d48Sopenharmony_ciexport const queryIrqSelectData = (callIds: Array<number>, startNS: number, endNS: number): Promise<Array<IrqAndSoftirqBean>> =>
113fb726d48Sopenharmony_ci  query(
114fb726d48Sopenharmony_ci    'getIrqSelectData',
115fb726d48Sopenharmony_ci    `
116fb726d48Sopenharmony_ci    SELECT
117fb726d48Sopenharmony_ci        'irq' AS cat,
118fb726d48Sopenharmony_ci        i.callid,
119fb726d48Sopenharmony_ci        CASE
120fb726d48Sopenharmony_ci          WHEN i.cat = 'ipi'
121fb726d48Sopenharmony_ci          THEN 'IPI' || i.name
122fb726d48Sopenharmony_ci          ELSE i.name
123fb726d48Sopenharmony_ci          END AS name,
124fb726d48Sopenharmony_ci        1 As count,
125fb726d48Sopenharmony_ci        true As isFirstObject,
126fb726d48Sopenharmony_ci        2 AS priority, 
127fb726d48Sopenharmony_ci        MAX(${startNS},i.ts - TR.start_ts) AS startTime,
128fb726d48Sopenharmony_ci        MIN(${endNS},(i.ts - TR.start_ts + iif(i.dur = -1 OR i.dur IS NULL, 0, i.dur))) AS endTime,
129fb726d48Sopenharmony_ci        MIN(${endNS},(i.ts - TR.start_ts + iif(i.dur = -1 OR i.dur IS NULL, 0, i.dur))) - MAX(${startNS},i.ts - TR.start_ts) AS wallDuration 
130fb726d48Sopenharmony_ci    FROM
131fb726d48Sopenharmony_ci      irq i 
132fb726d48Sopenharmony_ci    LEFT JOIN
133fb726d48Sopenharmony_ci      trace_range AS TR
134fb726d48Sopenharmony_ci      WHERE
135fb726d48Sopenharmony_ci      i.callid IN (${callIds.join(',')})
136fb726d48Sopenharmony_ci    AND
137fb726d48Sopenharmony_ci      NOT ((i.ts - TR.start_ts + iif(i.dur = -1 OR i.dur IS NULL, 0, i.dur) < ${startNS}) OR (i.ts - TR.start_ts > ${endNS}))
138fb726d48Sopenharmony_ci    AND ( ( i.cat = 'irq' AND i.flag = '1' ) OR i.cat = 'ipi' )`
139fb726d48Sopenharmony_ci  );
140fb726d48Sopenharmony_ci
141fb726d48Sopenharmony_ciexport const querySoftirqSelectData = (callIds: Array<number>, startNS: number, endNS: number): Promise<Array<IrqAndSoftirqBean>> =>
142fb726d48Sopenharmony_ci  query(
143fb726d48Sopenharmony_ci    'getSoftirqSelectData',
144fb726d48Sopenharmony_ci    `
145fb726d48Sopenharmony_ci      SELECT
146fb726d48Sopenharmony_ci          'softirq' AS cat,
147fb726d48Sopenharmony_ci          i.callid,
148fb726d48Sopenharmony_ci          i.name,
149fb726d48Sopenharmony_ci          1 As count,
150fb726d48Sopenharmony_ci          true As isFirstObject,
151fb726d48Sopenharmony_ci          1 AS priority, 
152fb726d48Sopenharmony_ci          MAX(${startNS},i.ts - TR.start_ts) AS startTime,
153fb726d48Sopenharmony_ci          MIN(${endNS},(i.ts - TR.start_ts + iif(i.dur = -1 OR i.dur IS NULL, 0, i.dur))) AS endTime,
154fb726d48Sopenharmony_ci          MIN(${endNS},(i.ts - TR.start_ts + iif(i.dur = -1 OR i.dur IS NULL, 0, i.dur))) - MAX(${startNS},i.ts - TR.start_ts) AS wallDuration 
155fb726d48Sopenharmony_ci      FROM
156fb726d48Sopenharmony_ci        irq i 
157fb726d48Sopenharmony_ci      LEFT JOIN
158fb726d48Sopenharmony_ci        trace_range AS TR
159fb726d48Sopenharmony_ci      WHERE
160fb726d48Sopenharmony_ci        i.callid IN (${callIds.join(',')})
161fb726d48Sopenharmony_ci      AND
162fb726d48Sopenharmony_ci        NOT ((i.ts - TR.start_ts + iif(i.dur = -1 OR i.dur IS NULL, 0, i.dur) < ${startNS}) OR (i.ts - TR.start_ts > ${endNS}))
163fb726d48Sopenharmony_ci      AND 
164fb726d48Sopenharmony_ci        i.cat = 'softirq' `
165fb726d48Sopenharmony_ci  );