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 { Args } from './CommonArgs';
15fb726d48Sopenharmony_ciimport { TraficEnum } from './utils/QueryEnum';
16fb726d48Sopenharmony_ci
17fb726d48Sopenharmony_ciexport const fileSystemDataGroupBy10MSProtoSql = (args: Args): string => {
18fb726d48Sopenharmony_ci  return `SELECT
19fb726d48Sopenharmony_ci        startNs, endNs, max( count ) AS size,
20fb726d48Sopenharmony_ci        ( startNS / ( ( ${args.endNS} - ${args.startNS} ) / ${args.width} ) ) AS px
21fb726d48Sopenharmony_ci        FROM
22fb726d48Sopenharmony_ci        (
23fb726d48Sopenharmony_ci        SELECT
24fb726d48Sopenharmony_ci            ( A.start_ts - ${args.recordStartNS} ) / 10000000 * 10000000 AS startNs,
25fb726d48Sopenharmony_ci            ( A.start_ts - ${args.recordStartNS} + 10000000 ) / 10000000 * 10000000 AS endNs,
26fb726d48Sopenharmony_ci            count( dur ) AS count
27fb726d48Sopenharmony_ci        FROM
28fb726d48Sopenharmony_ci            file_system_sample A
29fb726d48Sopenharmony_ci        WHERE
30fb726d48Sopenharmony_ci            type = ${args.type}
31fb726d48Sopenharmony_ci            and startNs > ${Math.floor(args.startNS)}
32fb726d48Sopenharmony_ci            AND startNs + dur >= ${Math.floor(args.startNS)}
33fb726d48Sopenharmony_ci            AND startNs < ${Math.floor(args.endNS)}
34fb726d48Sopenharmony_ci        GROUP BY
35fb726d48Sopenharmony_ci        startNs
36fb726d48Sopenharmony_ci        )
37fb726d48Sopenharmony_ci        GROUP BY px
38fb726d48Sopenharmony_ci            `;
39fb726d48Sopenharmony_ci};
40fb726d48Sopenharmony_ciexport const fileSystemDataProtoSql = (args: Args): string => {
41fb726d48Sopenharmony_ci  return `select
42fb726d48Sopenharmony_ci          (A.start_ts - ${args.recordStartNS}) as startNs,
43fb726d48Sopenharmony_ci          (A.end_ts - ${args.recordStartNS}) as endNs,
44fb726d48Sopenharmony_ci          dur
45fb726d48Sopenharmony_ci          from file_system_sample A
46fb726d48Sopenharmony_ci          where type = ${args.type}
47fb726d48Sopenharmony_ci          and startNs > 0
48fb726d48Sopenharmony_ci          and startNs + dur > ${args.startNS}
49fb726d48Sopenharmony_ci          and startNs < ${args.endNS}
50fb726d48Sopenharmony_ci    `;
51fb726d48Sopenharmony_ci};
52fb726d48Sopenharmony_ciexport const diskIoDataGroupBy10MSProtoSql = (args: Args): string => {
53fb726d48Sopenharmony_ci  return `SELECT
54fb726d48Sopenharmony_ci        startNs,
55fb726d48Sopenharmony_ci        endNs,
56fb726d48Sopenharmony_ci        max( dur ) AS size,
57fb726d48Sopenharmony_ci        ( startNS / ( ( ${args.endNS} - ${args.startNS} ) / ${args.width} ) ) AS px
58fb726d48Sopenharmony_ci        FROM
59fb726d48Sopenharmony_ci        (
60fb726d48Sopenharmony_ci        SELECT
61fb726d48Sopenharmony_ci            ( A.start_ts - ${args.recordStartNS} ) / 10000000 * 10000000 AS startNs,
62fb726d48Sopenharmony_ci            ( A.start_ts - ${args.recordStartNS} + 10000000 ) / 10000000 * 10000000 AS endNs,
63fb726d48Sopenharmony_ci            max( latency_dur ) AS dur
64fb726d48Sopenharmony_ci        FROM bio_latency_sample A
65fb726d48Sopenharmony_ci            where type in (${args.typeArr.join(',')}) and startNs > 0
66fb726d48Sopenharmony_ci            ${args.all ? '' : 'and ipid = ' + args.ipid}
67fb726d48Sopenharmony_ci            and startNs + latency_dur > ${args.startNS}
68fb726d48Sopenharmony_ci            and startNs < ${args.endNS}
69fb726d48Sopenharmony_ci            GROUP BY startNs
70fb726d48Sopenharmony_ci            order by startNs
71fb726d48Sopenharmony_ci        )
72fb726d48Sopenharmony_ci        GROUP BY px`;
73fb726d48Sopenharmony_ci};
74fb726d48Sopenharmony_ciexport const diskIoDataProtoSql = (args: Args): string => {
75fb726d48Sopenharmony_ci  return `select
76fb726d48Sopenharmony_ci        (A.start_ts - ${args.recordStartNS}) as startNs,
77fb726d48Sopenharmony_ci        (A.start_ts - ${args.recordStartNS} + A.latency_dur) as endNs,
78fb726d48Sopenharmony_ci        latency_dur as dur
79fb726d48Sopenharmony_ci        from bio_latency_sample A
80fb726d48Sopenharmony_ci        where type in (${args.typeArr.join(',')}) and startNs > 0
81fb726d48Sopenharmony_ci        ${args.all ? '' : 'and ipid = ' + args.ipid}
82fb726d48Sopenharmony_ci        and startNs + dur > ${args.startNS}
83fb726d48Sopenharmony_ci        and startNs < ${args.endNS}
84fb726d48Sopenharmony_ci        order by A.start_ts;`;
85fb726d48Sopenharmony_ci};
86fb726d48Sopenharmony_ciexport const eBPFVmDataGroupBy10MSProtoSql = (args: unknown): string => {
87fb726d48Sopenharmony_ci  return `SELECT startNs, endNs, max( count ) AS size,
88fb726d48Sopenharmony_ci        ( startNS / ( ( ${
89fb726d48Sopenharmony_ci          // @ts-ignore
90fb726d48Sopenharmony_ci          args.endNS
91fb726d48Sopenharmony_ci        } - ${
92fb726d48Sopenharmony_ci    // @ts-ignore
93fb726d48Sopenharmony_ci    args.startNS
94fb726d48Sopenharmony_ci  } ) / ${
95fb726d48Sopenharmony_ci    // @ts-ignore
96fb726d48Sopenharmony_ci    args.width
97fb726d48Sopenharmony_ci  } ) ) AS px
98fb726d48Sopenharmony_ci        FROM
99fb726d48Sopenharmony_ci        (
100fb726d48Sopenharmony_ci        SELECT
101fb726d48Sopenharmony_ci            ( A.start_ts - ${
102fb726d48Sopenharmony_ci              // @ts-ignore
103fb726d48Sopenharmony_ci              args.recordStartNS
104fb726d48Sopenharmony_ci            } ) / 10000000 * 10000000 AS startNs,
105fb726d48Sopenharmony_ci            ( A.start_ts - ${
106fb726d48Sopenharmony_ci              // @ts-ignore
107fb726d48Sopenharmony_ci              args.recordStartNS
108fb726d48Sopenharmony_ci            } + 10000000 ) / 10000000 * 10000000 AS endNs,
109fb726d48Sopenharmony_ci            count( dur ) AS count
110fb726d48Sopenharmony_ci        FROM
111fb726d48Sopenharmony_ci        paged_memory_sample A
112fb726d48Sopenharmony_ci        where startNs + dur > ${
113fb726d48Sopenharmony_ci          // @ts-ignore
114fb726d48Sopenharmony_ci          args.startNS
115fb726d48Sopenharmony_ci        }
116fb726d48Sopenharmony_ci        and startNs > 0
117fb726d48Sopenharmony_ci        and startNs < ${
118fb726d48Sopenharmony_ci          // @ts-ignore
119fb726d48Sopenharmony_ci          args.endNS
120fb726d48Sopenharmony_ci        }
121fb726d48Sopenharmony_ci        and endNs > ${
122fb726d48Sopenharmony_ci          // @ts-ignore
123fb726d48Sopenharmony_ci          args.startNS
124fb726d48Sopenharmony_ci        }
125fb726d48Sopenharmony_ci        GROUP BY startNs
126fb726d48Sopenharmony_ci        order by startNs
127fb726d48Sopenharmony_ci        )
128fb726d48Sopenharmony_ci        GROUP BY px`;
129fb726d48Sopenharmony_ci};
130fb726d48Sopenharmony_ciexport const eBPFVmDataProtoSql = (args: unknown): string => {
131fb726d48Sopenharmony_ci  return `select
132fb726d48Sopenharmony_ci        (A.start_ts - ${
133fb726d48Sopenharmony_ci          // @ts-ignore
134fb726d48Sopenharmony_ci          args.recordStartNS
135fb726d48Sopenharmony_ci        }) as startNs,
136fb726d48Sopenharmony_ci        (A.end_ts - ${
137fb726d48Sopenharmony_ci          // @ts-ignore
138fb726d48Sopenharmony_ci          args.recordStartNS
139fb726d48Sopenharmony_ci        }) as endNs,
140fb726d48Sopenharmony_ci        dur as dur
141fb726d48Sopenharmony_ci        from paged_memory_sample A
142fb726d48Sopenharmony_ci        where startNs + dur > ${
143fb726d48Sopenharmony_ci          // @ts-ignore
144fb726d48Sopenharmony_ci          args.startNS
145fb726d48Sopenharmony_ci        }
146fb726d48Sopenharmony_ci        and startNs > 0
147fb726d48Sopenharmony_ci        and startNs < ${
148fb726d48Sopenharmony_ci          // @ts-ignore
149fb726d48Sopenharmony_ci          args.endNS
150fb726d48Sopenharmony_ci        }
151fb726d48Sopenharmony_ci        and endNs > ${
152fb726d48Sopenharmony_ci          // @ts-ignore
153fb726d48Sopenharmony_ci          args.startNS
154fb726d48Sopenharmony_ci        }
155fb726d48Sopenharmony_ci        order by A.start_ts;`;
156fb726d48Sopenharmony_ci};
157fb726d48Sopenharmony_ci
158fb726d48Sopenharmony_ci/**
159fb726d48Sopenharmony_ci * @param data
160fb726d48Sopenharmony_ci * @param proc
161fb726d48Sopenharmony_ci */
162fb726d48Sopenharmony_ciexport function fileSystemDataReceiver(data: unknown, proc: Function): void {
163fb726d48Sopenharmony_ci  let sql: string;
164fb726d48Sopenharmony_ci  // @ts-ignore
165fb726d48Sopenharmony_ci  if (data.params.scale > 40_000_000) {
166fb726d48Sopenharmony_ci    // @ts-ignore
167fb726d48Sopenharmony_ci    sql = fileSystemDataGroupBy10MSProtoSql(data.params);
168fb726d48Sopenharmony_ci  } else {
169fb726d48Sopenharmony_ci    // @ts-ignore
170fb726d48Sopenharmony_ci    sql = fileSystemDataProtoSql(data.params);
171fb726d48Sopenharmony_ci  }
172fb726d48Sopenharmony_ci  let res = proc(sql);
173fb726d48Sopenharmony_ci  // @ts-ignore
174fb726d48Sopenharmony_ci  arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
175fb726d48Sopenharmony_ci}
176fb726d48Sopenharmony_ciexport function diskIoReceiver(data: unknown, proc: Function): void {
177fb726d48Sopenharmony_ci  let sql: string;
178fb726d48Sopenharmony_ci  // @ts-ignore
179fb726d48Sopenharmony_ci  if (data.params.scale > 40_000_000) {
180fb726d48Sopenharmony_ci    // @ts-ignore
181fb726d48Sopenharmony_ci    sql = diskIoDataGroupBy10MSProtoSql(data.params);
182fb726d48Sopenharmony_ci  } else {
183fb726d48Sopenharmony_ci    // @ts-ignore
184fb726d48Sopenharmony_ci    sql = diskIoDataProtoSql(data.params);
185fb726d48Sopenharmony_ci  }
186fb726d48Sopenharmony_ci  let res = proc(sql);
187fb726d48Sopenharmony_ci  // @ts-ignore
188fb726d48Sopenharmony_ci  arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
189fb726d48Sopenharmony_ci}
190fb726d48Sopenharmony_ciexport function eBPFVmReceiver(data: unknown, proc: Function): void {
191fb726d48Sopenharmony_ci  let sql: string;
192fb726d48Sopenharmony_ci  // @ts-ignore
193fb726d48Sopenharmony_ci  if (data.params.scale > 40_000_000) {
194fb726d48Sopenharmony_ci    // @ts-ignore
195fb726d48Sopenharmony_ci    sql = eBPFVmDataGroupBy10MSProtoSql(data.params);
196fb726d48Sopenharmony_ci  } else {
197fb726d48Sopenharmony_ci    // @ts-ignore
198fb726d48Sopenharmony_ci    sql = eBPFVmDataProtoSql(data.params);
199fb726d48Sopenharmony_ci  }
200fb726d48Sopenharmony_ci  let res = proc(sql);
201fb726d48Sopenharmony_ci  // @ts-ignore
202fb726d48Sopenharmony_ci  arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
203fb726d48Sopenharmony_ci}
204fb726d48Sopenharmony_ci
205fb726d48Sopenharmony_cifunction arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void {
206fb726d48Sopenharmony_ci  // @ts-ignore
207fb726d48Sopenharmony_ci  let startNS = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startNS);
208fb726d48Sopenharmony_ci  // @ts-ignore
209fb726d48Sopenharmony_ci  let endNS = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.endNS);
210fb726d48Sopenharmony_ci  // @ts-ignore
211fb726d48Sopenharmony_ci  let size = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.size);
212fb726d48Sopenharmony_ci  // @ts-ignore
213fb726d48Sopenharmony_ci  let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur);
214fb726d48Sopenharmony_ci  // @ts-ignore
215fb726d48Sopenharmony_ci  let height = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.height);
216fb726d48Sopenharmony_ci  // @ts-ignore
217fb726d48Sopenharmony_ci  let maxSize = Math.max(...res.map((it) => it.size));
218fb726d48Sopenharmony_ci  res.forEach((it, i) => {
219fb726d48Sopenharmony_ci    // @ts-ignore
220fb726d48Sopenharmony_ci    startNS[i] = it.startNs;
221fb726d48Sopenharmony_ci    // @ts-ignore
222fb726d48Sopenharmony_ci    endNS[i] = it.endNs;
223fb726d48Sopenharmony_ci    // @ts-ignore
224fb726d48Sopenharmony_ci    size[i] = it.size;
225fb726d48Sopenharmony_ci    // @ts-ignore
226fb726d48Sopenharmony_ci    dur[i] = it.dur;
227fb726d48Sopenharmony_ci    // @ts-ignore
228fb726d48Sopenharmony_ci    height[i] = Math.ceil((it.size / maxSize) * 36);
229fb726d48Sopenharmony_ci  });
230fb726d48Sopenharmony_ci  (self as unknown as Worker).postMessage(
231fb726d48Sopenharmony_ci    {
232fb726d48Sopenharmony_ci      // @ts-ignore
233fb726d48Sopenharmony_ci      id: data.id,
234fb726d48Sopenharmony_ci      // @ts-ignore
235fb726d48Sopenharmony_ci      action: data.action,
236fb726d48Sopenharmony_ci      results: transfer
237fb726d48Sopenharmony_ci        ? {
238fb726d48Sopenharmony_ci            startNS: startNS.buffer,
239fb726d48Sopenharmony_ci            endNS: endNS.buffer,
240fb726d48Sopenharmony_ci            size: size.buffer,
241fb726d48Sopenharmony_ci            height: height.buffer,
242fb726d48Sopenharmony_ci            dur: dur.buffer,
243fb726d48Sopenharmony_ci          }
244fb726d48Sopenharmony_ci        : {},
245fb726d48Sopenharmony_ci      len: res.length,
246fb726d48Sopenharmony_ci      transfer: transfer,
247fb726d48Sopenharmony_ci    },
248fb726d48Sopenharmony_ci    transfer ? [startNS.buffer, endNS.buffer, size.buffer, height.buffer, dur.buffer] : []
249fb726d48Sopenharmony_ci  );
250fb726d48Sopenharmony_ci}
251