OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/contextual_search/browser/ctr_aggregator.h" | 5 #include "components/contextual_search/browser/ctr_aggregator.h" |
6 | 6 |
7 #include "base/numerics/safe_conversions.h" | 7 #include "base/numerics/safe_conversions.h" |
8 #include "base/time/time.h" | 8 #include "base/time/time.h" |
9 | 9 |
10 namespace { | 10 namespace { |
11 | 11 |
12 const double kSecondsPerWeek = | 12 const double kSecondsPerWeek = |
13 base::Time::kMicrosecondsPerWeek / base::Time::kMicrosecondsPerSecond; | 13 base::Time::kMicrosecondsPerWeek / base::Time::kMicrosecondsPerSecond; |
14 // Used for validation in debug build. Week numbers are > 2300 as of year 2016. | 14 // Used for validation in debug build. Week numbers are > 2300 as of year 2016. |
15 const int kReasonableMinWeek = 2000; | 15 const int kReasonableMinWeek = 2000; |
16 | 16 |
17 } // namespace | 17 } // namespace |
18 | 18 |
19 namespace contextual_search { | 19 namespace contextual_search { |
20 | 20 |
21 CTRAggregator::CTRAggregator(WeeklyActivityStorage& storage) | 21 CtrAggregator::CtrAggregator(WeeklyActivityStorage& storage) |
22 : storage_(storage) { | 22 : storage_(storage) { |
23 base::Time now = base::Time::NowFromSystemTime(); | 23 base::Time now = base::Time::NowFromSystemTime(); |
24 double now_in_seconds = now.ToDoubleT(); | 24 double now_in_seconds = now.ToDoubleT(); |
25 week_number_ = now_in_seconds / kSecondsPerWeek; | 25 week_number_ = now_in_seconds / kSecondsPerWeek; |
26 DCHECK(week_number_ >= kReasonableMinWeek); | 26 DCHECK(week_number_ >= kReasonableMinWeek); |
27 // NOTE: This initialization may callback into the storage implementation so | 27 // NOTE: This initialization may callback into the storage implementation so |
28 // that needs to be fully initialized when constructing this aggregator. | 28 // that needs to be fully initialized when constructing this aggregator. |
29 storage_.AdvanceToWeek(week_number_); | 29 storage_.AdvanceToWeek(week_number_); |
30 } | 30 } |
31 | 31 |
32 // Testing only | 32 // Testing only |
33 CTRAggregator::CTRAggregator(WeeklyActivityStorage& storage, int week_number) | 33 CtrAggregator::CtrAggregator(WeeklyActivityStorage& storage, int week_number) |
34 : storage_(storage), week_number_(week_number) { | 34 : storage_(storage), week_number_(week_number) { |
35 storage_.AdvanceToWeek(week_number_); | 35 storage_.AdvanceToWeek(week_number_); |
36 } | 36 } |
37 | 37 |
38 CTRAggregator::~CTRAggregator() {} | 38 CtrAggregator::~CtrAggregator() {} |
39 | 39 |
40 void CTRAggregator::RecordImpression(bool did_click) { | 40 void CtrAggregator::RecordImpression(bool did_click) { |
41 storage_.WriteImpressions(week_number_, | 41 storage_.WriteImpressions(week_number_, |
42 1 + storage_.ReadImpressions(week_number_)); | 42 1 + storage_.ReadImpressions(week_number_)); |
43 if (did_click) | 43 if (did_click) |
44 storage_.WriteClicks(week_number_, 1 + storage_.ReadClicks(week_number_)); | 44 storage_.WriteClicks(week_number_, 1 + storage_.ReadClicks(week_number_)); |
45 } | 45 } |
46 | 46 |
47 bool CTRAggregator::HasPreviousWeekData() { | 47 int CtrAggregator::GetCurrentWeekNumber() { |
| 48 return week_number_; |
| 49 } |
| 50 |
| 51 bool CtrAggregator::HasPreviousWeekData() { |
48 return storage_.HasData(week_number_ - 1); | 52 return storage_.HasData(week_number_ - 1); |
49 } | 53 } |
50 | 54 |
51 int CTRAggregator::GetPreviousWeekImpressions() { | 55 int CtrAggregator::GetPreviousWeekImpressions() { |
52 return storage_.ReadImpressions(week_number_ - 1); | 56 return storage_.ReadImpressions(week_number_ - 1); |
53 } | 57 } |
54 | 58 |
55 float CTRAggregator::GetPreviousWeekCTR() { | 59 float CtrAggregator::GetPreviousWeekCtr() { |
56 if (!HasPreviousWeekData()) | 60 if (!HasPreviousWeekData()) |
57 return NAN; | 61 return NAN; |
58 | 62 |
59 int clicks = GetPreviousWeekClicks(); | 63 int clicks = GetPreviousWeekClicks(); |
60 int impressions = GetPreviousWeekImpressions(); | 64 int impressions = GetPreviousWeekImpressions(); |
61 if (impressions == 0) | 65 if (impressions == 0) |
62 return 0.0; | 66 return 0.0; |
63 return base::saturated_cast<float>(clicks) / impressions; | 67 return base::saturated_cast<float>(clicks) / impressions; |
64 } | 68 } |
65 | 69 |
66 bool CTRAggregator::HasPrevious28DayData() { | 70 bool CtrAggregator::HasPrevious28DayData() { |
67 for (int previous = 1; previous <= kNumWeeksNeededFor28DayData; previous++) { | 71 for (int previous = 1; previous <= kNumWeeksNeededFor28DayData; previous++) { |
68 if (!storage_.HasData(week_number_ - previous)) | 72 if (!storage_.HasData(week_number_ - previous)) |
69 return false; | 73 return false; |
70 } | 74 } |
71 return true; | 75 return true; |
72 } | 76 } |
73 | 77 |
74 float CTRAggregator::GetPrevious28DayCTR() { | 78 float CtrAggregator::GetPrevious28DayCtr() { |
75 if (!HasPrevious28DayData()) | 79 if (!HasPrevious28DayData()) |
76 return NAN; | 80 return NAN; |
77 | 81 |
78 int clicks = GetPrevious28DayClicks(); | 82 int clicks = GetPrevious28DayClicks(); |
79 int impressions = GetPrevious28DayImpressions(); | 83 int impressions = GetPrevious28DayImpressions(); |
80 if (impressions == 0) | 84 if (impressions == 0) |
81 return 0.0; | 85 return 0.0; |
82 return base::saturated_cast<float>(clicks) / impressions; | 86 return base::saturated_cast<float>(clicks) / impressions; |
83 } | 87 } |
84 | 88 |
85 int CTRAggregator::GetPrevious28DayImpressions() { | 89 int CtrAggregator::GetPrevious28DayImpressions() { |
86 int impressions = 0; | 90 int impressions = 0; |
87 for (int previous = 1; previous <= kNumWeeksNeededFor28DayData; previous++) { | 91 for (int previous = 1; previous <= kNumWeeksNeededFor28DayData; previous++) { |
88 impressions += storage_.ReadImpressions(week_number_ - previous); | 92 impressions += storage_.ReadImpressions(week_number_ - previous); |
89 } | 93 } |
90 return impressions; | 94 return impressions; |
91 } | 95 } |
92 | 96 |
93 // private | 97 // private |
94 | 98 |
95 int CTRAggregator::GetPreviousWeekClicks() { | 99 int CtrAggregator::GetPreviousWeekClicks() { |
96 return storage_.ReadClicks(week_number_ - 1); | 100 return storage_.ReadClicks(week_number_ - 1); |
97 } | 101 } |
98 | 102 |
99 int CTRAggregator::GetPrevious28DayClicks() { | 103 int CtrAggregator::GetPrevious28DayClicks() { |
100 int clicks = 0; | 104 int clicks = 0; |
101 for (int previous = 1; previous <= kNumWeeksNeededFor28DayData; previous++) { | 105 for (int previous = 1; previous <= kNumWeeksNeededFor28DayData; previous++) { |
102 clicks += storage_.ReadClicks(week_number_ - previous); | 106 clicks += storage_.ReadClicks(week_number_ - previous); |
103 } | 107 } |
104 return clicks; | 108 return clicks; |
105 } | 109 } |
106 | 110 |
107 // Testing only | 111 // Testing only |
108 | 112 |
109 void CTRAggregator::IncrementWeek(int weeks) { | 113 void CtrAggregator::IncrementWeek(int weeks) { |
110 week_number_ += weeks; | 114 week_number_ += weeks; |
111 storage_.AdvanceToWeek(week_number_); | 115 storage_.AdvanceToWeek(week_number_); |
112 } | 116 } |
113 | 117 |
114 } // namespace contextual_search | 118 } // namespace contextual_search |
OLD | NEW |