• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 { clockList } from './utils/AllMemoryCache';
17import { Args } from './CommonArgs';
18
19export const chartClockDataSql = (args: Args): string => {
20  if (args.sqlType === 'clockFrequency') {
21    return `
22    with freq as (
23        select measure.filter_id,
24               measure.value,
25               measure.ts,
26               measure.type
27        from measure
28        where measure.filter_id in (select id
29                                    from clock_event_filter
30                                    where clock_event_filter.name = '${args.clockName}'
31                                      and clock_event_filter.type = 'clock_set_rate')
32                                      --and startNs >= ${Math.floor(args.startNS)}
33                                      --and startNs <= ${Math.floor(args.endNS)}
34    )
35    select freq.filter_id as filterId, freq.value, freq.ts - ${args.recordStartNS} as startNs, freq.type
36    from freq
37    order by startNs;
38    `;
39  } else if (args.sqlType === 'clockState') {
40    return `select measure.filter_id                                     as filterId,
41                   measure.value                                         as value,
42                   measure.ts - ${args.recordStartNS}                    as startNs,
43                   (lead(ts, 1, null) over ( order by measure.ts)) - ts as dur,
44                   measure.type                                          as type
45            from measure
46            where measure.filter_id in (select id
47                from clock_event_filter
48                where clock_event_filter.name = '${args.clockName}'
49                and clock_event_filter.type != 'clock_set_rate')
50            --and startNs + dur >= ${Math.floor(args.startNS)}
51            --and startNs <= ${Math.floor(args.endNS)}`;
52  } else if (args.sqlType === 'screenState') {
53    return `select filter_id as filterId,value,  m.ts - ${args.recordStartNS} as startNs, m.type
54            from measure m
55            where filter_id in (select id from process_measure_filter where name = 'ScreenState')
56            --and startNs >= ${Math.floor(args.startNS)}
57            --and startNs <= ${Math.floor(args.endNS)};`;
58  } else {
59    return '';
60  }
61};
62
63export const chartClockDataSqlMem = (args: Args): string => {
64  if (args.sqlType === 'clockFrequency') {
65    return `
66        with freq as (  select
67          m.filter_id,
68          m.ts,
69          m.type,
70          m.value from clock_event_filter as c
71          left join measure as m on c.id = m.filter_id
72          where c.name = '${args.clockName}'
73          and c.type = 'clock_set_rate'
74          order by m.ts)
75        select freq.filter_id as filterId,freq.ts - r.start_ts as startNs,freq.type,freq.value from freq,trace_range r order by startNs;
76    `;
77  } else if (args.sqlType === 'clockState') {
78    return `with state as (
79        select filter_id, ts, endts, endts-ts as dur, type, value from
80            (select measure.filter_id, measure.ts, lead(ts, 1, null) over( order by measure.ts) endts, measure.type, measure.value from clock_event_filter,trace_range
81                                                                                                                                                               left join measure
82             where clock_event_filter.name = '${args.clockName}' and clock_event_filter.type != 'clock_set_rate' and clock_event_filter.id = measure.filter_id
83             order by measure.ts))
84            select s.filter_id as filterId,s.ts-r.start_ts as startNs,s.type,s.value,s.dur from state s,trace_range r`;
85  } else if (args.sqlType === 'screenState') {
86    return `select m.type, m.ts-r.start_ts as startNs, value, filter_id  as filterId
87    from measure m,trace_range r
88    where filter_id in (select id from process_measure_filter where name = 'ScreenState')  order by startNs;`;
89  } else {
90    return '';
91  }
92};
93
94export function clockDataReceiver(data: unknown, proc: Function): void {
95  // @ts-ignore
96  if (data.params.trafic === TraficEnum.Memory) {
97    let res: unknown[];
98    let list: unknown[];
99    // @ts-ignore
100    if (!clockList.has(data.params.sqlType + data.params.clockName)) {
101      // @ts-ignore
102      let sql = chartClockDataSqlMem(data.params);
103      // @ts-ignore
104      list = proc(sql);
105      for (let j = 0; j < list.length; j++) {
106        if (j === list.length - 1) {
107          // @ts-ignore
108          list[j].dur = (data.params.totalNS || 0) - (list[j].startNs || 0);
109        } else {
110          // @ts-ignore
111          list[j].dur = (list[j + 1].startNs || 0) - (list[j].startNs || 0);
112        }
113      }
114      // @ts-ignore
115      clockList.set(data.params.sqlType + data.params.clockName, list);
116    } else {
117      // @ts-ignore
118      list = clockList.get(data.params.sqlType + data.params.clockName) || [];
119    }
120    // @ts-ignore
121    if (data.params.queryAll) {
122      //框选时候取数据,只需要根据时间过滤数据
123      res = (list || []).filter(
124        // @ts-ignore
125        (it) => it.startNs + it.dur >= data.params.selectStartNS && it.startNs <= data.params.selectEndNS
126      );
127    } else {
128      res = filterDataByGroup(
129        list || [],
130        'startNs',
131        'dur',
132        // @ts-ignore
133        data.params.startNS,
134        // @ts-ignore
135        data.params.endNS,
136        // @ts-ignore
137        data.params.width,
138        'value'
139      );
140    }
141    arrayBufferHandler(data, res, true);
142  } else {
143    // @ts-ignore
144    let sql = chartClockDataSql(data.params);
145    let res = proc(sql);
146    // @ts-ignore
147    arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
148  }
149}
150
151function arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void {
152  // @ts-ignore
153  let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur);
154  // @ts-ignore
155  let startNS = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startNS);
156  // @ts-ignore
157  let value = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.value);
158  // @ts-ignore
159  let filterId = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.filterId);
160  res.forEach((it, i) => {
161    // @ts-ignore
162    data.params.trafic === TraficEnum.ProtoBuffer && (it = it.clockData);
163    // @ts-ignore
164    dur[i] = it.dur;
165    // @ts-ignore
166    startNS[i] = it.startNs;
167    // @ts-ignore
168    filterId[i] = it.filterId;
169    // @ts-ignore
170    value[i] = it.value;
171  });
172
173  (self as unknown as Worker).postMessage(
174    {
175      // @ts-ignore
176      id: data.id,
177      // @ts-ignore
178      action: data.action,
179      results: transfer
180        ? {
181            dur: dur.buffer,
182            startNS: startNS.buffer,
183            value: value.buffer,
184            filterId: filterId.buffer,
185          }
186        : {},
187      len: res.length,
188      transfer: transfer,
189    },
190    transfer ? [dur.buffer, startNS.buffer, value.buffer, filterId.buffer] : []
191  );
192}
193