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 { xpowerList } from './utils/AllMemoryCache';
17fb726d48Sopenharmony_ciimport { Args } from './CommonArgs';
18fb726d48Sopenharmony_ci
19fb726d48Sopenharmony_ciexport const chartXpowerDataSql = (args: Args): string => {
20fb726d48Sopenharmony_ci  return `
21fb726d48Sopenharmony_ci    select
22fb726d48Sopenharmony_ci    xm.filter_id,
23fb726d48Sopenharmony_ci    mf.name,
24fb726d48Sopenharmony_ci    xm.ts - ${args.recordStartNS} as startNs,
25fb726d48Sopenharmony_ci    xm.dur,
26fb726d48Sopenharmony_ci    xm.value,
27fb726d48Sopenharmony_ci    xm.type
28fb726d48Sopenharmony_ci    from 
29fb726d48Sopenharmony_ci    xpower_measure xm
30fb726d48Sopenharmony_ci    left join
31fb726d48Sopenharmony_ci    measure_filter mf
32fb726d48Sopenharmony_ci    on
33fb726d48Sopenharmony_ci    mf.id = xm.filter_id
34fb726d48Sopenharmony_ci    left join 
35fb726d48Sopenharmony_ci    trace_range r
36fb726d48Sopenharmony_ci    where 
37fb726d48Sopenharmony_ci    name = '${args.xpowerName}'
38fb726d48Sopenharmony_ci    order by
39fb726d48Sopenharmony_ci    startNs
40fb726d48Sopenharmony_ci    `;
41fb726d48Sopenharmony_ci};
42fb726d48Sopenharmony_ci
43fb726d48Sopenharmony_ciexport function xpowerDataReceiver(data: unknown, proc: Function): void {
44fb726d48Sopenharmony_ci  // @ts-ignore
45fb726d48Sopenharmony_ci  if (data.params.trafic === TraficEnum.Memory) {
46fb726d48Sopenharmony_ci    let res: unknown[];
47fb726d48Sopenharmony_ci    let list: unknown[];
48fb726d48Sopenharmony_ci    // @ts-ignore
49fb726d48Sopenharmony_ci    if (!xpowerList.has(data.params.xpowerName)) {
50fb726d48Sopenharmony_ci      // @ts-ignore
51fb726d48Sopenharmony_ci      list = proc(chartXpowerDataSql(data.params));
52fb726d48Sopenharmony_ci      for (let j = 0; j < list.length; j++) {
53fb726d48Sopenharmony_ci        // @ts-ignore
54fb726d48Sopenharmony_ci        if (list[j].name === 'ThermalReport.ShellTemp') {
55fb726d48Sopenharmony_ci          // @ts-ignore
56fb726d48Sopenharmony_ci          list[j].value = list[j].value / 1000;
57fb726d48Sopenharmony_ci        }
58fb726d48Sopenharmony_ci        if (j === list.length - 1) {
59fb726d48Sopenharmony_ci          // @ts-ignore
60fb726d48Sopenharmony_ci          list[j].dur = (data.params.totalNS || 0) - (list[j].startNs || 0);
61fb726d48Sopenharmony_ci        } else {
62fb726d48Sopenharmony_ci          // @ts-ignore
63fb726d48Sopenharmony_ci          list[j].dur = (list[j + 1].startNs || 0) - (list[j].startNs || 0);
64fb726d48Sopenharmony_ci        }
65fb726d48Sopenharmony_ci      }
66fb726d48Sopenharmony_ci      // @ts-ignore
67fb726d48Sopenharmony_ci      xpowerList.set(data.params.xpowerName, list);
68fb726d48Sopenharmony_ci    } else {
69fb726d48Sopenharmony_ci      // @ts-ignore
70fb726d48Sopenharmony_ci      list = xpowerList.get(data.params.xpowerName) || [];
71fb726d48Sopenharmony_ci    }
72fb726d48Sopenharmony_ci    // @ts-ignore
73fb726d48Sopenharmony_ci    if (data.params.queryAll) {
74fb726d48Sopenharmony_ci      //框选时候取数据,只需要根据时间过滤数据
75fb726d48Sopenharmony_ci      res = (list || []).filter(
76fb726d48Sopenharmony_ci        // @ts-ignore
77fb726d48Sopenharmony_ci        (it) => it.startNs + it.dur >= data.params.selectStartNS && it.startNs <= data.params.selectEndNS
78fb726d48Sopenharmony_ci      );
79fb726d48Sopenharmony_ci    } else {
80fb726d48Sopenharmony_ci      res = filterDataByGroup(
81fb726d48Sopenharmony_ci        list || [],
82fb726d48Sopenharmony_ci        'startNs',
83fb726d48Sopenharmony_ci        'dur',
84fb726d48Sopenharmony_ci        // @ts-ignore
85fb726d48Sopenharmony_ci        data.params.startNS,
86fb726d48Sopenharmony_ci        // @ts-ignore
87fb726d48Sopenharmony_ci        data.params.endNS,
88fb726d48Sopenharmony_ci        // @ts-ignore
89fb726d48Sopenharmony_ci        data.params.width,
90fb726d48Sopenharmony_ci        'value'
91fb726d48Sopenharmony_ci      );
92fb726d48Sopenharmony_ci    }
93fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, true);
94fb726d48Sopenharmony_ci  } else {
95fb726d48Sopenharmony_ci    // @ts-ignore
96fb726d48Sopenharmony_ci    let sql = chartXpowerDataSql(data.params);
97fb726d48Sopenharmony_ci    let res = proc(sql);
98fb726d48Sopenharmony_ci    // @ts-ignore
99fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
100fb726d48Sopenharmony_ci  }
101fb726d48Sopenharmony_ci}
102fb726d48Sopenharmony_ci
103fb726d48Sopenharmony_cifunction arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void {
104fb726d48Sopenharmony_ci  // @ts-ignore
105fb726d48Sopenharmony_ci  let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur);
106fb726d48Sopenharmony_ci  // @ts-ignore
107fb726d48Sopenharmony_ci  let startNS = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startNS);
108fb726d48Sopenharmony_ci  // @ts-ignore
109fb726d48Sopenharmony_ci  let value = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.value);
110fb726d48Sopenharmony_ci  // @ts-ignore
111fb726d48Sopenharmony_ci  let filterId = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.filterId);
112fb726d48Sopenharmony_ci  res.forEach((it, i) => {
113fb726d48Sopenharmony_ci    // @ts-ignore
114fb726d48Sopenharmony_ci    data.params.trafic === TraficEnum.ProtoBuffer && (it = it.xpowerData);
115fb726d48Sopenharmony_ci    // @ts-ignore
116fb726d48Sopenharmony_ci    dur[i] = it.dur;
117fb726d48Sopenharmony_ci    // @ts-ignore
118fb726d48Sopenharmony_ci    startNS[i] = it.startNs;
119fb726d48Sopenharmony_ci    // @ts-ignore
120fb726d48Sopenharmony_ci    filterId[i] = it.filterId;
121fb726d48Sopenharmony_ci    // @ts-ignore
122fb726d48Sopenharmony_ci    value[i] = it.value;
123fb726d48Sopenharmony_ci  });
124fb726d48Sopenharmony_ci
125fb726d48Sopenharmony_ci  (self as unknown as Worker).postMessage(
126fb726d48Sopenharmony_ci    {
127fb726d48Sopenharmony_ci      // @ts-ignore
128fb726d48Sopenharmony_ci      id: data.id,
129fb726d48Sopenharmony_ci      // @ts-ignore
130fb726d48Sopenharmony_ci      action: data.action,
131fb726d48Sopenharmony_ci      results: transfer
132fb726d48Sopenharmony_ci        ? {
133fb726d48Sopenharmony_ci          dur: dur.buffer,
134fb726d48Sopenharmony_ci          startNS: startNS.buffer,
135fb726d48Sopenharmony_ci          value: value.buffer,
136fb726d48Sopenharmony_ci          filterId: filterId.buffer,
137fb726d48Sopenharmony_ci        }
138fb726d48Sopenharmony_ci        : {},
139fb726d48Sopenharmony_ci      len: res.length,
140fb726d48Sopenharmony_ci      transfer: transfer,
141fb726d48Sopenharmony_ci    },
142fb726d48Sopenharmony_ci    transfer ? [dur.buffer, startNS.buffer, value.buffer, filterId.buffer] : []
143fb726d48Sopenharmony_ci  );
144fb726d48Sopenharmony_ci}
145