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