blob: 4626271087579efd893790246013ba5b70523549 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/optimization_guide/core/entity_metadata.h"
#include <ostream>
#include <string>
#include <vector>
#include "base/json/json_writer.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
namespace optimization_guide {
PageEntityCollection GetPageEntityCollectionForString(
const std::string& collection_str) {
// A const map of raw entity collection strings to enum values.
//
// The map keys need to be kept consistent with the source of the original
// collection list:
// https://source.corp.google.com/piper///depot/google3/production/borg/webref/ondevice/model-building-conf-chrome.gcl?q=labelling_collections_hrids
static const base::flat_map<std::string, PageEntityCollection>
kPageEntityCollectionMap = {
{"/collection/accommodations", PageEntityCollection::kAccommodations},
{"/collection/actors", PageEntityCollection::kActors},
{"/collection/airports", PageEntityCollection::kAirports},
{"/collection/anatomical_structures",
PageEntityCollection::kAnatomicalStructures},
{"/collection/artworks", PageEntityCollection::kArtworks},
{"/collection/athletes", PageEntityCollection::kAthletes},
{"/collection/authors", PageEntityCollection::kAuthors},
{"/collection/book_editions", PageEntityCollection::kBookEditions},
{"/collection/business_operations",
PageEntityCollection::kBusinessOperations},
{"/collection/cars", PageEntityCollection::kCars},
{"/collection/causes_of_death", PageEntityCollection::kCausesOfDeath},
{"/collection/celestial_object_with_coordinate_systems",
PageEntityCollection::kCelestialObjectWithCoordinateSystems},
{"/collection/chemical_compounds",
PageEntityCollection::kChemicalCompounds},
{"/collection/consumer_products",
PageEntityCollection::kConsumerProducts},
{"/collection/cuisines", PageEntityCollection::kCuisines},
{"/collection/culinary_measures",
PageEntityCollection::kCulinaryMeasures},
{"/collection/currencies", PageEntityCollection::kCurrencies},
{"/collection/diets", PageEntityCollection::kDiets},
{"/collection/disease_or_medical_conditions",
PageEntityCollection::kDiseaseOrMedicalConditions},
{"/collection/educational_institutions",
PageEntityCollection::kEducationalInstitutions},
{"/collection/employers", PageEntityCollection::kEmployers},
{"/collection/events", PageEntityCollection::kEvents},
{"/collection/fictional_characters",
PageEntityCollection::kFictionalCharacters},
{"/collection/film_actors", PageEntityCollection::kFilmActors},
{"/collection/film_screening_venues",
PageEntityCollection::kFilmScreeningVenues},
{"/collection/film_series", PageEntityCollection::kFilmSeries},
{"/collection/films", PageEntityCollection::kFilms},
{"/collection/foods", PageEntityCollection::kFoods},
{"/collection/garments", PageEntityCollection::kGarments},
{"/collection/geo/business_chain",
PageEntityCollection::kGeoBusinessChain},
{"/collection/geo/establishment",
PageEntityCollection::kGeoEstablishment},
{"/collection/geo/locality", PageEntityCollection::kGeoLocality},
{"/collection/geo/natural_feature",
PageEntityCollection::kGeoNaturalFeature},
{"/collection/geo/political", PageEntityCollection::kGeoPolitical},
{"/collection/holidays", PageEntityCollection::kHolidays},
{"/collection/human_languages",
PageEntityCollection::kHumanLanguages},
{"/collection/software", PageEntityCollection::kSoftware},
{"/collection/job_titles", PageEntityCollection::kJobTitles},
{"/collection/literary_series",
PageEntityCollection::kLiterarySeries},
{"/collection/local_shopping_buyables",
PageEntityCollection::kLocalShoppingBuyables},
{"/collection/materials", PageEntityCollection::kMaterials},
{"/collection/medical_treatments",
PageEntityCollection::kMedicalTreatments},
{"/collection/models", PageEntityCollection::kModels},
{"/collection/music_group_members",
PageEntityCollection::kMusicGroupMembers},
{"/collection/musical_albums", PageEntityCollection::kMusicalAlbums},
{"/collection/musical_artists",
PageEntityCollection::kMusicalArtists},
{"/collection/musical_genres", PageEntityCollection::kMusicalGenres},
{"/collection/musical_groups", PageEntityCollection::kMusicalGroups},
{"/collection/musical_recordings",
PageEntityCollection::kMusicalRecordings},
{"/collection/musical_releases",
PageEntityCollection::kMusicalReleases},
{"/collection/musicians", PageEntityCollection::kMusicians},
{"/collection/organism_classifications",
PageEntityCollection::kOrganismClassifications},
{"/collection/organizations", PageEntityCollection::kOrganizations},
{"/collection/people", PageEntityCollection::kPeople},
{"/collection/periodicals", PageEntityCollection::kPeriodicals},
{"/collection/politicians", PageEntityCollection::kPoliticians},
{"/collection/recording_clusters",
PageEntityCollection::kRecordingClusters},
{"/collection/religions", PageEntityCollection::kReligions},
{"/collection/restaurants", PageEntityCollection::kRestaurants},
{"/collection/ride_offering_services",
PageEntityCollection::kRideOfferingServices},
{"/collection/shopping_centers",
PageEntityCollection::kShoppingCenters},
{"/collection/social_network_service_websites",
PageEntityCollection::kSocialNetworkServiceWebsites},
{"/collection/sports", PageEntityCollection::kSports},
{"/collection/sports_teams", PageEntityCollection::kSportsTeams},
{"/collection/structures", PageEntityCollection::kStructures},
{"/collection/tourist_attractions",
PageEntityCollection::kTouristAttractions},
{"/collection/travel_destinations",
PageEntityCollection::kTravelDestinations},
{"/collection/tv_actors", PageEntityCollection::kTvActors},
{"/collection/tv_episodes", PageEntityCollection::kTvEpisodes},
{"/collection/tv_programs", PageEntityCollection::kTvPrograms},
{"/collection/venues", PageEntityCollection::kVenues},
{"/collection/video_games", PageEntityCollection::kVideoGames},
{"/collection/websites", PageEntityCollection::kWebsites},
{"/collection/written_works", PageEntityCollection::kWrittenWorks}};
const auto it = kPageEntityCollectionMap.find(collection_str);
return it != kPageEntityCollectionMap.end() ? it->second
: PageEntityCollection::kUnknown;
}
std::string GetPageEntityCollectionLabel(const std::string& collection_str) {
static constexpr char kUnknown[] = "Unknown";
// A const map of raw entity collection strings to labels.
//
// The map keys need to be kept consistent with the source of the original
// collection list:
// https://source.corp.google.com/piper///depot/google3/production/borg/webref/ondevice/model-building-conf-chrome.gcl?q=labelling_collections_hrids
static const base::flat_map<std::string, std::string>
kPageEntityCollectionLabelMap = {
{"/collection/accommodations", "Accommodations"},
{"/collection/actors", "Actors"},
{"/collection/airports", "Airports"},
{"/collection/anatomical_structures", "AnatomicalStructures"},
{"/collection/artworks", "Artworks"},
{"/collection/athletes", "Athletes"},
{"/collection/authors", "Authors"},
{"/collection/book_editions", "BookEditions"},
{"/collection/business_operations", "BusinessOperations"},
{"/collection/cars", "Cars"},
{"/collection/causes_of_death", "CausesOfDeath"},
{"/collection/celestial_object_with_coordinate_systems",
"CelestialObjectWithCoordinateSystems"},
{"/collection/chemical_compounds", "HemicalCompounds"},
{"/collection/consumer_products", "ConsumerProducts"},
{"/collection/cuisines", "Cuisines"},
{"/collection/culinary_measures", "CulinaryMeasures"},
{"/collection/currencies", "Currencies"},
{"/collection/diets", "Diets"},
{"/collection/disease_or_medical_conditions",
"DiseaseOrMedicalConditions"},
{"/collection/educational_institutions", "EducationalInstitutions"},
{"/collection/employers", "Employers"},
{"/collection/events", "Events"},
{"/collection/fictional_characters", "FictionalCharacters"},
{"/collection/film_actors", "FilmActors"},
{"/collection/film_screening_venues", "FilmScreeningVenues"},
{"/collection/film_series", "FilmSeries"},
{"/collection/films", "Films"},
{"/collection/foods", "Foods"},
{"/collection/garments", "Garments"},
{"/collection/geo/business_chain", "GeoBusinessChain"},
{"/collection/geo/establishment", "GeoEstablishment"},
{"/collection/geo/locality", "GeoLocality"},
{"/collection/geo/natural_feature", "GeoNaturalFeature"},
{"/collection/geo/political", "GeoPolitical"},
{"/collection/holidays", "Holidays"},
{"/collection/human_languages", "HumanLanguages"},
{"/collection/software", "Software"},
{"/collection/job_titles", "JobTitles"},
{"/collection/literary_series", "LiterarySeries"},
{"/collection/local_shopping_buyables", "LocalShoppingBuyables"},
{"/collection/materials", "Materials"},
{"/collection/medical_treatments", "MedicalTreatments"},
{"/collection/models", "Models"},
{"/collection/music_group_members", "MusicGroupMembers"},
{"/collection/musical_albums", "MusicalAlbums"},
{"/collection/musical_artists", "MusicalArtists"},
{"/collection/musical_genres", "MusicalGenres"},
{"/collection/musical_groups", "MusicalGroups"},
{"/collection/musical_recordings", "MusicalRecordings"},
{"/collection/musical_releases", "MusicalReleases"},
{"/collection/musicians", "Musicians"},
{"/collection/organism_classifications", "OrganismClassifications"},
{"/collection/organizations", "Organizations"},
{"/collection/people", "People"},
{"/collection/periodicals", "Periodicals"},
{"/collection/politicians", "Politicians"},
{"/collection/recording_clusters", "RecordingClusters"},
{"/collection/religions", "Religions"},
{"/collection/restaurants", "Restaurants"},
{"/collection/ride_offering_services", "RideOfferingServices"},
{"/collection/shopping_centers", "ShoppingCenters"},
{"/collection/social_network_service_websites",
"SocialNetworkServiceWebsites"},
{"/collection/sports", "Sports"},
{"/collection/sports_teams", "SportsTeams"},
{"/collection/structures", "Structures"},
{"/collection/tourist_attractions", "TouristAttractions"},
{"/collection/travel_destinations", "TravelDestinations"},
{"/collection/tv_actors", "TvActors"},
{"/collection/tv_episodes", "TvEpisodes"},
{"/collection/tv_programs", "TvPrograms"},
{"/collection/venues", "Venues"},
{"/collection/video_games", "VideoGames"},
{"/collection/websites", "Websites"},
{"/collection/written_works", "WrittenWorks"}};
const auto it = kPageEntityCollectionLabelMap.find(collection_str);
if (it != kPageEntityCollectionLabelMap.end()) {
return it->second;
} else {
return kUnknown;
}
}
EntityMetadata::EntityMetadata() = default;
EntityMetadata::EntityMetadata(
const std::string& entity_id,
const std::string& human_readable_name,
const base::flat_map<std::string, float>& human_readable_categories,
const std::vector<std::string>& human_readable_aliases,
const std::vector<std::string>& collections)
: entity_id(entity_id),
human_readable_name(human_readable_name),
human_readable_categories(human_readable_categories),
human_readable_aliases(human_readable_aliases),
collections(collections) {}
EntityMetadata::EntityMetadata(const EntityMetadata&) = default;
EntityMetadata::~EntityMetadata() = default;
base::Value EntityMetadata::AsValue() const {
base::Value::List categories;
for (const auto& iter : human_readable_categories) {
base::Value::Dict category;
category.Set("category", iter.first);
category.Set("score", iter.second);
categories.Append(std::move(category));
}
base::Value::List aliases_list;
for (const auto& alias : human_readable_aliases) {
aliases_list.Append(alias);
}
base::Value::List collection_list;
for (const auto& collection : collections) {
collection_list.Append(collection);
}
base::Value::Dict metadata;
metadata.Set("entity_id", entity_id);
metadata.Set("human_readable_name", human_readable_name);
metadata.Set("categories", std::move(categories));
metadata.Set("human_readable_aliases", std::move(aliases_list));
metadata.Set("collections", std::move(collection_list));
return base::Value(std::move(metadata));
}
std::string EntityMetadata::ToString() const {
std::vector<std::string> categories;
for (const auto& iter : human_readable_categories) {
categories.push_back(
base::StringPrintf("{%s,%f}", iter.first.c_str(), iter.second));
}
return base::StringPrintf(
"EntityMetadata{%s, %s, {%s}, {%s}, {%s}}", entity_id.c_str(),
human_readable_name.c_str(), base::JoinString(categories, ",").c_str(),
base::JoinString(human_readable_aliases, ",").c_str(),
base::JoinString(collections, ",").c_str());
}
std::string EntityMetadata::ToHumanReadableString() const {
std::vector<std::string> categories;
for (const auto& iter : human_readable_categories) {
categories.push_back(
base::StringPrintf("{%s,%f}", iter.first.c_str(), iter.second));
}
return base::StringPrintf(
"%s %s, %s {%s}, %s {%s}, %s {%s}",
"Entity:", human_readable_name.c_str(),
"Categories: ", base::JoinString(categories, ",").c_str(),
"Aliases: ", base::JoinString(human_readable_aliases, ",").c_str(),
"Collections: ", base::JoinString(collections, ",").c_str());
}
std::ostream& operator<<(std::ostream& out, const EntityMetadata& md) {
out << md.ToString();
return out;
}
bool operator==(const EntityMetadata& lhs, const EntityMetadata& rhs) {
return lhs.entity_id == rhs.entity_id &&
lhs.human_readable_name == rhs.human_readable_name &&
lhs.human_readable_categories == rhs.human_readable_categories &&
lhs.human_readable_aliases == rhs.human_readable_aliases &&
lhs.collections == rhs.collections;
}
ScoredEntityMetadata::ScoredEntityMetadata() = default;
ScoredEntityMetadata::ScoredEntityMetadata(float score,
const EntityMetadata& md)
: metadata(md), score(score) {}
ScoredEntityMetadata::ScoredEntityMetadata(const ScoredEntityMetadata&) =
default;
ScoredEntityMetadata::~ScoredEntityMetadata() = default;
base::Value ScoredEntityMetadata::AsValue() const {
base::Value::Dict scored_md;
scored_md.Set("metadata", metadata.AsValue());
scored_md.Set("score", score);
return base::Value(std::move(scored_md));
}
std::string ScoredEntityMetadata::ToString() const {
return base::StringPrintf("ScoredEntityMetadata{%f, %s}", score,
metadata.ToString().c_str());
}
std::ostream& operator<<(std::ostream& out, const ScoredEntityMetadata& md) {
out << md.ToString();
return out;
}
bool operator==(const ScoredEntityMetadata& lhs,
const ScoredEntityMetadata& rhs) {
constexpr const double kScoreTolerance = 1e-6;
return lhs.metadata == rhs.metadata &&
std::abs(lhs.score - rhs.score) <= kScoreTolerance;
}
} // namespace optimization_guide