Skip to content
Draft
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 7 additions & 2 deletions packages/dapi-grpc/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -84,11 +84,13 @@ fn configure_platform(mut platform: MappingConfig) -> MappingConfig {
// Derive features for versioned messages
//
// "GetConsensusParamsRequest" is excluded as this message does not support proofs
const VERSIONED_REQUESTS: [&str; 56] = [
const VERSIONED_REQUESTS: [&str; 58] = [
"GetDataContractHistoryRequest",
"GetDataContractRequest",
"GetDataContractsRequest",
"GetDocumentsRequest",
"GetDocumentsCountRequest",
"GetDocumentsSplitCountRequest",
"GetIdentitiesByPublicKeyHashesRequest",
"GetIdentitiesRequest",
"GetIdentitiesBalancesRequest",
Expand Down Expand Up @@ -161,11 +163,13 @@ fn configure_platform(mut platform: MappingConfig) -> MappingConfig {
// - "GetIdentityByNonUniquePublicKeyHashResponse"
//
// "GetEvonodesProposedEpochBlocksResponse" is used for 2 Requests
const VERSIONED_RESPONSES: [&str; 54] = [
const VERSIONED_RESPONSES: [&str; 56] = [
"GetDataContractHistoryResponse",
"GetDataContractResponse",
"GetDataContractsResponse",
"GetDocumentsResponse",
"GetDocumentsCountResponse",
"GetDocumentsSplitCountResponse",
"GetIdentitiesByPublicKeyHashesResponse",
"GetIdentitiesResponse",
"GetIdentitiesBalancesResponse",
Expand Down Expand Up @@ -512,3 +516,4 @@ fn resolve_output_base() -> Result<PathBuf, String> {
"OUT_DIR should be provided by Cargo; set DAPI_GRPC_OUT_DIR to override it".to_string()
})
}
// Force rebuild
58 changes: 58 additions & 0 deletions packages/dapi-grpc/protos/platform/v0/platform.proto
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ service Platform {
rpc getDataContracts(GetDataContractsRequest)
returns (GetDataContractsResponse);
rpc getDocuments(GetDocumentsRequest) returns (GetDocumentsResponse);
rpc getDocumentsCount(GetDocumentsCountRequest)
returns (GetDocumentsCountResponse);
rpc getDocumentsSplitCount(GetDocumentsSplitCountRequest)
returns (GetDocumentsSplitCountResponse);
rpc getIdentityByPublicKeyHash(GetIdentityByPublicKeyHashRequest)
returns (GetIdentityByPublicKeyHashResponse);
rpc getIdentityByNonUniquePublicKeyHash(
Expand Down Expand Up @@ -611,6 +615,60 @@ message GetDocumentsResponse {
oneof version { GetDocumentsResponseV0 v0 = 1; }
}


message GetDocumentsCountRequest {
message GetDocumentsCountRequestV0 {
bytes data_contract_id = 1; // The ID of the data contract containing the documents
string document_type = 2; // The type of document being requested
bytes where = 3; // CBOR-encoded where clauses for filtering
bool prove = 4; // Flag to request a proof as the response
}
oneof version { GetDocumentsCountRequestV0 v0 = 1; }
}

message GetDocumentsCountResponse {
message GetDocumentsCountResponseV0 {
oneof result {
uint64 count = 1; // Total document count matching the query
Proof proof = 2; // Cryptographic proof, if requested
}
ResponseMetadata metadata = 3; // Metadata about the blockchain state
}
oneof version { GetDocumentsCountResponseV0 v0 = 1; }
}

message GetDocumentsSplitCountRequest {
message GetDocumentsSplitCountRequestV0 {
bytes data_contract_id = 1; // The ID of the data contract containing the documents
string document_type = 2; // The type of document being requested
bytes where = 3; // CBOR-encoded where clauses for filtering
string split_count_by_index_property = 4; // The index property to split counts by
bool prove = 5; // Flag to request a proof as the response
}
oneof version { GetDocumentsSplitCountRequestV0 v0 = 1; }
}

message GetDocumentsSplitCountResponse {
message GetDocumentsSplitCountResponseV0 {
// A single entry: the key value and how many documents match
message SplitCountEntry {
bytes key = 1; // The index property value
uint64 count = 2; // Number of documents with this key value
}

message SplitCounts {
repeated SplitCountEntry entries = 1;
}

oneof result {
SplitCounts split_counts = 1; // Per-key counts
Proof proof = 2; // Cryptographic proof, if requested
}
ResponseMetadata metadata = 3; // Metadata about the blockchain state
}
oneof version { GetDocumentsSplitCountResponseV0 v0 = 1; }
}

message GetIdentityByPublicKeyHashRequest {
message GetIdentityByPublicKeyHashRequestV0 {
bytes public_key_hash =
Expand Down
16 changes: 16 additions & 0 deletions packages/rs-dapi-client/src/transport/grpc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,22 @@ impl_transport_request_grpc!(
get_documents
);

impl_transport_request_grpc!(
platform_proto::GetDocumentsCountRequest,
platform_proto::GetDocumentsCountResponse,
PlatformGrpcClient,
RequestSettings::default(),
get_documents_count
);

impl_transport_request_grpc!(
platform_proto::GetDocumentsSplitCountRequest,
platform_proto::GetDocumentsSplitCountResponse,
PlatformGrpcClient,
RequestSettings::default(),
get_documents_split_count
);

impl_transport_request_grpc!(
platform_proto::GetDataContractRequest,
platform_proto::GetDataContractResponse,
Expand Down
12 changes: 12 additions & 0 deletions packages/rs-dapi/src/services/platform_service/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,18 @@ impl Platform for PlatformServiceImpl {
dapi_grpc::platform::v0::GetDocumentsResponse
);

drive_method!(
get_documents_count,
dapi_grpc::platform::v0::GetDocumentsCountRequest,
dapi_grpc::platform::v0::GetDocumentsCountResponse
);

drive_method!(
get_documents_split_count,
dapi_grpc::platform::v0::GetDocumentsSplitCountRequest,
dapi_grpc::platform::v0::GetDocumentsSplitCountResponse
);

// System methods
drive_method!(
get_consensus_params,
Expand Down
54 changes: 54 additions & 0 deletions packages/rs-drive-abci/src/query/document_count_query/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
use crate::error::query::QueryError;
use crate::error::Error;
use crate::platform_types::platform::Platform;
use crate::platform_types::platform_state::PlatformState;
use crate::query::QueryValidationResult;
use dapi_grpc::platform::v0::get_documents_count_request::Version as RequestVersion;
use dapi_grpc::platform::v0::get_documents_count_response::Version as ResponseVersion;
use dapi_grpc::platform::v0::{GetDocumentsCountRequest, GetDocumentsCountResponse};
use dpp::version::PlatformVersion;

mod v0;

impl<C> Platform<C> {
/// Querying of document count
pub fn query_documents_count(
&self,
GetDocumentsCountRequest { version }: GetDocumentsCountRequest,
platform_state: &PlatformState,
platform_version: &PlatformVersion,
) -> Result<QueryValidationResult<GetDocumentsCountResponse>, Error> {
let Some(version) = version else {
return Ok(QueryValidationResult::new_with_error(
QueryError::DecodingError("could not decode documents count query".to_string()),
));
};

let feature_version_bounds = &platform_version.drive_abci.query.document_count_query;

let feature_version = match &version {
RequestVersion::V0(_) => 0,
};
if !feature_version_bounds.check_version(feature_version) {
return Ok(QueryValidationResult::new_with_error(
QueryError::UnsupportedQueryVersion(
"documents_count".to_string(),
feature_version_bounds.min_version,
feature_version_bounds.max_version,
platform_version.protocol_version,
feature_version,
),
));
}
match version {
RequestVersion::V0(request_v0) => {
let result =
self.query_documents_count_v0(request_v0, platform_state, platform_version)?;

Ok(result.map(|response_v0| GetDocumentsCountResponse {
version: Some(ResponseVersion::V0(response_v0)),
}))
}
}
}
}
Loading
Loading