| // Copyright 2018 The Fuchsia 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 "peridot/bin/suggestion_engine/ranking_features/dead_story_ranking_feature.h" |
| |
| #include <fuchsia/modular/cpp/fidl.h> |
| |
| namespace modular { |
| |
| DeadStoryRankingFeature::DeadStoryRankingFeature() {} |
| |
| DeadStoryRankingFeature::~DeadStoryRankingFeature() = default; |
| |
| double DeadStoryRankingFeature::ComputeFeatureInternal( |
| const fuchsia::modular::UserInput& query, |
| const RankedSuggestion& ranked_suggestion) { |
| const auto& proposal = ranked_suggestion.prototype->proposal; |
| |
| // Proposal not tied to any story. |
| if (proposal.affinity.empty()) { |
| return kMinConfidence; |
| } |
| |
| // TODO(miguelfrde): cache ids of stories in context in an unordered_set for |
| // average O(1) lookup. |
| for (const auto& context_value : *ContextValues()) { |
| const auto& story_name = context_value.meta.story->id; |
| for (const auto& affinity : proposal.affinity) { |
| switch (affinity.Which()) { |
| case fuchsia::modular::ProposalAffinity::Tag::kModuleAffinity: |
| if (story_name == affinity.module_affinity().story_name) { |
| return kMinConfidence; |
| } |
| break; |
| case fuchsia::modular::ProposalAffinity::Tag::kStoryAffinity: |
| if (story_name == affinity.story_affinity().story_name) { |
| return kMinConfidence; |
| } |
| break; |
| default: |
| break; |
| } |
| } |
| } |
| return kMaxConfidence; |
| } |
| |
| fuchsia::modular::ContextSelectorPtr |
| DeadStoryRankingFeature::CreateContextSelectorInternal() { |
| // Get stories in context. |
| auto selector = fuchsia::modular::ContextSelector::New(); |
| selector->type = fuchsia::modular::ContextValueType::STORY; |
| return selector; |
| } |
| |
| } // namespace modular |