Skip to content
Open
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
//! server derives the outer by-ids query from the inner results, and the
//! verifier re-derives it from the PROVEN inner results, so the join can
//! never be steered by the responding node. See
//! `drive::query::drive_chained_document_query` for the trust model.
//! `drive::query::chained_document_query` for the trust model.

use crate::documents::document_query::DocumentQuery;
use crate::error::Error;
Expand All @@ -20,7 +20,6 @@ use dpp::dashcore::Network;
use dpp::data_contract::accessors::v0::DataContractV0Getters;
use dpp::version::{PlatformVersion, TryFromPlatformVersioned};
use dpp::ProtocolError;
use drive::query::drive_chained_document_query::DriveChainedDocumentQuery;
use drive::query::DriveDocumentQuery;
use drive_proof_verifier::{
verify_chained_documents_tenderdash_proof, ChainedDocuments, FromProof,
Expand Down Expand Up @@ -122,7 +121,7 @@ impl TryFromPlatformVersioned<ChainedDocumentQuery> for GetDocumentsRequest {
}
}

impl<'a> TryFrom<&'a ChainedDocumentQuery> for DriveChainedDocumentQuery<'a> {
impl<'a> TryFrom<&'a ChainedDocumentQuery> for DriveDocumentQuery<'a> {
type Error = Error;

fn try_from(request: &'a ChainedDocumentQuery) -> Result<Self, Self::Error> {
Expand All @@ -132,11 +131,7 @@ impl<'a> TryFrom<&'a ChainedDocumentQuery> for DriveChainedDocumentQuery<'a> {
.data_contract
.document_type_for_name(&request.outer_document_type_name)
.map_err(|e| Error::Protocol(ProtocolError::DataContractError(e)))?;
Ok(DriveChainedDocumentQuery {
inner,
join_property: request.join_property.clone(),
outer_document_type,
})
Ok(inner.with_by_id_join(request.join_property.clone(), outer_document_type))
}
}

Expand All @@ -157,7 +152,7 @@ impl FromProof<ChainedDocumentQuery> for ChainedDocuments {
let request: Self::Request = request.into();
let response: Self::Response = response.into();

let query: DriveChainedDocumentQuery = (&request).try_into().map_err(|e: Error| {
let query: DriveDocumentQuery = (&request).try_into().map_err(|e: Error| {
drive_proof_verifier::Error::RequestError {
error: e.to_string(),
}
Expand Down Expand Up @@ -276,13 +271,20 @@ mod tests {
#[test]
fn converts_to_a_valid_drive_query() {
let query = posts_i_liked(10);
let drive_query: DriveChainedDocumentQuery =
let drive_query: DriveDocumentQuery =
(&query).try_into().expect("converts to a drive query");
drive_query
.validate(platform_version())
.validate_chained(platform_version())
.expect("the byLiker shape validates");
assert_eq!(drive_query.join_property, "postId");
assert_eq!(drive_query.inner.limit, Some(10));
assert_eq!(
drive_query.sub_queries[0]
.binding
.as_ref()
.expect("the join is bound")
.source_property,
"postId"
);
assert_eq!(drive_query.limit, Some(10));
}

#[test]
Expand All @@ -294,9 +296,9 @@ mod tests {
"hashtag",
"post",
);
let drive_query: DriveChainedDocumentQuery =
let drive_query: DriveDocumentQuery =
(&query).try_into().expect("conversion itself succeeds");
let refused = drive_query.validate(platform_version());
let refused = drive_query.validate_chained(platform_version());
assert!(
refused.is_err(),
"a non-refersTo join property must fail validation"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1155,6 +1155,9 @@ impl<'a> TryFrom<&'a DocumentQuery> for DriveDocumentQuery<'a> {
// selections assign the fields they resolved onto the returned
// query; everything else is a raw query.
resolved_time_ranges: vec![],
// Composite sub-queries have no wire format yet: a query
// parsed from a request is always a plain page.
sub_queries: vec![],
};

Ok(query)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ impl<C> Platform<C> {
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

// todo: deal with cost of this operation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,7 @@ pub(super) fn create_domain_data_trigger_v0(
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

// todo: deal with cost of this operation
Expand Down Expand Up @@ -341,6 +342,7 @@ pub(super) fn create_domain_data_trigger_v0(
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

// todo: deal with cost of this operation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,7 @@ pub(super) fn create_domain_data_trigger_v1(
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

// Diff vs `_v0` (parent-domain query):
Expand Down Expand Up @@ -356,6 +357,7 @@ pub(super) fn create_domain_data_trigger_v1(
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

// Diff vs `_v0` (preorder query): same change as above. `_v0`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ pub(super) fn delete_withdrawal_data_trigger_v0(
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

// todo: deal with cost of this operation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ pub(super) fn delete_withdrawal_data_trigger_v1(
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

// Diff vs `_v0` (withdrawal-document lookup):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ fn fetch_documents_for_transitions_knowing_contract_and_document_type_v0(
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

// todo: deal with cost of this operation
Expand Down Expand Up @@ -184,6 +185,7 @@ fn fetch_documents_for_transitions_knowing_contract_and_document_type_v1(
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

// Diff vs `_v0`: epoch is `Some(...)` and the cost is billed via
Expand Down Expand Up @@ -310,6 +312,7 @@ fn fetch_document_with_id_v0(
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

// todo: deal with cost of this operation
Expand Down Expand Up @@ -373,6 +376,7 @@ fn fetch_document_with_id_v1(
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

// Diff vs `_v0`: epoch is `Some(...)` and the cost is billed via
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -457,6 +457,7 @@ mod dpns_tests {
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

let documents = platform
Expand Down Expand Up @@ -505,6 +506,7 @@ mod dpns_tests {
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

let documents = platform
Expand Down Expand Up @@ -914,6 +916,7 @@ mod dpns_tests {
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

let documents = platform
Expand Down Expand Up @@ -949,6 +952,7 @@ mod dpns_tests {
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

let documents = platform
Expand Down Expand Up @@ -1183,6 +1187,7 @@ mod dpns_username_transfer_tests {
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

platform
Expand Down Expand Up @@ -1435,6 +1440,7 @@ mod dpns_username_transfer_tests {
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

platform
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2601,6 +2601,7 @@ mod tests {
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};
query.internal_clauses.equal_clauses.insert(
"contractId".to_string(),
Expand Down Expand Up @@ -2984,6 +2985,7 @@ mod tests {
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};
query.internal_clauses.equal_clauses.insert(
"contractId".to_string(),
Expand Down
8 changes: 8 additions & 0 deletions packages/rs-drive-abci/src/query/document_query/v0/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -655,6 +655,7 @@ mod tests {
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

let request = GetDocumentsRequestV0 {
Expand Down Expand Up @@ -729,6 +730,7 @@ mod tests {
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

let request = GetDocumentsRequestV0 {
Expand Down Expand Up @@ -815,6 +817,7 @@ mod tests {
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

let request = GetDocumentsRequestV0 {
Expand Down Expand Up @@ -988,6 +991,7 @@ mod tests {
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

let where_clauses = serialize_vec_to_cbor(
Expand Down Expand Up @@ -1156,6 +1160,7 @@ mod tests {
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

let where_clauses = serialize_vec_to_cbor(
Expand Down Expand Up @@ -1312,6 +1317,7 @@ mod tests {
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

let mut where_clauses: Vec<_> = drive_document_query
Expand Down Expand Up @@ -1479,6 +1485,7 @@ mod tests {
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

let mut where_clauses: Vec<_> = drive_document_query
Expand Down Expand Up @@ -1663,6 +1670,7 @@ mod tests {
start_at_included: false,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};

let mut where_clauses: Vec<_> = drive_document_query
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ use dpp::document::serialization_traits::DocumentPlatformConversionMethodsV0;
use dpp::validation::ValidationResult;
use dpp::version::PlatformVersion;
use drive::error::query::QuerySyntaxError;
use drive::query::drive_chained_document_query::DriveChainedDocumentQuery;
use drive::query::DriveDocumentQuery;
use drive::util::grove_operations::GroveDBToUse;

Expand Down Expand Up @@ -160,14 +159,10 @@ impl<C> Platform<C> {
platform_version,
));

let chained_query = DriveChainedDocumentQuery {
inner: inner_query,
join_property: chained.join_property,
outer_document_type: outer_type,
};
let chained_query = inner_query.with_by_id_join(chained.join_property, outer_type);
// Fail the shape checks as query errors (client-attributable),
// before any execution.
match chained_query.validate(platform_version) {
match chained_query.validate_chained(platform_version) {
Ok(()) => {}
Err(drive::error::Error::Query(query_error)) => {
return Ok(QueryValidationResult::new_with_error(QueryError::Query(
Expand Down Expand Up @@ -231,14 +226,9 @@ impl<C> Platform<C> {
})
.collect()
};
let inner_documents = serialize_all(
&outcome.result.inner_documents,
chained_query.inner.document_type,
)?;
let outer_documents = serialize_all(
&outcome.result.outer_documents,
chained_query.outer_document_type,
)?;
let inner_documents =
serialize_all(&outcome.result.inner_documents, chained_query.document_type)?;
let outer_documents = serialize_all(&outcome.result.outer_documents, outer_type)?;

GetDocumentsResponseV1 {
result: Some(get_documents_response_v1::Result::Data(ResultData {
Expand Down Expand Up @@ -437,14 +427,14 @@ mod tests {
start_at_included: true,
block_time_ms: None,
resolved_time_ranges: vec![],
sub_queries: vec![],
};
let chained = DriveChainedDocumentQuery {
inner,
join_property: "postId".to_string(),
outer_document_type: contract
let chained = inner.with_by_id_join(
"postId",
contract
.document_type_for_name("post")
.expect("post doctype"),
};
);
let (_root_hash, verified) = chained
.verify_chained_documents_proof(proof.grovedb_proof.as_slice(), version)
.expect("chained proof verifies — the proof alone carries everything");
Expand Down
Loading
Loading