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