1fb726d48Sopenharmony_ci/*
2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd.
3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb726d48Sopenharmony_ci * You may obtain a copy of the License at
6fb726d48Sopenharmony_ci *
7fb726d48Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fb726d48Sopenharmony_ci *
9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and
13fb726d48Sopenharmony_ci * limitations under the License.
14fb726d48Sopenharmony_ci */
15fb726d48Sopenharmony_ci
16fb726d48Sopenharmony_ciimport { BaseElement, element } from '../../../base-ui/BaseElement';
17fb726d48Sopenharmony_ciimport { LitTable } from '../../../base-ui/table/lit-table';
18fb726d48Sopenharmony_ciimport { procedurePool } from '../../database/Procedure';
19fb726d48Sopenharmony_ciimport { info } from '../../../log/Log';
20fb726d48Sopenharmony_ciimport { LitChartPie } from '../../../base-ui/chart/pie/LitChartPie';
21fb726d48Sopenharmony_ciimport '../../../base-ui/progress-bar/LitProgressBar';
22fb726d48Sopenharmony_ciimport { LitProgressBar } from '../../../base-ui/progress-bar/LitProgressBar';
23fb726d48Sopenharmony_ciimport './TableNoData';
24fb726d48Sopenharmony_ciimport { TableNoData } from './TableNoData';
25fb726d48Sopenharmony_ci
26fb726d48Sopenharmony_ci@element('top20-process-switch-count')
27fb726d48Sopenharmony_ciexport class Top20ProcessSwitchCount extends BaseElement {
28fb726d48Sopenharmony_ci  traceChange: boolean = false;
29fb726d48Sopenharmony_ci  private processSwitchCountTbl: LitTable | null | undefined;
30fb726d48Sopenharmony_ci  private processSwitchCountPie: LitChartPie | null | undefined;
31fb726d48Sopenharmony_ci  private processSwitchCountProgress: LitProgressBar | null | undefined;
32fb726d48Sopenharmony_ci  private nodata: TableNoData | null | undefined;
33fb726d48Sopenharmony_ci  private processSwitchCountData: Array<unknown> = [];
34fb726d48Sopenharmony_ci
35fb726d48Sopenharmony_ci  initElements(): void {
36fb726d48Sopenharmony_ci    this.nodata = this.shadowRoot!.querySelector<TableNoData>('#nodata');
37fb726d48Sopenharmony_ci    this.processSwitchCountProgress = this.shadowRoot!.querySelector<LitProgressBar>('#loading');
38fb726d48Sopenharmony_ci    this.processSwitchCountTbl = this.shadowRoot!.querySelector<LitTable>('#tb-process-switch-count');
39fb726d48Sopenharmony_ci    this.processSwitchCountPie = this.shadowRoot!.querySelector<LitChartPie>('#pie');
40fb726d48Sopenharmony_ci
41fb726d48Sopenharmony_ci    this.processSwitchCountTbl!.addEventListener('row-click', (evt: unknown): void => {
42fb726d48Sopenharmony_ci      //@ts-ignore
43fb726d48Sopenharmony_ci      let data = evt.detail.data;
44fb726d48Sopenharmony_ci      data.isSelected = true;
45fb726d48Sopenharmony_ci      // @ts-ignore
46fb726d48Sopenharmony_ci      if ((evt.detail as unknown).callBack) {
47fb726d48Sopenharmony_ci        // @ts-ignore
48fb726d48Sopenharmony_ci        (evt.detail as unknown).callBack(true);
49fb726d48Sopenharmony_ci      }
50fb726d48Sopenharmony_ci    });
51fb726d48Sopenharmony_ci
52fb726d48Sopenharmony_ci    this.processSwitchCountTbl!.addEventListener('column-click', (evt): void => {
53fb726d48Sopenharmony_ci      // @ts-ignore
54fb726d48Sopenharmony_ci      this.sortByColumn(evt.detail);
55fb726d48Sopenharmony_ci    });
56fb726d48Sopenharmony_ci    this.processSwitchCountTbl!.addEventListener('row-hover', (evt: unknown): void => {
57fb726d48Sopenharmony_ci      //@ts-ignore
58fb726d48Sopenharmony_ci      if (evt.detail.data) {
59fb726d48Sopenharmony_ci        //@ts-ignore
60fb726d48Sopenharmony_ci        let data = evt.detail.data;
61fb726d48Sopenharmony_ci        data.isHover = true; //@ts-ignore
62fb726d48Sopenharmony_ci        if ((evt.detail as unknown).callBack) {
63fb726d48Sopenharmony_ci          //@ts-ignore
64fb726d48Sopenharmony_ci          (evt.detail as unknown).callBack(true);
65fb726d48Sopenharmony_ci        }
66fb726d48Sopenharmony_ci      }
67fb726d48Sopenharmony_ci      this.processSwitchCountPie?.showHover();
68fb726d48Sopenharmony_ci    });
69fb726d48Sopenharmony_ci  }
70fb726d48Sopenharmony_ci
71fb726d48Sopenharmony_ci  init(): void {
72fb726d48Sopenharmony_ci    if (!this.traceChange) {
73fb726d48Sopenharmony_ci      if (this.processSwitchCountTbl!.recycleDataSource.length > 0) {
74fb726d48Sopenharmony_ci        this.processSwitchCountTbl?.reMeauseHeight();
75fb726d48Sopenharmony_ci      }
76fb726d48Sopenharmony_ci      return;
77fb726d48Sopenharmony_ci    }
78fb726d48Sopenharmony_ci    this.traceChange = false;
79fb726d48Sopenharmony_ci    this.processSwitchCountProgress!.loading = true;
80fb726d48Sopenharmony_ci    this.queryLogicWorker(
81fb726d48Sopenharmony_ci      'scheduling-Process SwitchCount',
82fb726d48Sopenharmony_ci      'query Process Switch Count Analysis Time:',
83fb726d48Sopenharmony_ci      (res): void => {
84fb726d48Sopenharmony_ci        //@ts-ignore
85fb726d48Sopenharmony_ci        this.nodata!.noData = res === undefined || res.length === 0; //@ts-ignore
86fb726d48Sopenharmony_ci        this.processSwitchCountTbl!.recycleDataSource = res; //@ts-ignore
87fb726d48Sopenharmony_ci        this.processSwitchCountData = res;
88fb726d48Sopenharmony_ci        this.processSwitchCountTbl?.reMeauseHeight();
89fb726d48Sopenharmony_ci        this.processSwitchCountPie!.config = {
90fb726d48Sopenharmony_ci          appendPadding: 10, //@ts-ignore
91fb726d48Sopenharmony_ci          data: res,
92fb726d48Sopenharmony_ci          angleField: 'switchCount',
93fb726d48Sopenharmony_ci          colorField: 'pid',
94fb726d48Sopenharmony_ci          radius: 0.8,
95fb726d48Sopenharmony_ci          tip: (obj): string => {
96fb726d48Sopenharmony_ci            return `<div>
97fb726d48Sopenharmony_ci                             <div>pid:${
98fb726d48Sopenharmony_ci                               // @ts-ignore
99fb726d48Sopenharmony_ci                               obj.obj.tid
100fb726d48Sopenharmony_ci                             }</div> 
101fb726d48Sopenharmony_ci                             <div>p_name:${
102fb726d48Sopenharmony_ci                               // @ts-ignore
103fb726d48Sopenharmony_ci                               obj.obj.tName
104fb726d48Sopenharmony_ci                             }</div> 
105fb726d48Sopenharmony_ci                             <div>sched_switch count:${
106fb726d48Sopenharmony_ci                               // @ts-ignore
107fb726d48Sopenharmony_ci                               obj.obj.switchCount
108fb726d48Sopenharmony_ci                             }</div> 
109fb726d48Sopenharmony_ci                        </div>
110fb726d48Sopenharmony_ci                `;
111fb726d48Sopenharmony_ci          },
112fb726d48Sopenharmony_ci          label: {
113fb726d48Sopenharmony_ci            type: 'outer',
114fb726d48Sopenharmony_ci          },
115fb726d48Sopenharmony_ci          hoverHandler: (data): void => {
116fb726d48Sopenharmony_ci            if (data) {
117fb726d48Sopenharmony_ci              this.processSwitchCountTbl!.setCurrentHover(data);
118fb726d48Sopenharmony_ci            } else {
119fb726d48Sopenharmony_ci              this.processSwitchCountTbl!.mouseOut();
120fb726d48Sopenharmony_ci            }
121fb726d48Sopenharmony_ci          },
122fb726d48Sopenharmony_ci          interactions: [
123fb726d48Sopenharmony_ci            {
124fb726d48Sopenharmony_ci              type: 'element-active',
125fb726d48Sopenharmony_ci            },
126fb726d48Sopenharmony_ci          ],
127fb726d48Sopenharmony_ci        };
128fb726d48Sopenharmony_ci        this.processSwitchCountProgress!.loading = false;
129fb726d48Sopenharmony_ci      }
130fb726d48Sopenharmony_ci    );
131fb726d48Sopenharmony_ci  }
132fb726d48Sopenharmony_ci
133fb726d48Sopenharmony_ci  clearData(): void {
134fb726d48Sopenharmony_ci    this.traceChange = true;
135fb726d48Sopenharmony_ci    this.processSwitchCountPie!.dataSource = [];
136fb726d48Sopenharmony_ci    this.processSwitchCountTbl!.recycleDataSource = [];
137fb726d48Sopenharmony_ci  }
138fb726d48Sopenharmony_ci
139fb726d48Sopenharmony_ci  queryLogicWorker(option: string, log: string, handler: (res: unknown) => void): void {
140fb726d48Sopenharmony_ci    let processSwitchCountTime = new Date().getTime();
141fb726d48Sopenharmony_ci    procedurePool.submitWithName('logic0', option, {}, undefined, handler);
142fb726d48Sopenharmony_ci    let durTime = new Date().getTime() - processSwitchCountTime;
143fb726d48Sopenharmony_ci    info(log, durTime);
144fb726d48Sopenharmony_ci  }
145fb726d48Sopenharmony_ci
146fb726d48Sopenharmony_ci  sortByColumn(detail: unknown): void {
147fb726d48Sopenharmony_ci    // @ts-ignore
148fb726d48Sopenharmony_ci    function compare(processSwitchCountProperty, sort, type) {
149fb726d48Sopenharmony_ci      return function (a: unknown, b: unknown) {
150fb726d48Sopenharmony_ci        if (type === 'number') {
151fb726d48Sopenharmony_ci          return sort === 2
152fb726d48Sopenharmony_ci            ? // @ts-ignore
153fb726d48Sopenharmony_ci              parseFloat(b[processSwitchCountProperty]) - parseFloat(a[processSwitchCountProperty])
154fb726d48Sopenharmony_ci            : //@ts-ignore
155fb726d48Sopenharmony_ci              parseFloat(a[processSwitchCountProperty]) - parseFloat(b[processSwitchCountProperty]);
156fb726d48Sopenharmony_ci        } else {
157fb726d48Sopenharmony_ci          if (sort === 2) {
158fb726d48Sopenharmony_ci            //@ts-ignore
159fb726d48Sopenharmony_ci            return b[processSwitchCountProperty].toString().localeCompare(a[processSwitchCountProperty].toString());
160fb726d48Sopenharmony_ci          } else {
161fb726d48Sopenharmony_ci            //@ts-ignore
162fb726d48Sopenharmony_ci            return a[processSwitchCountProperty].toString().localeCompare(b[processSwitchCountProperty].toString());
163fb726d48Sopenharmony_ci          }
164fb726d48Sopenharmony_ci        }
165fb726d48Sopenharmony_ci      };
166fb726d48Sopenharmony_ci    }
167fb726d48Sopenharmony_ci
168fb726d48Sopenharmony_ci    //@ts-ignore
169fb726d48Sopenharmony_ci    if (detail.key === 'NO' || detail.key === 'pid' || detail.key === 'switchCount' || detail.key === 'tid') {
170fb726d48Sopenharmony_ci      //@ts-ignore
171fb726d48Sopenharmony_ci      this.processSwitchCountData.sort(compare(detail.key, detail.sort, 'number'));
172fb726d48Sopenharmony_ci    } else {
173fb726d48Sopenharmony_ci      //@ts-ignore
174fb726d48Sopenharmony_ci      this.processSwitchCountData.sort(compare(detail.key, detail.sort, 'string'));
175fb726d48Sopenharmony_ci    }
176fb726d48Sopenharmony_ci    this.processSwitchCountTbl!.recycleDataSource = this.processSwitchCountData;
177fb726d48Sopenharmony_ci  }
178fb726d48Sopenharmony_ci
179fb726d48Sopenharmony_ci  initHtml(): string {
180fb726d48Sopenharmony_ci    return `
181fb726d48Sopenharmony_ci        <style>
182fb726d48Sopenharmony_ci        :host {
183fb726d48Sopenharmony_ci            width: 100%;
184fb726d48Sopenharmony_ci            height: 100%;
185fb726d48Sopenharmony_ci            background-color: var(--dark-background5,#F6F6F6);
186fb726d48Sopenharmony_ci        }
187fb726d48Sopenharmony_ci        .top-process-tb-switch-count{
188fb726d48Sopenharmony_ci            flex: 1;        
189fb726d48Sopenharmony_ci            overflow: auto ;
190fb726d48Sopenharmony_ci            border-radius: 5px;
191fb726d48Sopenharmony_ci            border: solid 1px var(--dark-border1,#e0e0e0);
192fb726d48Sopenharmony_ci            margin: 15px;
193fb726d48Sopenharmony_ci            padding: 5px 15px
194fb726d48Sopenharmony_ci        }
195fb726d48Sopenharmony_ci        .top-process-pie-chart{
196fb726d48Sopenharmony_ci            display: flex;
197fb726d48Sopenharmony_ci            box-sizing: border-box;
198fb726d48Sopenharmony_ci            width: 500px;
199fb726d48Sopenharmony_ci            height: 500px;
200fb726d48Sopenharmony_ci        }
201fb726d48Sopenharmony_ci        .top-process-switch-root{
202fb726d48Sopenharmony_ci            display: flex;
203fb726d48Sopenharmony_ci            flex-direction: row;
204fb726d48Sopenharmony_ci            box-sizing: border-box;
205fb726d48Sopenharmony_ci            width: 100%;
206fb726d48Sopenharmony_ci            height: 100%;
207fb726d48Sopenharmony_ci        }
208fb726d48Sopenharmony_ci        </style>
209fb726d48Sopenharmony_ci        <lit-progress-bar id="loading" style="height: 1px;width: 100%" loading></lit-progress-bar>
210fb726d48Sopenharmony_ci        <table-no-data id="nodata" contentHeight="500px">
211fb726d48Sopenharmony_ci        <div class="top-process-switch-root">
212fb726d48Sopenharmony_ci            <div style="display: flex;flex-direction: column;align-items: center">
213fb726d48Sopenharmony_ci                <div>Statistics By Sched_Switch Count</div>
214fb726d48Sopenharmony_ci                <lit-chart-pie id="pie" class="top-process-pie-chart"></lit-chart-pie>
215fb726d48Sopenharmony_ci            </div>
216fb726d48Sopenharmony_ci            <div class="top-process-tb-switch-count" >
217fb726d48Sopenharmony_ci                <lit-table id="tb-process-switch-count" hideDownload style="height: auto">
218fb726d48Sopenharmony_ci                    <lit-table-column width="1fr" title="NO" data-index="NO" key="NO" align="flex-start" order></lit-table-column>
219fb726d48Sopenharmony_ci                    <lit-table-column width="1fr" title="tid" data-index="tid" key="tid" align="flex-start" order></lit-table-column>
220fb726d48Sopenharmony_ci                    <lit-table-column width="1fr" title="t_name" data-index="tName" key="tName" align="flex-start" order></lit-table-column>
221fb726d48Sopenharmony_ci                    <lit-table-column width="1fr" title="pid" data-index="pid" key="pid" align="flex-start" order></lit-table-column>
222fb726d48Sopenharmony_ci                    <lit-table-column width="1fr" title="p_name" data-index="pName" key="pName" align="flex-start" order></lit-table-column>
223fb726d48Sopenharmony_ci                    <lit-table-column width="1fr" title="sched_switch count" data-index="switchCount" key="switchCount" align="flex-start" order></lit-table-column>        
224fb726d48Sopenharmony_ci                </lit-table>
225fb726d48Sopenharmony_ci            </div>
226fb726d48Sopenharmony_ci        </div>
227fb726d48Sopenharmony_ci        </table-no-data>
228fb726d48Sopenharmony_ci        `;
229fb726d48Sopenharmony_ci  }
230fb726d48Sopenharmony_ci}
231