1fb726d48Sopenharmony_ci// Copyright (c) 2021 Huawei Device Co., Ltd.
2fb726d48Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
3fb726d48Sopenharmony_ci// you may not use this file except in compliance with the License.
4fb726d48Sopenharmony_ci// You may obtain a copy of the License at
5fb726d48Sopenharmony_ci//
6fb726d48Sopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
7fb726d48Sopenharmony_ci//
8fb726d48Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software
9fb726d48Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
10fb726d48Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11fb726d48Sopenharmony_ci// See the License for the specific language governing permissions and
12fb726d48Sopenharmony_ci// limitations under the License.
13fb726d48Sopenharmony_ci
14fb726d48Sopenharmony_ciimport { TraficEnum } from '../utils/QueryEnum';
15fb726d48Sopenharmony_ciimport { filterDataByGroup } from '../utils/DataFilter';
16fb726d48Sopenharmony_ciimport { cpuStateList } from '../utils/AllMemoryCache';
17fb726d48Sopenharmony_ciimport { Args } from '../CommonArgs';
18fb726d48Sopenharmony_ci
19fb726d48Sopenharmony_ciexport const chartCpuStateDataSql = (args: Args): string => {
20fb726d48Sopenharmony_ci  return `
21fb726d48Sopenharmony_ci      select  (value) as value,
22fb726d48Sopenharmony_ci              max(ifnull(dur, ${args.recordEndNS} - A.ts))                                                 as dur,
23fb726d48Sopenharmony_ci              (A.ts - ${args.recordStartNS})                                                               as startTs,
24fb726d48Sopenharmony_ci             ((A.ts - ${args.recordStartNS}) / (${Math.floor((args.endNS - args.startNS) / args.width)})) AS px
25fb726d48Sopenharmony_ci      from measure A
26fb726d48Sopenharmony_ci      where filter_id = ${args.filterId}
27fb726d48Sopenharmony_ci        and startTs + ifnull(dur, ${args.recordEndNS} - A.ts) >= ${Math.floor(args.startNS)}
28fb726d48Sopenharmony_ci        and startTs <= ${Math.floor(args.endNS)}
29fb726d48Sopenharmony_ci      group by px
30fb726d48Sopenharmony_ci      union
31fb726d48Sopenharmony_ci      select  max(value) as value,
32fb726d48Sopenharmony_ci              (ifnull(dur, ${args.recordEndNS} - A.ts))                                                 as dur,
33fb726d48Sopenharmony_ci              (A.ts - ${args.recordStartNS})                                                               as startTs,
34fb726d48Sopenharmony_ci             ((A.ts - ${args.recordStartNS}) / (${Math.floor((args.endNS - args.startNS) / args.width)})) AS px
35fb726d48Sopenharmony_ci      from measure A
36fb726d48Sopenharmony_ci      where filter_id = ${args.filterId}
37fb726d48Sopenharmony_ci        and startTs + ifnull(dur, ${args.recordEndNS} - A.ts) >= ${Math.floor(args.startNS)}
38fb726d48Sopenharmony_ci        and startTs <= ${Math.floor(args.endNS)}
39fb726d48Sopenharmony_ci      group by px
40fb726d48Sopenharmony_ci      ;`;
41fb726d48Sopenharmony_ci};
42fb726d48Sopenharmony_ci
43fb726d48Sopenharmony_ciexport const chartCpuStateDataSqlMem = (args: Args): string => {
44fb726d48Sopenharmony_ci  return `
45fb726d48Sopenharmony_ci   select (A.ts - ${args.recordStartNS}) as startTs,ifnull(dur,${args.recordEndNS} - A.ts) dur,
46fb726d48Sopenharmony_ci            value
47fb726d48Sopenharmony_ci        from measure A
48fb726d48Sopenharmony_ci        where filter_id = ${args.filterId};
49fb726d48Sopenharmony_ci      `;
50fb726d48Sopenharmony_ci};
51fb726d48Sopenharmony_ci
52fb726d48Sopenharmony_ciexport function cpuStateReceiver(data: unknown, proc: Function): void {
53fb726d48Sopenharmony_ci  // @ts-ignore
54fb726d48Sopenharmony_ci  if (data.params.trafic === TraficEnum.Memory) {
55fb726d48Sopenharmony_ci    let res: unknown[];
56fb726d48Sopenharmony_ci    let list: unknown[];
57fb726d48Sopenharmony_ci    // @ts-ignore
58fb726d48Sopenharmony_ci    if (!cpuStateList.has(data.params.filterId)) {
59fb726d48Sopenharmony_ci      // @ts-ignore
60fb726d48Sopenharmony_ci      list = proc(chartCpuStateDataSqlMem(data.params));
61fb726d48Sopenharmony_ci      for (let i = 0; i < list.length; i++) {
62fb726d48Sopenharmony_ci        // @ts-ignore
63fb726d48Sopenharmony_ci        if (list[i].dur === -1 || list[i].dur === null || list[i].dur === undefined) {
64fb726d48Sopenharmony_ci          // @ts-ignore
65fb726d48Sopenharmony_ci          list[i].dur = data.params.recordEndNS - data.params.recordStartNS - list[i].startTs;
66fb726d48Sopenharmony_ci        }
67fb726d48Sopenharmony_ci      }
68fb726d48Sopenharmony_ci      // @ts-ignore
69fb726d48Sopenharmony_ci      cpuStateList.set(data.params.filterId, list);
70fb726d48Sopenharmony_ci    } else {
71fb726d48Sopenharmony_ci      // @ts-ignore
72fb726d48Sopenharmony_ci      list = cpuStateList.get(data.params.filterId) || [];
73fb726d48Sopenharmony_ci    }
74fb726d48Sopenharmony_ci    res = filterDataByGroup(
75fb726d48Sopenharmony_ci      list || [],
76fb726d48Sopenharmony_ci      'startTs',
77fb726d48Sopenharmony_ci      'dur',
78fb726d48Sopenharmony_ci      // @ts-ignore
79fb726d48Sopenharmony_ci      data.params.startNS,
80fb726d48Sopenharmony_ci      // @ts-ignore
81fb726d48Sopenharmony_ci      data.params.endNS,
82fb726d48Sopenharmony_ci      // @ts-ignore
83fb726d48Sopenharmony_ci      data.params.width,
84fb726d48Sopenharmony_ci      'value'
85fb726d48Sopenharmony_ci    );
86fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, true);
87fb726d48Sopenharmony_ci  } else {
88fb726d48Sopenharmony_ci    // @ts-ignore
89fb726d48Sopenharmony_ci    let sql = chartCpuStateDataSql(data.params);
90fb726d48Sopenharmony_ci    let res = proc(sql);
91fb726d48Sopenharmony_ci    // @ts-ignore
92fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
93fb726d48Sopenharmony_ci  }
94fb726d48Sopenharmony_ci}
95fb726d48Sopenharmony_ci
96fb726d48Sopenharmony_cilet heights = [4, 8, 12, 16, 20, 24, 28, 32];
97fb726d48Sopenharmony_ci
98fb726d48Sopenharmony_cifunction arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void {
99fb726d48Sopenharmony_ci  // @ts-ignore
100fb726d48Sopenharmony_ci  let startTs = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startTs);
101fb726d48Sopenharmony_ci  // @ts-ignore
102fb726d48Sopenharmony_ci  let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur);
103fb726d48Sopenharmony_ci  // @ts-ignore
104fb726d48Sopenharmony_ci  let value = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.value);
105fb726d48Sopenharmony_ci  // @ts-ignore
106fb726d48Sopenharmony_ci  let height = new Uint8Array(transfer ? res.length : data.params.sharedArrayBuffers.height);
107fb726d48Sopenharmony_ci  res.forEach((it, i) => {
108fb726d48Sopenharmony_ci    // @ts-ignore
109fb726d48Sopenharmony_ci    data.params.trafic === TraficEnum.ProtoBuffer && (it = it.cpuStateData);
110fb726d48Sopenharmony_ci    // @ts-ignore
111fb726d48Sopenharmony_ci    startTs[i] = it.startTs;
112fb726d48Sopenharmony_ci    // @ts-ignore
113fb726d48Sopenharmony_ci    dur[i] = it.dur;
114fb726d48Sopenharmony_ci    // @ts-ignore
115fb726d48Sopenharmony_ci    value[i] = it.value;
116fb726d48Sopenharmony_ci    // @ts-ignore
117fb726d48Sopenharmony_ci    height[i] = heights[it.value];
118fb726d48Sopenharmony_ci  });
119fb726d48Sopenharmony_ci  (self as unknown as Worker).postMessage(
120fb726d48Sopenharmony_ci    {
121fb726d48Sopenharmony_ci      // @ts-ignore
122fb726d48Sopenharmony_ci      id: data.id,
123fb726d48Sopenharmony_ci      // @ts-ignore
124fb726d48Sopenharmony_ci      action: data.action,
125fb726d48Sopenharmony_ci      results: transfer
126fb726d48Sopenharmony_ci        ? {
127fb726d48Sopenharmony_ci            startTs: startTs.buffer,
128fb726d48Sopenharmony_ci            dur: dur.buffer,
129fb726d48Sopenharmony_ci            value: value.buffer,
130fb726d48Sopenharmony_ci          }
131fb726d48Sopenharmony_ci        : {},
132fb726d48Sopenharmony_ci      len: res.length,
133fb726d48Sopenharmony_ci      transfer: transfer,
134fb726d48Sopenharmony_ci    },
135fb726d48Sopenharmony_ci    transfer ? [startTs.buffer, dur.buffer, value.buffer] : []
136fb726d48Sopenharmony_ci  );
137fb726d48Sopenharmony_ci}
138