• 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 #include "statistics_event.h"
16 
17 #include <iomanip>
18 #include <iostream>
19 #include <map>
20 #include <sstream>
21 
22 namespace OHOS {
23 namespace WuKong {
24 namespace {
25 const uint32_t DECIMAL_LENGTH = 2;
26 const float PERCENTAGE = 100.0;
27 }  // namespace
28 
StatisticsDetail(std::vector<std::map<std::string,std::string>> srcDatas,std::map<std::string,std::shared_ptr<Table>> & destTables)29 void StatisticsEvent::StatisticsDetail(std::vector<std::map<std::string, std::string>> srcDatas,
30                                        std::map<std::string, std::shared_ptr<Table>> &destTables)
31 {
32     SrcDatasPretreatment(srcDatas);
33     // loop bundle store event statistics msg
34     for (auto bundle : eventStatisticsMsg_) {
35         DEBUG_LOG_STR("start bundlename{%s}", bundle.first.c_str());
36         std::shared_ptr<EventStatisticsMsg> curEventStatisticsMsgPtr = bundle.second;
37         uint32_t curElementTypeLength = curEventStatisticsMsgPtr->eventTypes_.size();
38         std::vector<std::string> line;
39         std::shared_ptr<EventStatisticsRecord> curEventStatisticsRecordPtr = nullptr;
40         std::shared_ptr<EventStatisticsRecord> curBundleAllStatisticsPtr =
41             std::make_shared<EventStatisticsRecord>();
42         curBundleAllStatisticsPtr->eventType_ = "total";
43         for (uint32_t i = 0; i < curElementTypeLength; i++) {
44             curEventStatisticsRecordPtr = curEventStatisticsMsgPtr->eventTypeRecord_[i];
45             UpdateLine(curEventStatisticsRecordPtr, curEventStatisticsMsgPtr->eventTypeTotal_, line);
46             record_.push_back(line);
47             curBundleAllStatisticsPtr->execTimes_ += curEventStatisticsRecordPtr->execTimes_;
48         }
49 
50         UpdateLine(curBundleAllStatisticsPtr, curEventStatisticsMsgPtr->eventTypeTotal_, line);
51         record_.push_back(line);
52         std::shared_ptr<Table> table = std::make_shared<Table>(headers_, record_);
53         table->SetName(bundle.first);
54         table->SetDetail("event");
55         destTables[bundle.first] = table;
56         record_.clear();
57     }
58 
59     GlobalElementTypesStatistics();
60     std::shared_ptr<Table> globalTable = std::make_shared<Table>(headers_, record_);
61     globalTable->SetName("all");
62     globalTable->SetDetail("event");
63     destTables["all"] = globalTable;
64     record_.clear();
65 }
66 
SrcDatasPretreatment(std::vector<std::map<std::string,std::string>> srcDatas)67 void StatisticsEvent::SrcDatasPretreatment(std::vector<std::map<std::string, std::string>> srcDatas)
68 {
69     for (auto srcData : srcDatas) {
70         DEBUG_LOG_STR("bundlename{%s} | eventType{%s}", srcData["bundleName"].c_str(), srcData["event"].c_str());
71         std::vector<std::string>::iterator globalElementTypesIter =
72             find(globalElementTypes_.begin(), globalElementTypes_.end(), srcData["event"]);
73         if (globalElementTypesIter == globalElementTypes_.end()) {
74             DEBUG_LOG_STR("push event{%s} to globalElementTypes_", srcData["event"].c_str());
75             globalElementTypes_.push_back(srcData["event"]);
76         }
77 
78         // check whether bundle is entered resolve create or reuse already exist  StatisticsMsgPtr
79         std::shared_ptr<EventStatisticsMsg> curStatisticsMsgPtr = std::make_shared<EventStatisticsMsg>();
80         std::map<std::string, std::shared_ptr<EventStatisticsMsg>>::iterator eventStatisticsMsgIter =
81             eventStatisticsMsg_.find(srcData["bundleName"]);
82         if (eventStatisticsMsgIter != eventStatisticsMsg_.end()) {
83             DEBUG_LOG_STR("use inited curStatisticsMsgPtr by bundleName{%s}", srcData["bundleName"].c_str());
84             curStatisticsMsgPtr = eventStatisticsMsg_[srcData["bundleName"]];
85         }
86         // check whether eventType is entered resolve create or reuse already exist EventStatisticsRecordPtr
87         std::shared_ptr<EventStatisticsRecord> curEventStatisticsRecordPtr =
88             std::make_shared<EventStatisticsRecord>();
89         uint32_t index = curStatisticsMsgPtr->ElementTypesIndex(srcData["event"]);
90         uint32_t curElementTypeTotal = curStatisticsMsgPtr->eventTypeTotal_;
91         if (index != curStatisticsMsgPtr->eventTypes_.size()) {
92             curEventStatisticsRecordPtr = curStatisticsMsgPtr->eventTypeRecord_[index];
93             DEBUG_LOG_STR("use inited curEventStatisticsRecordPtr in index{%d} | event{%s}", index,
94                           srcData["event"].c_str());
95         }
96         // update record msg
97         curEventStatisticsRecordPtr->eventType_ = srcData["event"];
98         curEventStatisticsRecordPtr->execTimes_++;
99 
100         if (curStatisticsMsgPtr->eventTypeRecord_.size() > index) {
101             curStatisticsMsgPtr->eventTypeRecord_[index] = curEventStatisticsRecordPtr;
102             curStatisticsMsgPtr->eventTypes_[index] = srcData["event"];
103         } else {
104             curStatisticsMsgPtr->eventTypeRecord_.push_back(curEventStatisticsRecordPtr);
105             curStatisticsMsgPtr->eventTypes_.push_back(srcData["event"]);
106         }
107 
108         curElementTypeTotal++;
109         DEBUG_LOG_STR("curElementTypeTotal{%d}", curElementTypeTotal);
110         curStatisticsMsgPtr->eventTypeTotal_ = curElementTypeTotal;
111         eventStatisticsMsg_[srcData["bundleName"]] = curStatisticsMsgPtr;
112         execCount_++;
113     }
114 }
UpdateLine(std::shared_ptr<EventStatisticsRecord> EventStatisticsRecordPtr,uint32_t eventTypeTotal,std::vector<std::string> & line)115 void StatisticsEvent::UpdateLine(std::shared_ptr<EventStatisticsRecord> EventStatisticsRecordPtr,
116                                  uint32_t eventTypeTotal, std::vector<std::string> &line)
117 {
118     std::stringstream bufferStream;
119     std::string curElementType = EventStatisticsRecordPtr->eventType_;
120     std::string curExecTimes = std::to_string(EventStatisticsRecordPtr->execTimes_);
121     std::string curProportionStr = "";
122     if (eventTypeTotal > 0) {
123         float proportion = (EventStatisticsRecordPtr->execTimes_ * PERCENTAGE) / eventTypeTotal;
124         bufferStream.str("");
125         bufferStream << std::setiosflags(std::ios::fixed) << std::setprecision(DECIMAL_LENGTH) << proportion;
126         curProportionStr = bufferStream.str() + "%";
127     }
128 
129     DEBUG_LOG_STR("line content curElementType{%s} | curExecTimes{%s}", curElementType.c_str(), curExecTimes.c_str());
130     line = {curElementType, curExecTimes, curProportionStr};
131 }
132 
GlobalElementTypesStatistics()133 void StatisticsEvent::GlobalElementTypesStatistics()
134 {
135     std::vector<std::string> line;
136     std::shared_ptr<EventStatisticsRecord> globalAllStatisticsPtr = std::make_shared<EventStatisticsRecord>();
137     globalAllStatisticsPtr->eventType_ = "total";
138     for (auto eventType : globalElementTypes_) {
139         std::shared_ptr<EventStatisticsRecord> eventStatisticsRecordPtr = std::make_shared<EventStatisticsRecord>();
140         eventStatisticsRecordPtr->eventType_ = eventType;
141         for (auto bundle : eventStatisticsMsg_) {
142             std::shared_ptr<EventStatisticsMsg> curEventStatisticsMsgPtr = bundle.second;
143             uint32_t index = curEventStatisticsMsgPtr->ElementTypesIndex(eventType);
144             if (curEventStatisticsMsgPtr->eventTypeRecord_.size() > index) {
145                 std::shared_ptr<EventStatisticsRecord> curEventStatisticsRecordPtr =
146                     curEventStatisticsMsgPtr->eventTypeRecord_[index];
147                 eventStatisticsRecordPtr->execTimes_ += curEventStatisticsRecordPtr->execTimes_;
148             }
149         }
150         globalAllStatisticsPtr->execTimes_ += eventStatisticsRecordPtr->execTimes_;
151         UpdateLine(eventStatisticsRecordPtr, execCount_, line);
152         record_.push_back(line);
153     }
154     UpdateLine(globalAllStatisticsPtr, execCount_, line);
155     record_.push_back(line);
156 }
157 }  // namespace WuKong
158 }  // namespace OHOS
159