Skip to content

draft APIs schema for async query execution #216

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

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all 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
10 changes: 10 additions & 0 deletions query-service-api/src/main/proto/query-service.proto
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,14 @@ import "response.proto";
service QueryService {
rpc execute (QueryRequest) returns (stream ResultSetChunk) {
}

rpc submitAsyncQuery (SubmitAsyncQueryRequest) returns (SubmitAsyncQueryResponse) {}

rpc submitAsyncGroupQuery (SubmitAsyncQueryGroupRequest) returns (SubmitAsyncQueryGroupResponse) {}

rpc getAsyncQueries (GetAsyncQueriesRequest) returns (GetAsyncQueriesResponse) {}

rpc getAsyncQueryResult (GetAsyncQueryResultRequest) returns (GetAsyncQueryResultResponse) {}

rpc getAsyncQueryGroupResult (GetAsyncQueryGroupResultRequest) returns (GetAsyncQueryGroupResultResponse) {}
}
39 changes: 39 additions & 0 deletions query-service-api/src/main/proto/request.proto
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,45 @@ message Expression {
AttributeExpression attribute_expression = 5;
}
}

message SubmitAsyncQueryRequest {
// TODO: verify if all fields of QueryRequest are applicable
QueryRequest query_request = 1;
}

message SubmitAsyncQueryGroupRequest {
// TODO: verify if all fields of QueryRequest are applicable
QueryRequest query_request = 1;
// If multiple async queries are a part of same group, UI can fire each async
// query separately. In this case, each request needs to contain group details
AsyncQueryGroupDetails group = 2;
}

message AsyncQueryGroupDetails {
// UUID created by UI
string group_id = 1;
// unique name for each query within group
string query_name = 2;
}

message GetAsyncQueriesRequest {
// Note that these filters are different than filters within QueryRequest.
// These are filters for async queries listing
// TODO: do we need to define a different filter message?
Filter filter = 1;
}

message GetAsyncQueryResultRequest {
string async_query_id = 1;
}

message GetAsyncQueryGroupResultRequest {
string async_query_id = 1;
// In case of group query, UI can ask for results of multiple queries that
// belong to the group (referenced by query_name within group)
repeated string query_names = 2;
}

message QueryRequest {

repeated string source = 1;
Expand Down
45 changes: 45 additions & 0 deletions query-service-api/src/main/proto/response.proto
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,52 @@ option java_outer_classname = "QueryResponseProto";
package org.hypertrace.core.query.service;

import "value.proto";
import "google/protobuf/timestamp.proto";

message SubmitAsyncQueryResponse {
AsyncQueryInfo query_info = 1;
}

message SubmitAsyncQueryGroupResponse {
// TODO: Reusing AsyncQueryInfo in case of query belonging to a group as well.
// The async_query_id will be at group level in this case.
AsyncQueryInfo query_info = 1;
}

message GetAsyncQueriesResponse {
repeated AsyncQueryInfo queries_info = 1;
}

message GetAsyncQueryResultResponse {
AsyncQueryResult query_result = 1;
}

message GetAsyncQueryGroupResultResponse {
// map of query_name and its result in case of group
map<string, AsyncQueryResult> group_result = 1;
}

message AsyncQueryResult {
// map of query_name and its result
ResultSetMetadata result_set_metadata = 1;
repeated Row row = 2;
}

message AsyncQueryInfo {
string async_query_id = 1;
AsyncQueryState state = 2;
google.protobuf.Timestamp created_timestamp = 3;
string author = 4;
}

enum AsyncQueryState {
ASYNC_QUERY_STATE_UNSPECIFIED = 0;

ASYNC_QUERY_STATE_IN_PROGRESS = 1;
ASYNC_QUERY_STATE_SUCCEEDED = 2;
ASYNC_QUERY_STATE_FAILED = 3;
// TODO: how to power partially completed status?
}
message ColumnMetadata {
string column_name = 1;
ValueType value_type = 2;
Expand Down