Skip to main content

drive/drive/document/query/query_chained_documents/v0/
mod.rs

1use crate::drive::Drive;
2use crate::error::Error;
3use crate::fees::op::LowLevelDriveOperation;
4use crate::query::{ChainedDocumentsResult, DriveDocumentQuery};
5use dpp::block::epoch::Epoch;
6use dpp::version::PlatformVersion;
7use grovedb::TransactionArg;
8
9/// The outcome of a chained document query: the materialized halves and
10/// the processing cost.
11#[derive(Debug, Default)]
12pub struct QueryChainedDocumentsOutcomeV0 {
13    /// The materialized inner projections and outer documents.
14    pub result: ChainedDocumentsResult,
15    /// The processing cost, when an epoch was given.
16    pub cost: u64,
17}
18
19impl Drive {
20    #[inline(always)]
21    pub(super) fn query_chained_documents_v0(
22        &self,
23        query: &DriveDocumentQuery,
24        epoch: Option<&Epoch>,
25        transaction: TransactionArg,
26        platform_version: &PlatformVersion,
27    ) -> Result<QueryChainedDocumentsOutcomeV0, Error> {
28        let mut drive_operations: Vec<LowLevelDriveOperation> = vec![];
29        let result = query.execute_chained_no_proof_internal(
30            self,
31            transaction,
32            &mut drive_operations,
33            platform_version,
34        )?;
35        let cost = if let Some(epoch) = epoch {
36            Drive::calculate_fee(
37                None,
38                Some(drive_operations),
39                epoch,
40                self.config.epochs_per_era,
41                platform_version,
42                None,
43            )?
44            .processing_fee
45        } else {
46            0
47        };
48        Ok(QueryChainedDocumentsOutcomeV0 { result, cost })
49    }
50
51    #[inline(always)]
52    pub(super) fn query_chained_documents_with_proof_v0(
53        &self,
54        query: &DriveDocumentQuery,
55        platform_version: &PlatformVersion,
56    ) -> Result<(Vec<u8>, Vec<dpp::document::Document>), Error> {
57        let mut drive_operations: Vec<LowLevelDriveOperation> = vec![];
58        query.execute_chained_with_proof_internal(self, &mut drive_operations, platform_version)
59    }
60}