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 */
15//  VM Tracker Gpu Resourcet泳道图
16import type { SnapshotStruct } from '../ui-worker/ProcedureWorkerSnapshot';
17import { query } from '../SqlLite';
18
19export const queryGpuResourceData = (categoryNameId: number): Promise<Array<SnapshotStruct>> =>
20  query(
21    'queryGpuResourceData',
22    `SELECT
23    subquery1.startNs,
24    IFNULL(subquery1.totalSize, 0) as aSize, 
25    IFNULL(subquery2.size, 0) as bSize,
26    (IFNULL(subquery1.totalSize, 0) - IFNULL(subquery2.size, 0)) AS value
27  FROM
28    (SELECT (ts - start_ts) AS startNs,SUM(total_size) AS totalSize
29     FROM memory_profile, trace_range
30     WHERE ts between start_ts and end_ts
31     GROUP BY ts) AS subquery1
32   LEFT JOIN
33    (SELECT (ts - start_ts) AS startNs, SUM(size) AS size
34     FROM memory_window_gpu, trace_range
35     WHERE ts between start_ts and end_ts
36    AND category_name_id = ${categoryNameId}
37     GROUP BY ts) AS subquery2
38  ON subquery1.startNs = subquery2.startNs`
39  );
40export const queryisExistsGpuResourceData = (categoryNameId: number): Promise<Array<SnapshotStruct>> =>
41  query(
42    'queryisExistsGpuResourceData',
43    `SELECT EXISTS (
44      SELECT 1
45    FROM
46      (SELECT (ts - start_ts) AS startNs
47      FROM memory_profile, trace_range
48      WHERE ts between start_ts and end_ts
49      GROUP BY ts) AS subquery1
50    LEFT JOIN
51      (SELECT (ts - start_ts) AS startNs
52      FROM memory_window_gpu, trace_range
53      WHERE ts between start_ts and end_ts
54      AND category_name_id = ${categoryNameId}
55      GROUP BY ts) AS subquery2
56    ON subquery1.startNs = subquery2.startNs
57    ) AS data_exists
58    `
59  );
60
61//  VM Tracker Gpu Resource Tab页
62export const queryGpuResourceTabData = (
63  startNs: number
64): Promise<Array<{ startNs: number; channelId: number; totalSize: number }>> =>
65  query(
66    'queryGpuResourceTabData',
67    `SELECT (ts - start_ts) as startNs, channel_id as channelId, sum(total_size) as totalSize 
68    FROM memory_profile, trace_range
69    WHERE (ts - start_ts) = ${startNs}
70    GROUP by ts, channelId`
71  );
72
73export const queryGpuTotalType = (): Promise<Array<{ id: number; data: string }>> =>
74  query(
75    'queryGpuTotalType',
76    `
77    select distinct module_name_id id,data
78    from memory_window_gpu A, trace_range TR left join data_dict B on A.module_name_id = B.id
79    where window_name_id = 0
80    and A.ts < TR.end_ts
81  `
82  );
83
84export const queryGpuDataByTs = (
85  ts: number,
86  window: number,
87  module: number | null
88): Promise<
89  Array<{
90    windowNameId: number;
91    windowId: number;
92    moduleId: number;
93    categoryId: number;
94    size: number;
95  }>
96> => {
97  let condition =
98    module === null
99      ? `and window_name_id = ${window}`
100      : `and window_name_id = ${window} and module_name_id = ${module}`;
101  let sql = `select window_name_id as windowNameId,
102       window_id as windowId,
103       module_name_id as moduleId,
104       category_name_id as categoryId,
105       size
106       from memory_window_gpu, trace_range
107       where ts - start_ts = ${ts} ${condition}
108        `;
109  return query('queryGpuDataByTs', sql);
110};
111
112export const queryGpuTotalData = (moduleId: number | null): Promise<Array<{ startNs: number; value: number }>> => {
113  let moduleCondition = moduleId === null ? '' : `and module_name_id = ${moduleId}`;
114  let sql = `
115  select (ts - start_ts) startNs, sum(size) value
116    from memory_window_gpu,trace_range
117    where window_name_id = 0 ${moduleCondition}
118    and ts< end_ts
119    group by ts;
120  `;
121  return query('queryGpuTotalData', sql);
122};
123
124// GL 或 Graph 泳道图
125export const queryGpuData = (ipid: number, name: string): Promise<Array<{ startNs: number; value: number }>> => {
126  let sql = `
127    select (ts - start_ts) startNs,sum(value) value
128  from process_measure, trace_range
129  where filter_id = (
130      select id
131      from process_measure_filter
132      where name = ${name} and ipid = ${ipid}
133      )
134  and ts between start_ts and end_ts
135  group by ts;
136    `;
137  return query('queryGpuData', sql);
138};
139// 判断VM Tracker Gl或 Graph泳道图是否有数据
140export const queryisExistsGpuData = (
141  ipid: number,
142  name: string
143): Promise<Array<{ startNs: number; value: number }>> => {
144  let sql = `
145   SELECT EXISTS (
146      SELECT 1
147      FROM process_measure, trace_range
148      WHERE filter_id = (
149         SELECT id
150         FROM process_measure_filter
151         WHERE name = ${name} AND ipid = ${ipid}
152         )
153         AND ts BETWEEN start_ts AND end_ts
154   ) AS data_exists;
155     `;
156  return query('queryGpuData', sql);
157};
158
159// GL 或 Graph 框选Tab页
160export const queryGpuDataTab = (
161  ipid: number,
162  leftNs: number,
163  rightNs: number,
164  interval: number,
165  name: string
166): Promise<Array<{ startTs: number; size: number }>> => {
167  let sql = `
168    select (ts - start_ts) startTs,sum(value) * 1024 size
169  from process_measure, trace_range
170  where filter_id = (
171      select id
172      from process_measure_filter
173      where name = ${name} and ipid = ${ipid}
174      )
175  and not ((startTs + ${interval} < ${leftNs}) or (startTs > ${rightNs}))
176  group by ts;
177    `;
178  return query('queryGpuGLDataByRange', sql);
179};
180
181export const queryGpuDataByRange = (
182  leftNs: number,
183  rightNs: number,
184  interval: number
185): Promise<
186  Array<{
187    startTs: number;
188    windowId: number;
189    moduleId: number;
190    categoryId: number;
191    avgSize: number;
192    maxSize: number;
193    minSize: number;
194  }>
195> => {
196  let sql = `select (ts - start_ts) startTs,
197    window_name_id windowId,
198    module_name_id moduleId,
199    category_name_id categoryId,
200    avg(size) avgSize,
201    max(size) maxSize,
202    min(size) minSize
203  from memory_window_gpu,trace_range
204  where not ((startTs + ${interval} < ${leftNs}) or (startTs > ${rightNs}))
205  group by window_name_id,module_name_id,category_name_id
206  order by avgSize DESC;
207  `;
208  return query('queryGpuWindowData', sql);
209};
210
211export const queryGpuWindowData = (
212  windowId: number,
213  moduleId: number | null
214): Promise<Array<{ startNs: number; value: number }>> => {
215  let moduleCondition = moduleId === null ? '' : `and module_name_id = ${moduleId}`;
216  let sql = `
217  select (ts - start_ts) startNs, sum(size) value
218    from memory_window_gpu,trace_range
219    where window_name_id = ${windowId} ${moduleCondition}
220    and ts < end_ts
221    group by ts;
222  `;
223  return query('queryGpuWindowData', sql);
224};
225
226export const queryGpuWindowType = (): Promise<Array<{ id: number; data: string; pid: number }>> =>
227  query(
228    'queryGpuWindowType',
229    `
230  select distinct A.window_name_id as id,B.data, null as pid
231from memory_window_gpu A, trace_range tr left join data_dict B on A.window_name_id = B.id
232where window_name_id != 0
233and A.ts < tr.end_ts
234union all
235select distinct A.module_name_id id, B.data, A.window_name_id pid
236from memory_window_gpu A, trace_range TR left join data_dict B on A.module_name_id = B.id
237where window_name_id != 0
238and A.ts < TR.end_ts
239  `
240  );
241export const queryGpuDur = (
242  id: number
243): //@ts-ignore
244Promise<unknown[]> =>
245  query(
246    'queryGpuDur',
247    `
248        SELECT dur AS gpu_dur
249        FROM gpu_slice
250        WHERE frame_row = $id;`,
251    { $id: id }
252  );
253