Skip to main content

dash_platform_queries/documents/
document_split_averages.rs

1//! `FromProof` + `Fetch` for [`DocumentSplitAverages`] — the
2//! per-group-entry view of the unified `getDocuments` endpoint
3//! for average queries.
4//!
5//! Average-side analog of [`super::document_split_sums`]. Returns
6//! the full `entries` list keyed by the splitting property's
7//! serialized value; aggregate averages use
8//! [`super::document_average::DocumentAverage`] instead.
9//!
10//! Per-shape proof dispatch lives in
11//! [`super::average_proof_helpers::verify_average_query`] — this
12//! impl passes the verified entries through unchanged, mapping
13//! `AverageEntry` to `SplitAverageEntry`.
14
15use crate::documents::average_proof_helpers::{
16    assert_select_is_avg, check_average_request, verify_average_query,
17};
18use crate::documents::document_query::DocumentQuery;
19use dapi_grpc::platform::v0::{GetDocumentsResponse, Proof, ResponseMetadata};
20use dash_context_provider::ContextProvider;
21use dpp::dashcore::Network;
22use dpp::version::PlatformVersion;
23use drive_proof_verifier::{DocumentSplitAverages, FromProof, SplitAverageEntry};
24
25impl FromProof<DocumentQuery> for DocumentSplitAverages {
26    type Request = DocumentQuery;
27    type Response = GetDocumentsResponse;
28
29    fn check_request(
30        request: &Self::Request,
31        platform_version: &PlatformVersion,
32    ) -> Result<(), drive_proof_verifier::Error> {
33        check_average_request(request, false, platform_version)
34    }
35
36    fn maybe_from_proof_with_metadata<'a, I: Into<Self::Request>, O: Into<Self::Response>>(
37        request: I,
38        response: O,
39        _network: Network,
40        platform_version: &PlatformVersion,
41        provider: &'a dyn ContextProvider,
42    ) -> Result<(Option<Self>, ResponseMetadata, Proof), drive_proof_verifier::Error>
43    where
44        Self: 'a,
45    {
46        let request: Self::Request = request.into();
47        assert_select_is_avg(&request)?;
48        let response: Self::Response = response.into();
49        let (entries, mtd, proof) =
50            verify_average_query(request, response, false, platform_version, provider)?;
51        let split = entries.map(|es| {
52            DocumentSplitAverages(
53                es.into_iter()
54                    .map(|e| SplitAverageEntry {
55                        in_key: e.in_key,
56                        key: e.key,
57                        count: e.count,
58                        sum: e.sum,
59                    })
60                    .collect(),
61            )
62        });
63        Ok((split, mtd, proof))
64    }
65}