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