diff --git a/libs/search/features_layer_matcher.hpp b/libs/search/features_layer_matcher.hpp index ffe01c9f4..5a164205c 100644 --- a/libs/search/features_layer_matcher.hpp +++ b/libs/search/features_layer_matcher.hpp @@ -115,11 +115,16 @@ private: static bool HouseNumbersMatch(FeatureType & feature, std::vector const & queryParse) { + ASSERT(!queryParse.empty(), ()); + auto const interpol = ftypes::IsAddressInterpolChecker::Instance().GetInterpolType(feature); if (interpol != feature::InterpolType::None) return house_numbers::HouseNumbersMatchRange(feature.GetRef(), queryParse, interpol); auto const uniHouse = strings::MakeUniString(feature.GetHouseNumber()); + if (uniHouse.empty()) + return false; + if (feature.GetID().IsEqualCountry({"Czech", "Slovakia"})) return house_numbers::HouseNumbersMatchConscription(uniHouse, queryParse); @@ -327,6 +332,9 @@ private: if (std::binary_search(buildings.begin(), buildings.end(), houseId)) return true; + if (!child.m_hasDelayedFeatures || queryParse.empty()) + return false; + if (m_postcodes && !m_postcodes->HasBit(houseId) && !m_postcodes->HasBit(streetId)) return false; @@ -334,9 +342,6 @@ private: if (!feature) return false; - if (!child.m_hasDelayedFeatures) - return false; - return HouseNumbersMatch(*feature, queryParse); }; @@ -384,6 +389,8 @@ private: std::vector queryParse; ParseQuery(child.m_subQuery, child.m_lastTokenIsPrefix, queryParse); + if (queryParse.empty()) + return; uint32_t numFilterInvocations = 0; auto const houseNumberFilter = [&](uint32_t houseId) diff --git a/libs/search/house_numbers_matcher.cpp b/libs/search/house_numbers_matcher.cpp index 6d34e4d5c..1c6ad8e6a 100644 --- a/libs/search/house_numbers_matcher.cpp +++ b/libs/search/house_numbers_matcher.cpp @@ -516,8 +516,7 @@ void ParseQuery(UniString const & query, bool queryIsPrefix, TokensT & parse) bool HouseNumbersMatch(UniString const & houseNumber, TokensT const & queryParse) { - if (houseNumber.empty() || queryParse.empty()) - return false; + ASSERT(!houseNumber.empty() && !queryParse.empty(), ()); // Fast pre-check, helps to early exit without complex house number parsing. if (IsASCIIDigit(houseNumber[0]) && IsASCIIDigit(queryParse[0].m_value[0]) && @@ -559,7 +558,7 @@ bool HouseNumbersMatchConscription(UniString const & houseNumber, TokensT const bool HouseNumbersMatchRange(std::string_view const & hnRange, TokensT const & queryParse, feature::InterpolType interpol) { - ASSERT(interpol != feature::InterpolType::None, ()); + ASSERT(!queryParse.empty() && interpol != feature::InterpolType::None, ()); if (queryParse[0].m_type != Token::TYPE_NUMBER) return false;