| Index: components/contextual_search/browser/ctr_aggregator.cc
|
| diff --git a/components/contextual_search/browser/ctr_aggregator.cc b/components/contextual_search/browser/ctr_aggregator.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..83adb95ecd06efd232d0cf1372abc5d91f106ab8
|
| --- /dev/null
|
| +++ b/components/contextual_search/browser/ctr_aggregator.cc
|
| @@ -0,0 +1,114 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "components/contextual_search/browser/ctr_aggregator.h"
|
| +
|
| +#include "base/numerics/safe_conversions.h"
|
| +#include "base/time/time.h"
|
| +
|
| +namespace {
|
| +
|
| +const double kSecondsPerWeek =
|
| + base::Time::kMicrosecondsPerWeek / base::Time::kMicrosecondsPerSecond;
|
| +// Used for validation in debug build. Week numbers are > 2300 as of year 2016.
|
| +const int kReasonableMinWeek = 2000;
|
| +
|
| +} // namespace
|
| +
|
| +namespace contextual_search {
|
| +
|
| +CTRAggregator::CTRAggregator(WeeklyActivityStorage& storage)
|
| + : storage_(storage) {
|
| + base::Time now = base::Time::NowFromSystemTime();
|
| + double now_in_seconds = now.ToDoubleT();
|
| + week_number_ = now_in_seconds / kSecondsPerWeek;
|
| + DCHECK(week_number_ >= kReasonableMinWeek);
|
| + // NOTE: This initialization may callback into the storage implementation so
|
| + // that needs to be fully initialized when constructing this aggregator.
|
| + storage_.InitActivity(week_number_);
|
| +}
|
| +
|
| +// Testing only
|
| +CTRAggregator::CTRAggregator(WeeklyActivityStorage& storage, int week_number)
|
| + : storage_(storage), week_number_(week_number) {
|
| + storage_.InitActivity(week_number_);
|
| +}
|
| +
|
| +CTRAggregator::~CTRAggregator() {}
|
| +
|
| +void CTRAggregator::RecordImpression(bool did_click) {
|
| + storage_.WriteImpressions(week_number_,
|
| + 1 + storage_.ReadImpressions(week_number_));
|
| + if (did_click)
|
| + storage_.WriteClicks(week_number_, 1 + storage_.ReadClicks(week_number_));
|
| +}
|
| +
|
| +bool CTRAggregator::HasPreviousWeekData() {
|
| + return storage_.HasActivity(week_number_ - 1);
|
| +}
|
| +
|
| +int CTRAggregator::GetPreviousWeekImpressions() {
|
| + return storage_.ReadImpressions(week_number_ - 1);
|
| +}
|
| +
|
| +float CTRAggregator::GetPreviousWeekCTR() {
|
| + if (!HasPreviousWeekData())
|
| + return NAN;
|
| +
|
| + int clicks = GetPreviousWeekClicks();
|
| + int impressions = GetPreviousWeekImpressions();
|
| + if (impressions == 0)
|
| + return 0.0;
|
| + return base::saturated_cast<float>(clicks) / impressions;
|
| +}
|
| +
|
| +bool CTRAggregator::HasPrevious28DayData() {
|
| + for (int previous = 1; previous <= kNumWeeksNeededFor28DayData; previous++) {
|
| + if (!storage_.HasActivity(week_number_ - previous))
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +float CTRAggregator::GetPrevious28DayCTR() {
|
| + if (!HasPrevious28DayData())
|
| + return NAN;
|
| +
|
| + int clicks = GetPrevious28DayClicks();
|
| + int impressions = GetPrevious28DayImpressions();
|
| + if (impressions == 0)
|
| + return 0.0;
|
| + return base::saturated_cast<float>(clicks) / impressions;
|
| +}
|
| +
|
| +int CTRAggregator::GetPrevious28DayImpressions() {
|
| + int impressions = 0;
|
| + for (int previous = 1; previous <= kNumWeeksNeededFor28DayData; previous++) {
|
| + impressions += storage_.ReadImpressions(week_number_ - previous);
|
| + }
|
| + return impressions;
|
| +}
|
| +
|
| +// private
|
| +
|
| +int CTRAggregator::GetPreviousWeekClicks() {
|
| + return storage_.ReadClicks(week_number_ - 1);
|
| +}
|
| +
|
| +int CTRAggregator::GetPrevious28DayClicks() {
|
| + int clicks = 0;
|
| + for (int previous = 1; previous <= kNumWeeksNeededFor28DayData; previous++) {
|
| + clicks += storage_.ReadClicks(week_number_ - previous);
|
| + }
|
| + return clicks;
|
| +}
|
| +
|
| +// Testing only
|
| +
|
| +void CTRAggregator::IncrementWeek(int weeks) {
|
| + week_number_ += weeks;
|
| + storage_.InitActivity(week_number_);
|
| +}
|
| +
|
| +} // namespace contextual_search
|
|
|