#pragma once #include "search/cbv.hpp" #include "search/geocoder_locality.hpp" #include "search/ranking_utils.hpp" #include "base/string_utils.hpp" #include #include #include #include namespace search { class CBV; class IdfMap; class QueryParams; struct BaseContext; class LocalityScorer { public: static size_t const kDefaultReadLimit; class Delegate { public: virtual ~Delegate() = default; virtual void GetNames(uint32_t featureId, std::vector & names) const = 0; virtual uint8_t GetRank(uint32_t featureId) const = 0; }; LocalityScorer(QueryParams const & params, Delegate const & delegate); // Leaves at most |limit| elements of |localities|, ordered by their // features. void GetTopLocalities(MwmSet::MwmId const & countryId, BaseContext const & ctx, CBV const & filter, size_t limit, std::vector & localities) const; private: struct ExLocality { ExLocality() = default; ExLocality(Locality const & locality, double queryNorm, uint8_t rank); uint32_t GetId() const { return m_locality.m_featureId; } Locality m_locality; double m_queryNorm = 0.0; double m_similarity = 0.0; uint8_t m_rank = 0; }; friend std::string DebugPrint(ExLocality const & locality); // Leaves at most |limit| elements of |localities|, ordered by some // combination of ranks and number of matched tokens. void LeaveTopLocalities(IdfMap & idfs, size_t limit, std::vector & localities) const; // Selects at most |limitUniqueIds| best features by query norm and // rank, and then leaves only localities corresponding to those // features in |els|. void LeaveTopByNormAndRank(size_t limitUniqueIds, std::vector & els) const; // Leaves at most |limit| unique best localities by similarity to // the query and rank. void LeaveTopBySimilarityAndRank(size_t limit, std::vector & els) const; void GetDocVecs(uint32_t localityId, std::vector & dvs) const; double GetSimilarity(QueryVec & qv, IdfMap & docIdfs, std::vector & dvs) const; QueryParams const & m_params; Delegate const & m_delegate; }; } // namespace search