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 { hiLogList } from './utils/AllMemoryCache';
17fb726d48Sopenharmony_ciimport { filterDataByGroupLayer } from './utils/DataFilter';
18fb726d48Sopenharmony_ciimport { Args } from './CommonArgs';
19fb726d48Sopenharmony_ci
20fb726d48Sopenharmony_ciexport const chartLogDataSql = (args: Args): string => {
21fb726d48Sopenharmony_ci  return `SELECT l.seq                   AS id,
22fb726d48Sopenharmony_ci                 l.pid,
23fb726d48Sopenharmony_ci                 l.tid,
24fb726d48Sopenharmony_ci                 CASE
25fb726d48Sopenharmony_ci                     WHEN l.ts < ${args.oneDayTime} THEN 0
26fb726d48Sopenharmony_ci                     ELSE (l.ts - ${args.recordStartNS})
27fb726d48Sopenharmony_ci                     END                 AS startTs,
28fb726d48Sopenharmony_ci                 CASE
29fb726d48Sopenharmony_ci                     WHEN l.level = 'D' THEN 0
30fb726d48Sopenharmony_ci                     WHEN l.level = 'I' THEN 1
31fb726d48Sopenharmony_ci                     WHEN l.level = 'W' THEN 2
32fb726d48Sopenharmony_ci                     WHEN l.level = 'E' THEN 3
33fb726d48Sopenharmony_ci                     WHEN l.level = 'F' THEN 4
34fb726d48Sopenharmony_ci                     END                 AS depth,
35fb726d48Sopenharmony_ci                 1                       AS dur,
36fb726d48Sopenharmony_ci                 ((l.ts - ${args.recordStartNS}) / (${Math.floor((args.endNS - args.startNS) / args.width)})) +
37fb726d48Sopenharmony_ci                 CASE
38fb726d48Sopenharmony_ci                     WHEN l.level = 'D' THEN 0
39fb726d48Sopenharmony_ci                     WHEN l.level = 'I' THEN 1
40fb726d48Sopenharmony_ci                     WHEN l.level = 'W' THEN 2
41fb726d48Sopenharmony_ci                     WHEN l.level = 'E' THEN 3
42fb726d48Sopenharmony_ci                     WHEN l.level = 'F' THEN 4
43fb726d48Sopenharmony_ci                     END * ${args.width} AS px
44fb726d48Sopenharmony_ci          FROM (SELECT DISTINCT seq FROM log) AS inner_log
45fb726d48Sopenharmony_ci                   JOIN log AS l ON l.seq = inner_log.seq
46fb726d48Sopenharmony_ci          WHERE (CASE
47fb726d48Sopenharmony_ci                     WHEN l.ts < ${args.oneDayTime} THEN 0
48fb726d48Sopenharmony_ci                     ELSE (l.ts - ${args.recordStartNS})
49fb726d48Sopenharmony_ci              END) + 1 >= ${Math.floor(args.startNS)}
50fb726d48Sopenharmony_ci            AND (CASE
51fb726d48Sopenharmony_ci                     WHEN l.ts < ${args.oneDayTime} THEN 0
52fb726d48Sopenharmony_ci                     ELSE (l.ts - ${args.recordStartNS})
53fb726d48Sopenharmony_ci              END) <= ${Math.floor(args.endNS)}
54fb726d48Sopenharmony_ci          GROUP BY px`;
55fb726d48Sopenharmony_ci};
56fb726d48Sopenharmony_ci
57fb726d48Sopenharmony_ciexport const chartLogDataMemorySql = (args: Args): string => {
58fb726d48Sopenharmony_ci  return `SELECT l.seq                   AS id,
59fb726d48Sopenharmony_ci                 l.pid,
60fb726d48Sopenharmony_ci                 l.tid,
61fb726d48Sopenharmony_ci                 CASE
62fb726d48Sopenharmony_ci                     WHEN l.ts < ${args.oneDayTime} THEN 0
63fb726d48Sopenharmony_ci                     ELSE (l.ts - ${args.recordStartNS})
64fb726d48Sopenharmony_ci                     END                 AS startTs,
65fb726d48Sopenharmony_ci                 CASE
66fb726d48Sopenharmony_ci                     WHEN l.level = 'D' THEN 0
67fb726d48Sopenharmony_ci                     WHEN l.level = 'I' THEN 1
68fb726d48Sopenharmony_ci                     WHEN l.level = 'W' THEN 2
69fb726d48Sopenharmony_ci                     WHEN l.level = 'E' THEN 3
70fb726d48Sopenharmony_ci                     WHEN l.level = 'F' THEN 4
71fb726d48Sopenharmony_ci                     END                 AS depth,
72fb726d48Sopenharmony_ci                 1                       AS dur
73fb726d48Sopenharmony_ci          FROM (SELECT DISTINCT seq FROM log) AS inner_log
74fb726d48Sopenharmony_ci                   JOIN log AS l ON l.seq = inner_log.seq
75fb726d48Sopenharmony_ci          ORDER BY l.seq`;
76fb726d48Sopenharmony_ci};
77fb726d48Sopenharmony_ci
78fb726d48Sopenharmony_ciexport function logDataReceiver(data: unknown, proc: Function): void {
79fb726d48Sopenharmony_ci  // @ts-ignore
80fb726d48Sopenharmony_ci  if (data.params.trafic === TraficEnum.Memory) {
81fb726d48Sopenharmony_ci    // @ts-ignore
82fb726d48Sopenharmony_ci    if (!hiLogList.has(data.params.id)) {
83fb726d48Sopenharmony_ci      // @ts-ignore
84fb726d48Sopenharmony_ci      let sql = chartLogDataMemorySql(data.params);
85fb726d48Sopenharmony_ci      // @ts-ignore
86fb726d48Sopenharmony_ci      hiLogList.set(data.params.id, proc(sql));
87fb726d48Sopenharmony_ci    }
88fb726d48Sopenharmony_ci    // @ts-ignore
89fb726d48Sopenharmony_ci    let list = hiLogList.get(data.params.id) || [];
90fb726d48Sopenharmony_ci    let res = filterDataByGroupLayer(
91fb726d48Sopenharmony_ci      list || [],
92fb726d48Sopenharmony_ci      'depth',
93fb726d48Sopenharmony_ci      'startTs',
94fb726d48Sopenharmony_ci      'dur',
95fb726d48Sopenharmony_ci      // @ts-ignore
96fb726d48Sopenharmony_ci      data.params.startNS,
97fb726d48Sopenharmony_ci      // @ts-ignore
98fb726d48Sopenharmony_ci      data.params.endNS,
99fb726d48Sopenharmony_ci      // @ts-ignore
100fb726d48Sopenharmony_ci      data.params.width
101fb726d48Sopenharmony_ci    );
102fb726d48Sopenharmony_ci    // @ts-ignore
103fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
104fb726d48Sopenharmony_ci  } else {
105fb726d48Sopenharmony_ci    // @ts-ignore
106fb726d48Sopenharmony_ci    let sql = chartLogDataSql(data.params);
107fb726d48Sopenharmony_ci    let res = proc(sql);
108fb726d48Sopenharmony_ci    // @ts-ignore
109fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
110fb726d48Sopenharmony_ci  }
111fb726d48Sopenharmony_ci}
112fb726d48Sopenharmony_ci
113fb726d48Sopenharmony_cifunction arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void {
114fb726d48Sopenharmony_ci  // @ts-ignore
115fb726d48Sopenharmony_ci  let id = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.id);
116fb726d48Sopenharmony_ci  // @ts-ignore
117fb726d48Sopenharmony_ci  let startTs = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startTs);
118fb726d48Sopenharmony_ci  // @ts-ignore
119fb726d48Sopenharmony_ci  let pid = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.pid);
120fb726d48Sopenharmony_ci  // @ts-ignore
121fb726d48Sopenharmony_ci  let tid = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.tid);
122fb726d48Sopenharmony_ci  // @ts-ignore
123fb726d48Sopenharmony_ci  let dur = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.dur);
124fb726d48Sopenharmony_ci  // @ts-ignore
125fb726d48Sopenharmony_ci  let depth = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.depth);
126fb726d48Sopenharmony_ci  res.forEach((it, index) => {
127fb726d48Sopenharmony_ci    // @ts-ignore
128fb726d48Sopenharmony_ci    data.params.trafic === TraficEnum.ProtoBuffer && (it = it.logData);
129fb726d48Sopenharmony_ci    // @ts-ignore
130fb726d48Sopenharmony_ci    id[index] = it.id;
131fb726d48Sopenharmony_ci    // @ts-ignore
132fb726d48Sopenharmony_ci    startTs[index] = it.startTs;
133fb726d48Sopenharmony_ci    // @ts-ignore
134fb726d48Sopenharmony_ci    pid[index] = it.pid;
135fb726d48Sopenharmony_ci    // @ts-ignore
136fb726d48Sopenharmony_ci    tid[index] = it.tid;
137fb726d48Sopenharmony_ci    // @ts-ignore
138fb726d48Sopenharmony_ci    dur[index] = it.dur;
139fb726d48Sopenharmony_ci    // @ts-ignore
140fb726d48Sopenharmony_ci    depth[index] = it.depth;
141fb726d48Sopenharmony_ci  });
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            id: id.buffer,
152fb726d48Sopenharmony_ci            startTs: startTs.buffer,
153fb726d48Sopenharmony_ci            pid: pid.buffer,
154fb726d48Sopenharmony_ci            tid: tid.buffer,
155fb726d48Sopenharmony_ci            dur: dur.buffer,
156fb726d48Sopenharmony_ci            depth: depth.buffer,
157fb726d48Sopenharmony_ci          }
158fb726d48Sopenharmony_ci        : {},
159fb726d48Sopenharmony_ci      len: res.length,
160fb726d48Sopenharmony_ci      transfer: transfer,
161fb726d48Sopenharmony_ci    },
162fb726d48Sopenharmony_ci    transfer ? [id.buffer, startTs.buffer, pid.buffer, tid.buffer, dur.buffer, depth.buffer] : []
163fb726d48Sopenharmony_ci  );
164fb726d48Sopenharmony_ci}
165