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