• 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';
17import { LitTable } from '../../../../../base-ui/table/lit-table';
18import { SelectionParam } from '../../../../bean/BoxSelection';
19import { SystemDiskIOSummary } from '../../../../bean/AbilityMonitor';
20import { Utils } from '../../base/Utils';
21import { ColorUtils } from '../../base/ColorUtils';
22import { log } from '../../../../../log/Log';
23import { resizeObserver } from '../SheetUtils';
24import { getTabDiskAbilityData } from '../../../../database/sql/Ability.sql';
25
26@element('tabpane-disk-ability')
27export class TabPaneDiskAbility extends BaseElement {
28  private diskAbilityTbl: LitTable | null | undefined;
29  private diskAbilitySource: Array<SystemDiskIOSummary> = [];
30  private queryDiskResult: Array<SystemDiskIOSummary> = [];
31  private search: HTMLInputElement | undefined | null;
32
33  set data(diskAbilityValue: SelectionParam) {
34    if (this.diskAbilityTbl) {
35      // @ts-ignore
36      this.diskAbilityTbl.shadowRoot.querySelector('.table').style.height = this.parentElement.clientHeight - 45 + 'px';
37    }
38    this.queryDataByDB(diskAbilityValue);
39  }
40
41  initElements(): void {
42    this.diskAbilityTbl = this.shadowRoot?.querySelector<LitTable>('#tb-disk-ability');
43    this.diskAbilityTbl!.addEventListener('column-click', (evt) => {
44      // @ts-ignore
45      this.sortByColumn(evt.detail);
46    });
47  }
48
49  connectedCallback(): void {
50    super.connectedCallback();
51    resizeObserver(this.parentElement!, this.diskAbilityTbl!);
52  }
53
54  filterData(): void {
55    if (this.queryDiskResult.length > 0) {
56      let filterDisk = this.queryDiskResult.filter((item) => {
57        let array = this.toDiskAbilityArray(item);
58        let isInclude = array.filter((value) => value.indexOf(this.search!.value) > -1);
59        return isInclude.length > 0;
60      });
61      if (filterDisk.length > 0) {
62        this.diskAbilitySource = filterDisk;
63        this.diskAbilityTbl!.recycleDataSource = this.diskAbilitySource;
64      } else {
65        this.diskAbilitySource = [];
66        this.diskAbilityTbl!.recycleDataSource = [];
67      }
68    }
69  }
70
71  toDiskAbilityArray(systemDiskIOSummary: SystemDiskIOSummary): string[] {
72    let array: Array<string> = [];
73    array.push(systemDiskIOSummary.startTimeStr);
74    array.push(systemDiskIOSummary.durationStr);
75    array.push(systemDiskIOSummary.dataReadStr);
76    array.push(systemDiskIOSummary.dataReadSecStr);
77    array.push(systemDiskIOSummary.dataWriteStr);
78    array.push(systemDiskIOSummary.readsInStr);
79    array.push(systemDiskIOSummary.readsInSecStr);
80    array.push(systemDiskIOSummary.writeOutStr);
81    array.push(systemDiskIOSummary.writeOutSecStr);
82    return array;
83  }
84
85  queryDataByDB(val: SelectionParam): void {
86    getTabDiskAbilityData(val.leftNs, val.rightNs).then((result) => {
87      log('getTabDiskAbilityData result size : ' + result.length);
88      if (result.length !== null && result.length > 0) {
89        for (const systemDiskIOSummary of result) {
90          if (systemDiskIOSummary.startTime <= 0) {
91            systemDiskIOSummary.startTimeStr = '0:000.000.000';
92          } else {
93            systemDiskIOSummary.startTimeStr = Utils.getTimeStampHMS(systemDiskIOSummary.startTime);
94          }
95          systemDiskIOSummary.durationStr = Utils.getDurString(systemDiskIOSummary.duration);
96          systemDiskIOSummary.dataReadStr = systemDiskIOSummary.dataRead + 'KB';
97          systemDiskIOSummary.dataReadSecStr = systemDiskIOSummary.dataReadSec + 'KB/S';
98          systemDiskIOSummary.dataWriteStr = systemDiskIOSummary.dataWrite + 'KB';
99          systemDiskIOSummary.dataWriteSecStr = systemDiskIOSummary.dataWriteSec + 'KB/S';
100          systemDiskIOSummary.readsInStr = ColorUtils.formatNumberComma(systemDiskIOSummary.readsIn);
101          systemDiskIOSummary.readsInSecStr = systemDiskIOSummary.readsInSec.toString();
102          systemDiskIOSummary.writeOutStr = ColorUtils.formatNumberComma(systemDiskIOSummary.writeOut);
103          systemDiskIOSummary.writeOutSecStr = systemDiskIOSummary.writeOutSec.toString();
104        }
105        this.diskAbilitySource = result;
106        this.queryDiskResult = result;
107        this.diskAbilityTbl!.recycleDataSource = result;
108      } else {
109        this.diskAbilitySource = [];
110        this.queryDiskResult = [];
111        this.diskAbilityTbl!.recycleDataSource = [];
112      }
113    });
114  }
115
116  initHtml(): string {
117    return `
118        <style>
119        .disk-ability-table{
120            height: auto;
121        }
122        :host{
123            flex-direction: column;
124            display: flex;
125            padding: 10px 10px;
126        }
127        </style>
128        <lit-table id="tb-disk-ability" class="disk-ability-table">
129            <lit-table-column order width="1fr"
130            title="StartTime" data-index="startTimeStr" key="startTimeStr" align="flex-start">
131            </lit-table-column>
132            <lit-table-column order width="1fr"
133            title="Duration" data-index="durationStr" key="durationStr" align="flex-start" >
134            </lit-table-column>
135            <lit-table-column order width="1fr"
136            title="Data Read" data-index="dataReadStr" key="dataReadStr" align="flex-start" >
137            </lit-table-column>
138            <lit-table-column order width="1fr"
139            title="Data Read/sec" data-index="dataReadSecStr" key="dataReadSecStr" align="flex-start">
140            </lit-table-column>
141            <lit-table-column order width="1fr"
142            title="Data Write" data-index="dataWriteStr" key="dataWriteStr" align="flex-start" >
143            </lit-table-column>
144            <lit-table-column order width="1fr"
145            title="Data Write/sec" data-index="dataWriteSecStr" key="dataWriteSecStr" align="flex-start">
146            </lit-table-column>
147            <lit-table-column order width="1fr"
148            title="Reads In" data-index="readsIn" key="readsInStr" align="flex-startStr" >
149            </lit-table-column>
150            <lit-table-column order width="1fr"
151            title="Reads In/sec" data-index="readsInSecStr" key="readsInSecStr" align="flex-start" >
152            </lit-table-column>
153            <lit-table-column order width="1fr"
154            title="Write Out" data-index="writeOutStr" key="writeOutStr" align="flex-start" >
155            </lit-table-column>
156            <lit-table-column order width="1fr"
157            title="Write Out/sec" data-index="writeOutSecStr" key="writeOutSecStr" align="flex-start" >
158            </lit-table-column>
159        </lit-table>
160        `;
161  }
162
163  getPropertyByType =
164    (property: string, type: string) =>
165    (data: SystemDiskIOSummary): number | string => {
166      let typeMap = {
167        // @ts-ignore
168        number: parseFloat(data[property]),
169        durationStr: data.duration,
170        dataReadStr: data.dataRead,
171        dataReadSecStr: data.dataReadSec,
172        dataWriteStr: data.dataWrite,
173        dataWriteSecStr: data.dataWriteSec,
174        readsInStr: data.readsIn,
175        readsInSecStr: data.readsInSec,
176        writeOutStr: data.writeOut,
177        writeOutSecStr: data.writeOutSec,
178      };
179      // @ts-ignore
180      return typeMap[type] || data[property];
181    };
182
183  compareFunction =
184    (sort: number, getProperty: (data: SystemDiskIOSummary) => number | string) =>
185    (diskAbilityLeftData: SystemDiskIOSummary, diskAbilityRightData: SystemDiskIOSummary): number => {
186      let leftValue = getProperty(diskAbilityLeftData);
187      let rightValue = getProperty(diskAbilityRightData);
188      let result = 0;
189      if (leftValue > rightValue) {
190        result = sort === 2 ? -1 : 1;
191      } else if (leftValue < rightValue) {
192        result = sort === 2 ? 1 : -1;
193      }
194      return result;
195    };
196
197  compareDisk(
198    property: string,
199    sort: number,
200    type: string
201  ): (diskAbilityLeftData: SystemDiskIOSummary, diskAbilityRightData: SystemDiskIOSummary) => number {
202    let getProperty = this.getPropertyByType(property, type);
203    return this.compareFunction(sort, getProperty);
204  }
205
206  sortByColumn(detail: unknown): void {
207    let typeMapping = {
208      startTime: 'string',
209      durationStr: 'durationStr',
210      dataReadStr: 'dataReadStr',
211      dataReadSecStr: 'dataReadSecStr',
212      dataWriteStr: 'dataWriteStr',
213      dataWriteSecStr: 'dataWriteSecStr',
214      readsInStr: 'readsInStr',
215      readsInSecStr: 'readsInSecStr',
216      writeOutStr: 'writeOutStr',
217      writeOutSecStr: 'writeOutSecStr',
218    };
219    // @ts-ignore
220    let type = typeMapping[detail.key] || 'number'; // @ts-ignore
221    this.diskAbilitySource.sort(this.compareDisk(detail.key, detail.sort, type));
222    this.diskAbilityTbl!.recycleDataSource = this.diskAbilitySource;
223  }
224}
225