diff options
| author | Mason Reed <mason@vector35.com> | 2026-03-03 07:57:33 -0800 |
|---|---|---|
| committer | Mason Reed <35282038+emesare@users.noreply.github.com> | 2026-03-24 18:46:48 -0700 |
| commit | 2c358e705bbde855b12780be86ef19501a62dfed (patch) | |
| tree | 4f3012bdf36c9a0f7de4218790e6e1aa389621ba /plugins/warp/ui/shared/fetcher.cpp | |
| parent | 7877f7caa3535a7c477c911ddeafdf5bb14ebc14 (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.cpp | 28 |
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) |
