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_ciimport { TraficEnum } from './utils/QueryEnum';
16fb726d48Sopenharmony_ciimport { hiSysEventList } from './utils/AllMemoryCache';
17fb726d48Sopenharmony_ciimport { filterDataByGroupLayer } from './utils/DataFilter';
18fb726d48Sopenharmony_ciimport { Args } from './CommonArgs';
19fb726d48Sopenharmony_ci
20fb726d48Sopenharmony_ciexport const chartHiSysEventDataSql = (args: Args): string => {
21fb726d48Sopenharmony_ci  return `
22fb726d48Sopenharmony_ci      SELECT S.id,
23fb726d48Sopenharmony_ci             (S.ts - ${
24fb726d48Sopenharmony_ci               args.recordStartNS
25fb726d48Sopenharmony_ci             })                                                                                 AS startNs,
26fb726d48Sopenharmony_ci             pid,
27fb726d48Sopenharmony_ci             tid,
28fb726d48Sopenharmony_ci             uid,
29fb726d48Sopenharmony_ci             seq,
30fb726d48Sopenharmony_ci             CASE
31fb726d48Sopenharmony_ci                 WHEN S.level = 'MINOR' THEN 0
32fb726d48Sopenharmony_ci                 WHEN S.level = 'CRITICAL' THEN 1
33fb726d48Sopenharmony_ci                 END
34fb726d48Sopenharmony_ci                                                                                                                            AS depth,
35fb726d48Sopenharmony_ci             1                                                                                                              AS dur,
36fb726d48Sopenharmony_ci             ((S.ts - ${args.recordStartNS}) / (${Math.floor((args.endNS - args.startNS) / args.width)})) + (CASE
37fb726d48Sopenharmony_ci                                                                                                                 WHEN S.level = 'MINOR'
38fb726d48Sopenharmony_ci                                                                                                                     THEN 0
39fb726d48Sopenharmony_ci                                                                                                                 WHEN S.level = 'CRITICAL'
40fb726d48Sopenharmony_ci                                                                                                                     THEN 1
41fb726d48Sopenharmony_ci                                                                                                                 END *
42fb726d48Sopenharmony_ci                                                                                                             ${
43fb726d48Sopenharmony_ci                                                                                                               args.width
44fb726d48Sopenharmony_ci                                                                                                             }) AS px
45fb726d48Sopenharmony_ci      FROM hisys_all_event AS S
46fb726d48Sopenharmony_ci      where S.id is not null
47fb726d48Sopenharmony_ci        and startNs + dur >= ${Math.floor(args.startNS)}
48fb726d48Sopenharmony_ci        and startNs <= ${Math.floor(args.endNS)}
49fb726d48Sopenharmony_ci      group by px`;
50fb726d48Sopenharmony_ci};
51fb726d48Sopenharmony_ci
52fb726d48Sopenharmony_ciexport const chartHiSysEventSql = (args: Args): string => {
53fb726d48Sopenharmony_ci  return `
54fb726d48Sopenharmony_ci     SELECT S.id,
55fb726d48Sopenharmony_ci             (S.ts - ${args.recordStartNS})                                                                                 AS startNs,
56fb726d48Sopenharmony_ci             pid,
57fb726d48Sopenharmony_ci             tid,
58fb726d48Sopenharmony_ci             uid,
59fb726d48Sopenharmony_ci             seq,
60fb726d48Sopenharmony_ci             CASE
61fb726d48Sopenharmony_ci                 WHEN S.level = 'MINOR' THEN 0
62fb726d48Sopenharmony_ci                 WHEN S.level = 'CRITICAL' THEN 1
63fb726d48Sopenharmony_ci                 END
64fb726d48Sopenharmony_ci                                                                                                                            AS depth,
65fb726d48Sopenharmony_ci             1                                                                                                              AS dur
66fb726d48Sopenharmony_ci      FROM hisys_all_event AS S
67fb726d48Sopenharmony_ci      where S.id is not null
68fb726d48Sopenharmony_ci      ORDER BY S.id`;
69fb726d48Sopenharmony_ci};
70fb726d48Sopenharmony_ci
71fb726d48Sopenharmony_ciexport function hiSysEventDataReceiver(data: unknown, proc: Function): void {
72fb726d48Sopenharmony_ci  // @ts-ignore
73fb726d48Sopenharmony_ci  if (data.params.trafic === TraficEnum.Memory) {
74fb726d48Sopenharmony_ci    // @ts-ignore
75fb726d48Sopenharmony_ci    if (!hiSysEventList.has(data.params.id)) {
76fb726d48Sopenharmony_ci      // @ts-ignore
77fb726d48Sopenharmony_ci      let sql = chartHiSysEventSql(data.params);
78fb726d48Sopenharmony_ci      // @ts-ignore
79fb726d48Sopenharmony_ci      hiSysEventList.set(data.params.id, proc(sql));
80fb726d48Sopenharmony_ci    }
81fb726d48Sopenharmony_ci    // @ts-ignore
82fb726d48Sopenharmony_ci    let list = hiSysEventList.get(data.params.id) || [];
83fb726d48Sopenharmony_ci    let res = filterDataByGroupLayer(
84fb726d48Sopenharmony_ci      list || [],
85fb726d48Sopenharmony_ci      'depth',
86fb726d48Sopenharmony_ci      'startNs',
87fb726d48Sopenharmony_ci      'dur',
88fb726d48Sopenharmony_ci      // @ts-ignore
89fb726d48Sopenharmony_ci      data.params.startNS,
90fb726d48Sopenharmony_ci      // @ts-ignore
91fb726d48Sopenharmony_ci      data.params.endNS,
92fb726d48Sopenharmony_ci      // @ts-ignore
93fb726d48Sopenharmony_ci      data.params.width
94fb726d48Sopenharmony_ci    );
95fb726d48Sopenharmony_ci    // @ts-ignore
96fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
97fb726d48Sopenharmony_ci  } else {
98fb726d48Sopenharmony_ci    // @ts-ignore
99fb726d48Sopenharmony_ci    let sql = chartHiSysEventDataSql(data.params);
100fb726d48Sopenharmony_ci    let res = proc(sql);
101fb726d48Sopenharmony_ci    // @ts-ignore
102fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
103fb726d48Sopenharmony_ci  }
104fb726d48Sopenharmony_ci}
105fb726d48Sopenharmony_ci
106fb726d48Sopenharmony_cifunction arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void {
107fb726d48Sopenharmony_ci  // @ts-ignore
108fb726d48Sopenharmony_ci  let id = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.id);
109fb726d48Sopenharmony_ci  // @ts-ignore
110fb726d48Sopenharmony_ci  let ts = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.ts);
111fb726d48Sopenharmony_ci  // @ts-ignore
112fb726d48Sopenharmony_ci  let pid = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.pid);
113fb726d48Sopenharmony_ci  // @ts-ignore
114fb726d48Sopenharmony_ci  let tid = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.tid);
115fb726d48Sopenharmony_ci  // @ts-ignore
116fb726d48Sopenharmony_ci  let seq = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.seq);
117fb726d48Sopenharmony_ci  // @ts-ignore
118fb726d48Sopenharmony_ci  let uid = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.uid);
119fb726d48Sopenharmony_ci  // @ts-ignore
120fb726d48Sopenharmony_ci  let dur = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.dur);
121fb726d48Sopenharmony_ci  // @ts-ignore
122fb726d48Sopenharmony_ci  let depth = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.depth);
123fb726d48Sopenharmony_ci  res.forEach((it, index) => {
124fb726d48Sopenharmony_ci    // @ts-ignore
125fb726d48Sopenharmony_ci    data.params.trafic === TraficEnum.ProtoBuffer && (it = it.hiSysEventData);
126fb726d48Sopenharmony_ci    // @ts-ignore
127fb726d48Sopenharmony_ci    uid[index] = it.uid;
128fb726d48Sopenharmony_ci    // @ts-ignore
129fb726d48Sopenharmony_ci    id[index] = it.id;
130fb726d48Sopenharmony_ci    // @ts-ignore
131fb726d48Sopenharmony_ci    ts[index] = it.startNs || it.ts;
132fb726d48Sopenharmony_ci    // @ts-ignore
133fb726d48Sopenharmony_ci    pid[index] = it.pid;
134fb726d48Sopenharmony_ci    // @ts-ignore
135fb726d48Sopenharmony_ci    tid[index] = it.tid;
136fb726d48Sopenharmony_ci    // @ts-ignore
137fb726d48Sopenharmony_ci    seq[index] = it.seq;
138fb726d48Sopenharmony_ci    // @ts-ignore
139fb726d48Sopenharmony_ci    dur[index] = it.dur;
140fb726d48Sopenharmony_ci    // @ts-ignore
141fb726d48Sopenharmony_ci    depth[index] = it.depth;
142fb726d48Sopenharmony_ci  });
143fb726d48Sopenharmony_ci  (self as unknown as Worker).postMessage(
144fb726d48Sopenharmony_ci    {
145fb726d48Sopenharmony_ci      // @ts-ignore
146fb726d48Sopenharmony_ci      id: data.id,
147fb726d48Sopenharmony_ci      // @ts-ignore
148fb726d48Sopenharmony_ci      action: data.action,
149fb726d48Sopenharmony_ci      results: transfer
150fb726d48Sopenharmony_ci        ? {
151fb726d48Sopenharmony_ci            uid: uid.buffer,
152fb726d48Sopenharmony_ci            id: id.buffer,
153fb726d48Sopenharmony_ci            ts: ts.buffer,
154fb726d48Sopenharmony_ci            pid: pid.buffer,
155fb726d48Sopenharmony_ci            tid: tid.buffer,
156fb726d48Sopenharmony_ci            seq: seq.buffer,
157fb726d48Sopenharmony_ci            dur: dur.buffer,
158fb726d48Sopenharmony_ci            depth: depth.buffer,
159fb726d48Sopenharmony_ci          }
160fb726d48Sopenharmony_ci        : {},
161fb726d48Sopenharmony_ci      len: res.length,
162fb726d48Sopenharmony_ci      transfer: transfer,
163fb726d48Sopenharmony_ci    },
164fb726d48Sopenharmony_ci    transfer ? [id.buffer, ts.buffer, pid.buffer, tid.buffer, uid.buffer, dur.buffer, seq.buffer, depth.buffer] : []
165fb726d48Sopenharmony_ci  );
166fb726d48Sopenharmony_ci}
167