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 16import { BaseElement, element } from '../../../../../base-ui/BaseElement.js'; 17import { LitSelect } from '../../../../../base-ui/select/LitSelect.js'; 18import { LitSelectOption } from '../../../../../base-ui/select/LitSelectOption.js'; 19import { LitTable } from '../../../../../base-ui/table/lit-table.js'; 20import { DmaComparison } from '../../../../bean/AbilityMonitor.js'; 21import { getTabDmaAbilityComparisonData } from '../../../../database/SqlLite.js'; 22import { SnapshotStruct } from '../../../../database/ui-worker/ProcedureWorkerSnapshot.js'; 23import { Utils } from '../../base/Utils.js'; 24import { compare, resizeObserverFromMemory } from '../SheetUtils.js'; 25import '../TabPaneJsMemoryFilter.js'; 26import { TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter.js'; 27 28@element('tabpane-dma-ability-comparison') 29export class TabPaneDmaAbilityComparison extends BaseElement { 30 private damClickTable: LitTable | null | undefined; 31 private comparisonSelect: TabPaneJsMemoryFilter | null | undefined; 32 private selectEl: LitSelect | null | undefined; 33 private selfData: Array<DmaComparison> = []; 34 private comparisonSource: Array<DmaComparison> = []; 35 36 initElements(): void { 37 this.comparisonSelect = this.shadowRoot?.querySelector('#filter') as TabPaneJsMemoryFilter; 38 this.damClickTable = this.shadowRoot?.querySelector<LitTable>('#damClickTable'); 39 this.selectEl = this.comparisonSelect?.shadowRoot?.querySelector<LitSelect>('lit-select'); 40 this.damClickTable!.addEventListener('column-click', (e) => { 41 // @ts-ignore 42 this.sortDmaByColumn(e.detail.key, e.detail.sort); 43 }); 44 } 45 46 connectedCallback(): void { 47 super.connectedCallback(); 48 resizeObserverFromMemory(this.parentElement!, this.damClickTable!, this.comparisonSelect!); 49 } 50 51 async queryDataByDB(startNs: number): Promise<DmaComparison[]> { 52 let timeStampData: Array<DmaComparison> = []; 53 await getTabDmaAbilityComparisonData(startNs).then((data) => { 54 data.forEach((item) => { 55 if (item.processName !== null) { 56 item.process = `${item.processName}(${item.processId})`; 57 } else { 58 item.process = `Process(${item.processId})`; 59 } 60 }); 61 timeStampData = data; 62 }); 63 return timeStampData; 64 } 65 66 async comparisonDataByDB(startNs: number, dataList: Array<SnapshotStruct>): Promise<void> { 67 this.selfData = []; 68 const selfData = await this.queryDataByDB(startNs); 69 const dataArray = []; 70 for (const item of selfData) { 71 this.selfData.push(new DmaComparison(item.process, item.value)); 72 } 73 for (let item of dataList) { 74 if (item.startNs !== startNs) { 75 dataArray.push(item); 76 } 77 } 78 this.selectStamps(dataArray); 79 this.getComparisonData(dataArray[0].startNs); 80 } 81 82 selectStamps(dmaAbilityComList: Array<SnapshotStruct>): void { 83 let input = this.selectEl!.shadowRoot?.querySelector('input') as HTMLInputElement; 84 this.selectEl!.innerHTML = ''; 85 let option = new LitSelectOption(); 86 option.innerHTML = 'File Name'; 87 option.setAttribute('disabled', 'disabled'); 88 this.selectEl?.appendChild(option); 89 if (dmaAbilityComList[0].name) { 90 option.setAttribute('value', dmaAbilityComList[0].name); 91 } 92 this.selectEl!.defaultValue = dmaAbilityComList[0].name || ''; 93 this.selectEl!.placeholder = dmaAbilityComList[0].name || ''; 94 this.selectEl!.dataSource = dmaAbilityComList; 95 this.selectEl!.querySelectorAll('lit-select-option').forEach((option) => { 96 option.addEventListener('onSelected', (e) => { 97 for (let f of dmaAbilityComList) { 98 if (input.value === f.name) { 99 this.getComparisonData(f.startNs); 100 } 101 } 102 e.stopPropagation(); 103 }); 104 }); 105 } 106 107 async getComparisonData(targetStartNs: number) { 108 let comparisonData: DmaComparison[] = []; 109 let comparison: DmaComparison[] = []; 110 const data = await this.queryDataByDB(targetStartNs); 111 for (const item of data) { 112 comparison.push(new DmaComparison(item.process, item.value)); 113 } 114 comparisonData = compare(this.selfData, comparison); 115 for (const item of comparisonData) { 116 item.sizes = Utils.getBinaryByteWithUnit(item.value); 117 } 118 this.comparisonSource = comparisonData; 119 this.damClickTable!.recycleDataSource = comparisonData; 120 } 121 122 sortDmaByColumn(column: string, sort: number): void { 123 switch (sort) { 124 case 0: 125 this.damClickTable!.recycleDataSource = this.comparisonSource; 126 break; 127 default: 128 let array = [...this.comparisonSource]; 129 switch (column) { 130 case 'process': 131 this.damClickTable!.recycleDataSource = array.sort((dmaComparisonLeftData, dmaComparisonRightData) => { 132 return sort === 1 133 ? `${dmaComparisonLeftData.process}`.localeCompare(`${dmaComparisonRightData.process}`) 134 : `${dmaComparisonRightData.process}`.localeCompare(`${dmaComparisonLeftData.process}`); 135 }); 136 break; 137 case 'sizeDelta': 138 this.damClickTable!.recycleDataSource = array.sort((dmaComparisonLeftData, dmaComparisonRightData) => { 139 return sort === 1 140 ? dmaComparisonLeftData.value - dmaComparisonRightData.value 141 : dmaComparisonRightData.value - dmaComparisonLeftData.value; 142 }); 143 break; 144 } 145 break; 146 } 147 } 148 149 initHtml(): string { 150 return ` 151<style> 152.damClickTable{ 153 height: auto; 154} 155:host{ 156 display: flex; 157 flex-direction: column; 158 padding: 10px 10px; 159} 160</style> 161<lit-table id="damClickTable" class="damClickTable"> 162 <lit-table-column order title="Process" data-index="process" key="process" align="flex-start" width="1fr" > 163 </lit-table-column> 164 <lit-table-column order title="SizeDelta" data-index="sizes" key="sizeDelta" align="flex-start" width="1fr" > 165 </lit-table-column> 166</lit-table> 167<tab-pane-js-memory-filter id="filter" first hideFilter ></tab-pane-js-memory-filter> 168 `; 169 } 170} 171