• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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