summaryrefslogtreecommitdiff
path: root/plugins/warp/ui/shared/fetcher.cpp
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2026-03-03 07:57:33 -0800
committerMason Reed <35282038+emesare@users.noreply.github.com>2026-03-24 18:46:48 -0700
commit2c358e705bbde855b12780be86ef19501a62dfed (patch)
tree4f3012bdf36c9a0f7de4218790e6e1aa389621ba /plugins/warp/ui/shared/fetcher.cpp
parent7877f7caa3535a7c477c911ddeafdf5bb14ebc14 (diff)
[WARP] Server-side constraint matching
Reduce networked functions by constraining on the returned set of functions on the server
Diffstat (limited to 'plugins/warp/ui/shared/fetcher.cpp')
-rw-r--r--plugins/warp/ui/shared/fetcher.cpp28
1 files changed, 23 insertions, 5 deletions
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<Warp::SourceTag>& 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<PlatformRef, std::vector<Warp::FunctionGUID>> platformMappedGuids;
+ std::map<PlatformRef, std::unordered_set<Warp::FunctionGUID>> platformMappedGuidSet;
+ std::map<PlatformRef, std::unordered_set<Warp::ConstraintGUID>> 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<Warp::ConstraintGUID> constraintGuids;
+ constraintGuids.reserve(constraints.size());
+ for (const auto& constraint : constraints)
+ constraintGuids.push_back(constraint.guid);
+ platformMappedConstraintSet[platform].insert(constraintGuids.begin(), constraintGuids.end());
}
+ std::map<PlatformRef, std::vector<Warp::FunctionGUID>> 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<PlatformRef, std::vector<Warp::ConstraintGUID>> 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<std::mutex> lock(m_requestMutex);
for (const auto& guid : guids)