From 2c358e705bbde855b12780be86ef19501a62dfed Mon Sep 17 00:00:00 2001 From: Mason Reed Date: Tue, 3 Mar 2026 07:57:33 -0800 Subject: [WARP] Server-side constraint matching Reduce networked functions by constraining on the returned set of functions on the server --- plugins/warp/ui/shared/fetcher.cpp | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) (limited to 'plugins/warp/ui/shared/fetcher.cpp') diff --git a/plugins/warp/ui/shared/fetcher.cpp b/plugins/warp/ui/shared/fetcher.cpp index 51ab018c..2eab910a 100644 --- a/plugins/warp/ui/shared/fetcher.cpp +++ b/plugins/warp/ui/shared/fetcher.cpp @@ -63,22 +63,40 @@ void WarpFetcher::FetchPendingFunctions(const std::vector& allo // Because we must fetch for a single target we map the function guids to the associated platform to perform fetches // for each. - std::map> platformMappedGuids; + std::map> platformMappedGuidSet; + std::map> platformMappedConstraintSet; for (const auto& func : requests) { - const auto guid = Warp::GetAnalysisFunctionGUID(*func); - if (!guid.has_value()) + const auto warpFunc = Warp::Function::Get(*func); + if (!warpFunc) continue; auto platform = func->GetPlatform(); - platformMappedGuids[platform].push_back(guid.value()); + platformMappedGuidSet[platform].insert(warpFunc->GetGUID()); + + // We want to keep track of the guids so we can constrain the server response to only return functions with any of them. + const auto constraints = warpFunc->GetConstraints(); + std::vector constraintGuids; + constraintGuids.reserve(constraints.size()); + for (const auto& constraint : constraints) + constraintGuids.push_back(constraint.guid); + platformMappedConstraintSet[platform].insert(constraintGuids.begin(), constraintGuids.end()); } + std::map> platformMappedGuids; + for (const auto& [platform, guids] : platformMappedGuidSet) + platformMappedGuids[platform] = std::vector(guids.begin(), guids.end()); + + // We keep them in the set above so we don't duplicate a bunch for functions with the same set of constraint guids. + std::map> platformMappedConstraints; + for (const auto& [platform, guids] : platformMappedConstraintSet) + platformMappedConstraints[platform] = std::vector(guids.begin(), guids.end()); + for (const auto& [platform, guids] : platformMappedGuids) { m_logger->LogDebugF("Fetching {} functions for platform {}", guids.size(), platform->GetName()); auto target = Warp::Target::FromPlatform(*platform); for (const auto& container : Warp::Container::All()) - container->FetchFunctions(*target, guids, allowedTags); + container->FetchFunctions(*target, guids, allowedTags, platformMappedConstraints[platform]); std::lock_guard lock(m_requestMutex); for (const auto& guid : guids) -- cgit v1.3.1