Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add new types ExplainOptions, ExplainMetrics, PlanSummary, ExecutionStats #1241

Merged
merged 2 commits into from
Mar 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
19 changes: 19 additions & 0 deletions protos/google/datastore/v1/datastore.proto
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import "google/api/routing.proto";
import "google/datastore/v1/aggregation_result.proto";
import "google/datastore/v1/entity.proto";
import "google/datastore/v1/query.proto";
import "google/datastore/v1/query_profile.proto";
import "google/protobuf/timestamp.proto";

option csharp_namespace = "Google.Cloud.Datastore.V1";
Expand Down Expand Up @@ -232,6 +233,10 @@ message RunQueryRequest {
// The GQL query to run. This query must be a non-aggregation query.
GqlQuery gql_query = 7;
}

// Optional. Explain options for the query. If set, additional query
// statistics will be returned. If not, only query results will be returned.
ExplainOptions explain_options = 12 [(google.api.field_behavior) = OPTIONAL];
}

// The response for
Expand All @@ -251,6 +256,11 @@ message RunQueryResponse {
// was set in
// [RunQueryRequest.read_options][google.datastore.v1.RunQueryRequest.read_options].
bytes transaction = 5;

// Query explain metrics. This is only present when the
// [RunQueryRequest.explain_options][google.datastore.v1.RunQueryRequest.explain_options]
// is provided, and it is sent only once with the last response in the stream.
ExplainMetrics explain_metrics = 9;
}

// The request for
Expand Down Expand Up @@ -282,6 +292,10 @@ message RunAggregationQueryRequest {
// The GQL query to run. This query must be an aggregation query.
GqlQuery gql_query = 7;
}

// Optional. Explain options for the query. If set, additional query
// statistics will be returned. If not, only query results will be returned.
ExplainOptions explain_options = 11 [(google.api.field_behavior) = OPTIONAL];
}

// The response for
Expand All @@ -301,6 +315,11 @@ message RunAggregationQueryResponse {
// was set in
// [RunAggregationQueryRequest.read_options][google.datastore.v1.RunAggregationQueryRequest.read_options].
bytes transaction = 5;

// Query explain metrics. This is only present when the
// [RunAggregationQueryRequest.explain_options][google.datastore.v1.RunAggregationQueryRequest.explain_options]
// is provided, and it is sent only once with the last response in the stream.
ExplainMetrics explain_metrics = 9;
}

// The request for
Expand Down
90 changes: 53 additions & 37 deletions protos/google/datastore/v1/query_profile.proto
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ syntax = "proto3";

package google.datastore.v1;

import "google/api/field_behavior.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/struct.proto";

option csharp_namespace = "Google.Cloud.Datastore.V1";
Expand All @@ -28,48 +30,62 @@ option ruby_package = "Google::Cloud::Datastore::V1";

// Specification of the Datastore Query Profile fields.

// The mode in which the query request must be processed.
enum QueryMode {
// The default mode. Only the query results are returned.
NORMAL = 0;
// Explain options for the query.
message ExplainOptions {
// Optional. Whether to execute this query.
//
// When false (the default), the query will be planned, returning only
// metrics from the planning stages.
//
// When true, the query will be planned and executed, returning the full
// query results along with both planning and execution stage metrics.
bool analyze = 1 [(google.api.field_behavior) = OPTIONAL];
}

// This mode returns only the query plan, without any results or execution
// statistics information.
PLAN = 1;
// Explain metrics for the query.
message ExplainMetrics {
// Planning phase information for the query.
PlanSummary plan_summary = 1;

// This mode returns both the query plan and the execution statistics along
// with the results.
PROFILE = 2;
// Aggregated stats from the execution of the query. Only present when
// [ExplainOptions.analyze][google.datastore.v1.ExplainOptions.analyze] is set
// to true.
ExecutionStats execution_stats = 2;
}

// Plan for the query.
message QueryPlan {
// Planning phase information for the query. It will include:
//
// {
// "indexes_used": [
// {"query_scope": "Collection", "properties": "(foo ASC, __name__ ASC)"},
// {"query_scope": "Collection", "properties": "(bar ASC, __name__ ASC)"}
// ]
// }
google.protobuf.Struct plan_info = 1;
// Planning phase information for the query.
message PlanSummary {
// The indexes selected for the query. For example:
// [
// {"query_scope": "Collection", "properties": "(foo ASC, __name__ ASC)"},
// {"query_scope": "Collection", "properties": "(bar ASC, __name__ ASC)"}
// ]
repeated google.protobuf.Struct indexes_used = 1;
}

// Planning and execution statistics for the query.
message ResultSetStats {
// Plan for the query.
QueryPlan query_plan = 1;
// Execution statistics for the query.
message ExecutionStats {
// Total number of results returned, including documents, projections,
// aggregation results, keys.
int64 results_returned = 1;

// Aggregated statistics from the execution of the query.
//
// This will only be present when the request specifies `PROFILE` mode.
// For example, a query will return the statistics including:
//
// {
// "results_returned": "20",
// "documents_scanned": "20",
// "indexes_entries_scanned": "10050",
// "total_execution_time": "100.7 msecs"
// }
google.protobuf.Struct query_stats = 2;
// Total time to execute the query in the backend.
google.protobuf.Duration execution_duration = 3;

// Total billable read operations.
int64 read_operations = 4;

// Debugging statistics from the execution of the query. Note that the
// debugging stats are subject to change as Firestore evolves. It could
// include:
// {
// "indexes_entries_scanned": "1000",
// "documents_scanned": "20",
// "billing_details" : {
// "documents_billable": "20",
// "index_entries_billable": "1000",
// "min_query_cost": "0"
// }
// }
google.protobuf.Struct debug_stats = 5;
}