534 lines
13 KiB
Protocol Buffer
534 lines
13 KiB
Protocol Buffer
syntax = "proto3";
|
|
|
|
package komp_ac.analytics;
|
|
|
|
import "table_definition.proto";
|
|
|
|
import "google/protobuf/struct.proto";
|
|
|
|
// Runs read-only analytical SQL over runtime-defined profile tables.
|
|
// Public SQL uses table and column aliases; physical ordinal column names are
|
|
// resolved inside the server and are never exposed by this API.
|
|
service AnalyticsService {
|
|
// Lists the alias-visible analytical tables for one profile.
|
|
rpc GetAnalyticsCatalog(GetAnalyticsCatalogRequest) returns (GetAnalyticsCatalogResponse);
|
|
|
|
// Executes one read-only SELECT query and streams typed result batches.
|
|
rpc ExecuteAnalyticsQuery(ExecuteAnalyticsQueryRequest) returns (stream AnalyticsResultBatch);
|
|
}
|
|
|
|
message GetAnalyticsCatalogRequest {
|
|
// Required PostgreSQL profile/schema name.
|
|
string profile_name = 1;
|
|
}
|
|
|
|
message GetAnalyticsCatalogResponse {
|
|
string profile_name = 1;
|
|
repeated AnalyticsTable tables = 2;
|
|
}
|
|
|
|
message AnalyticsTable {
|
|
int64 table_definition_id = 1;
|
|
string name = 2;
|
|
repeated AnalyticsCatalogColumn columns = 3;
|
|
repeated AnalyticsTableLink links = 4;
|
|
}
|
|
|
|
message AnalyticsCatalogColumn {
|
|
// Current public alias. Physical ordinal names are intentionally omitted.
|
|
string name = 1;
|
|
string field_type = 2;
|
|
bool is_system = 3;
|
|
komp_ac.table_definition.MoneyRounding rounding = 4;
|
|
// Canonical ISO-4217 code for MONEY; empty for every other type.
|
|
string currency = 5;
|
|
}
|
|
|
|
message AnalyticsTableLink {
|
|
// Public foreign-key column on the source table, e.g. department_id.
|
|
string source_column = 1;
|
|
string linked_table = 2;
|
|
bool required = 3;
|
|
}
|
|
|
|
message ExecuteAnalyticsQueryRequest {
|
|
// Required profile whose tables form the query's complete visible catalog.
|
|
string profile_name = 1;
|
|
|
|
// Exactly one read-only SELECT query. Table and column names are public aliases.
|
|
string sql = 2;
|
|
|
|
// Result cap. Zero uses the server default; the server maximum still applies.
|
|
uint32 max_rows = 3;
|
|
}
|
|
|
|
message AnalyticsResultColumn {
|
|
string name = 1;
|
|
string data_type = 2;
|
|
}
|
|
|
|
message AnalyticsValue {
|
|
oneof kind {
|
|
google.protobuf.NullValue null_value = 1;
|
|
bool bool_value = 2;
|
|
int64 int64_value = 3;
|
|
uint64 uint64_value = 4;
|
|
double double_value = 5;
|
|
string string_value = 6;
|
|
bytes bytes_value = 7;
|
|
}
|
|
}
|
|
|
|
message AnalyticsResultRow {
|
|
repeated AnalyticsValue values = 1;
|
|
}
|
|
|
|
message AnalyticsResultBatch {
|
|
// Present on the first batch and omitted from later data batches.
|
|
repeated AnalyticsResultColumn columns = 1;
|
|
repeated AnalyticsResultRow rows = 2;
|
|
|
|
// The final message contains no rows and carries completion metadata.
|
|
bool is_final = 3;
|
|
bool truncated = 4;
|
|
uint64 row_count = 5;
|
|
uint64 elapsed_ms = 6;
|
|
}
|
|
|
|
service ReportingService {
|
|
rpc ListAssets(ListReportAssetsRequest) returns (ListReportAssetsResponse);
|
|
rpc GetAsset(GetReportAssetRequest) returns (ReportAsset);
|
|
rpc SaveDraft(SaveReportDraftRequest) returns (ReportAsset);
|
|
rpc Validate(ValidateReportRequest) returns (ReportAsset);
|
|
rpc Publish(PublishReportRequest) returns (ReportAsset);
|
|
rpc ListVersions(ReportAssetRef) returns (ListReportVersionsResponse);
|
|
rpc RestoreDraft(RestoreReportDraftRequest) returns (ReportAsset);
|
|
rpc SetArchived(SetReportArchivedRequest) returns (ReportAsset);
|
|
rpc ExecuteDataset(ExecuteReportDatasetRequest) returns (stream AnalyticsResultBatch);
|
|
rpc GetPersonalViews(ReportAssetRef) returns (GetReportPersonalViewsResponse);
|
|
rpc SavePersonalView(SaveReportPersonalViewRequest) returns (ReportPersonalView);
|
|
rpc DeletePersonalView(DeleteReportPersonalViewRequest) returns (ReportMutationResult);
|
|
}
|
|
|
|
enum ReportAssetKind {
|
|
REPORT_ASSET_KIND_UNSPECIFIED = 0;
|
|
REPORT_ASSET_KIND_DATASET = 1;
|
|
REPORT_ASSET_KIND_DASHBOARD = 2;
|
|
}
|
|
|
|
enum ReportReadMode {
|
|
REPORT_READ_MODE_UNSPECIFIED = 0;
|
|
REPORT_READ_MODE_PUBLISHED = 1;
|
|
REPORT_READ_MODE_DRAFT = 2;
|
|
REPORT_READ_MODE_VERSION = 3;
|
|
}
|
|
|
|
enum ReportDataType {
|
|
REPORT_DATA_TYPE_UNSPECIFIED = 0;
|
|
REPORT_DATA_TYPE_TEXT = 1;
|
|
REPORT_DATA_TYPE_INTEGER = 2;
|
|
REPORT_DATA_TYPE_DECIMAL = 3;
|
|
REPORT_DATA_TYPE_DATE = 4;
|
|
REPORT_DATA_TYPE_TIMESTAMP = 5;
|
|
REPORT_DATA_TYPE_BOOLEAN = 6;
|
|
}
|
|
|
|
enum ReportFilterControl {
|
|
REPORT_FILTER_CONTROL_UNSPECIFIED = 0;
|
|
REPORT_FILTER_CONTROL_TEXT = 1;
|
|
REPORT_FILTER_CONTROL_NUMBER = 2;
|
|
REPORT_FILTER_CONTROL_DATE = 3;
|
|
REPORT_FILTER_CONTROL_TIMESTAMP = 4;
|
|
REPORT_FILTER_CONTROL_SELECT = 5;
|
|
REPORT_FILTER_CONTROL_MULTISELECT = 6;
|
|
REPORT_FILTER_CONTROL_CHECKBOX = 7;
|
|
}
|
|
|
|
enum ReportDefaultKind {
|
|
REPORT_DEFAULT_KIND_UNSPECIFIED = 0;
|
|
REPORT_DEFAULT_KIND_LITERAL = 1;
|
|
REPORT_DEFAULT_KIND_TODAY = 2;
|
|
REPORT_DEFAULT_KIND_MONTH_START = 3;
|
|
REPORT_DEFAULT_KIND_YEAR_START = 4;
|
|
}
|
|
|
|
enum ReportNumberFormat {
|
|
REPORT_NUMBER_FORMAT_UNSPECIFIED = 0;
|
|
REPORT_NUMBER_FORMAT_NUMBER = 1;
|
|
REPORT_NUMBER_FORMAT_CURRENCY = 2;
|
|
REPORT_NUMBER_FORMAT_PERCENT = 3;
|
|
REPORT_NUMBER_FORMAT_COMPACT = 4;
|
|
}
|
|
|
|
enum ReportPanelKind {
|
|
REPORT_PANEL_KIND_UNSPECIFIED = 0;
|
|
REPORT_PANEL_KIND_BAR = 1;
|
|
REPORT_PANEL_KIND_LINE = 2;
|
|
REPORT_PANEL_KIND_AREA = 3;
|
|
REPORT_PANEL_KIND_PIE = 4;
|
|
REPORT_PANEL_KIND_DONUT = 5;
|
|
REPORT_PANEL_KIND_SCATTER = 6;
|
|
REPORT_PANEL_KIND_HEATMAP = 7;
|
|
REPORT_PANEL_KIND_TREEMAP = 8;
|
|
REPORT_PANEL_KIND_FUNNEL = 9;
|
|
REPORT_PANEL_KIND_GAUGE = 10;
|
|
REPORT_PANEL_KIND_WATERFALL = 11;
|
|
REPORT_PANEL_KIND_TABLE = 12;
|
|
REPORT_PANEL_KIND_KPI = 13;
|
|
}
|
|
|
|
enum ReportOrientation {
|
|
REPORT_ORIENTATION_UNSPECIFIED = 0;
|
|
REPORT_ORIENTATION_VERTICAL = 1;
|
|
REPORT_ORIENTATION_HORIZONTAL = 2;
|
|
}
|
|
|
|
enum ReportSortOrder {
|
|
REPORT_SORT_ORDER_UNSPECIFIED = 0;
|
|
REPORT_SORT_ORDER_SOURCE = 1;
|
|
REPORT_SORT_ORDER_ASCENDING = 2;
|
|
REPORT_SORT_ORDER_DESCENDING = 3;
|
|
}
|
|
|
|
enum ReportNullPolicy {
|
|
REPORT_NULL_POLICY_UNSPECIFIED = 0;
|
|
REPORT_NULL_POLICY_GAP = 1;
|
|
REPORT_NULL_POLICY_ZERO = 2;
|
|
}
|
|
|
|
enum ReportCapability {
|
|
REPORT_CAPABILITY_UNSPECIFIED = 0;
|
|
REPORT_CAPABILITY_VIEW = 1;
|
|
REPORT_CAPABILITY_FILTER = 2;
|
|
REPORT_CAPABILITY_DRILL = 3;
|
|
REPORT_CAPABILITY_EXPORT = 4;
|
|
REPORT_CAPABILITY_CUSTOMIZE = 5;
|
|
}
|
|
|
|
enum ReportExecutionPurpose {
|
|
REPORT_EXECUTION_PURPOSE_UNSPECIFIED = 0;
|
|
REPORT_EXECUTION_PURPOSE_VIEW = 1;
|
|
REPORT_EXECUTION_PURPOSE_PREVIEW = 2;
|
|
REPORT_EXECUTION_PURPOSE_EXPORT = 3;
|
|
REPORT_EXECUTION_PURPOSE_DRILL = 4;
|
|
}
|
|
|
|
message ReportScalar {
|
|
oneof value {
|
|
google.protobuf.NullValue null_value = 1;
|
|
string text = 2;
|
|
string integer = 3;
|
|
string decimal = 4;
|
|
string date = 5;
|
|
string timestamp = 6;
|
|
bool boolean = 7;
|
|
}
|
|
}
|
|
|
|
message ReportParameterChoice {
|
|
string label = 1;
|
|
ReportScalar value = 2;
|
|
}
|
|
|
|
message ReportParameterLookup {
|
|
string dataset_id = 1;
|
|
string value_field = 2;
|
|
string label_field = 3;
|
|
}
|
|
|
|
message ReportParameter {
|
|
string key = 1;
|
|
string label = 2;
|
|
ReportDataType data_type = 3;
|
|
ReportFilterControl control = 4;
|
|
bool required = 5;
|
|
bool multiple = 6;
|
|
repeated ReportScalar default_values = 7;
|
|
ReportDefaultKind default_kind = 8;
|
|
repeated ReportParameterChoice choices = 9;
|
|
ReportParameterLookup lookup = 10;
|
|
}
|
|
|
|
message ReportParameterBinding {
|
|
string key = 1;
|
|
repeated ReportScalar values = 2;
|
|
}
|
|
|
|
message ReportDatasetColumn {
|
|
string key = 1;
|
|
string label = 2;
|
|
ReportDataType data_type = 3;
|
|
ReportNumberFormat number_format = 4;
|
|
string currency = 5;
|
|
string currency_field = 6;
|
|
optional uint32 fraction_digits = 7;
|
|
}
|
|
|
|
message ReportDatasetDefinition {
|
|
string title = 1;
|
|
string description = 2;
|
|
// Parameters use named DataFusion placeholders, for example CAST($from AS DATE).
|
|
string sql = 3;
|
|
repeated ReportParameter parameters = 4;
|
|
repeated ReportDatasetColumn columns = 5;
|
|
uint32 max_rows = 6;
|
|
}
|
|
|
|
message ReportFilterTarget {
|
|
string dataset_id = 1;
|
|
string parameter_key = 2;
|
|
}
|
|
|
|
message ReportDashboardFilter {
|
|
ReportParameter parameter = 1;
|
|
repeated ReportFilterTarget targets = 2;
|
|
bool primary = 3;
|
|
}
|
|
|
|
enum ReportPeriodBoundary {
|
|
REPORT_PERIOD_BOUNDARY_UNSPECIFIED = 0;
|
|
REPORT_PERIOD_BOUNDARY_INCLUSIVE = 1;
|
|
REPORT_PERIOD_BOUNDARY_EXCLUSIVE = 2;
|
|
}
|
|
|
|
message ReportDateRange {
|
|
string start_filter = 1;
|
|
string end_filter = 2;
|
|
ReportPeriodBoundary end_boundary = 3;
|
|
}
|
|
|
|
message ReportPeriod {
|
|
string date_basis = 1;
|
|
oneof selection {
|
|
ReportDateRange date_range = 2;
|
|
string accounting_period_filter = 3;
|
|
string as_of_filter = 4;
|
|
}
|
|
}
|
|
|
|
message ReportActionBinding {
|
|
string filter_key = 1;
|
|
string column_key = 2;
|
|
}
|
|
|
|
message ReportFilterAction {
|
|
repeated ReportActionBinding bindings = 1;
|
|
}
|
|
|
|
message ReportRecordAction {
|
|
string table_name = 1;
|
|
string id_field = 2;
|
|
}
|
|
|
|
message ReportDashboardAction {
|
|
string dashboard_id = 1;
|
|
repeated ReportActionBinding bindings = 2;
|
|
}
|
|
|
|
message ReportPanelAction {
|
|
string label = 1;
|
|
oneof target {
|
|
ReportFilterAction filter = 2;
|
|
ReportRecordAction record = 3;
|
|
ReportDashboardAction dashboard = 4;
|
|
}
|
|
}
|
|
|
|
message ReportPanel {
|
|
string id = 1;
|
|
string title = 2;
|
|
string description = 3;
|
|
string dataset_id = 4;
|
|
ReportPanelKind kind = 5;
|
|
string x_field = 6;
|
|
repeated string y_fields = 7;
|
|
string series_field = 8;
|
|
string size_field = 9;
|
|
repeated string table_fields = 10;
|
|
ReportOrientation orientation = 11;
|
|
bool stacked = 12;
|
|
bool show_legend = 13;
|
|
bool show_labels = 14;
|
|
uint32 width = 15;
|
|
uint32 height = 16;
|
|
repeated string colors = 17;
|
|
ReportSortOrder sort_order = 18;
|
|
string sort_field = 19;
|
|
ReportNullPolicy null_policy = 20;
|
|
optional double axis_min = 21;
|
|
optional double axis_max = 22;
|
|
repeated ReportPanelAction actions = 23;
|
|
}
|
|
|
|
message ReportGrant {
|
|
oneof subject {
|
|
string role = 1;
|
|
string user_id = 2;
|
|
}
|
|
repeated ReportCapability capabilities = 3;
|
|
}
|
|
|
|
message ReportDashboardDefinition {
|
|
string title = 1;
|
|
string description = 2;
|
|
repeated ReportDashboardFilter filters = 3;
|
|
repeated ReportPanel panels = 4;
|
|
repeated ReportGrant grants = 5;
|
|
uint32 refresh_seconds = 6;
|
|
repeated ReportDatasetVersionRef dataset_versions = 7;
|
|
ReportPeriod period = 8;
|
|
// Queries owned by this report; keys are used by panels and filter targets.
|
|
repeated ReportQuery queries = 9;
|
|
}
|
|
|
|
message ReportQuery {
|
|
string key = 1;
|
|
ReportDatasetDefinition definition = 2;
|
|
}
|
|
|
|
message ReportDatasetVersionRef {
|
|
string dataset_id = 1;
|
|
// Zero selects the latest published dataset when the dashboard is published.
|
|
uint64 version = 2;
|
|
}
|
|
|
|
message ReportDefinition {
|
|
uint32 schema_version = 1;
|
|
oneof content {
|
|
ReportDatasetDefinition dataset = 2;
|
|
ReportDashboardDefinition dashboard = 3;
|
|
}
|
|
}
|
|
|
|
message ReportDatasetSnapshot {
|
|
string dataset_id = 1;
|
|
uint64 version = 2;
|
|
ReportDatasetDefinition definition = 3;
|
|
}
|
|
|
|
message ReportAssetRef {
|
|
string profile_name = 1;
|
|
string asset_id = 2;
|
|
}
|
|
|
|
message ReportAssetSummary {
|
|
string id = 1;
|
|
string title = 2;
|
|
string description = 3;
|
|
ReportAssetKind kind = 4;
|
|
uint64 draft_revision = 5;
|
|
uint64 published_version = 6;
|
|
bool archived = 7;
|
|
string updated_at = 8;
|
|
repeated ReportCapability capabilities = 9;
|
|
}
|
|
|
|
message ReportAsset {
|
|
ReportAssetSummary summary = 1;
|
|
ReportDefinition definition = 2;
|
|
repeated ReportDatasetSnapshot datasets = 3;
|
|
string profile_name = 4;
|
|
uint64 version = 5;
|
|
}
|
|
|
|
message ListReportAssetsRequest {
|
|
string profile_name = 1;
|
|
bool include_archived = 2;
|
|
}
|
|
|
|
message ListReportAssetsResponse {
|
|
repeated ReportAssetSummary assets = 1;
|
|
bool can_manage = 2;
|
|
}
|
|
|
|
message GetReportAssetRequest {
|
|
ReportAssetRef asset = 1;
|
|
ReportReadMode mode = 2;
|
|
uint64 version = 3;
|
|
}
|
|
|
|
message SaveReportDraftRequest {
|
|
ReportAssetRef asset = 1;
|
|
uint64 expected_revision = 2;
|
|
ReportDefinition definition = 3;
|
|
}
|
|
|
|
message ValidateReportRequest {
|
|
ReportAssetRef asset = 1;
|
|
uint64 expected_revision = 2;
|
|
}
|
|
|
|
message PublishReportRequest {
|
|
ReportAssetRef asset = 1;
|
|
uint64 expected_revision = 2;
|
|
}
|
|
|
|
message ReportVersionSummary {
|
|
uint64 version = 1;
|
|
string title = 2;
|
|
string created_at = 3;
|
|
string created_by = 4;
|
|
}
|
|
|
|
message ListReportVersionsResponse {
|
|
repeated ReportVersionSummary versions = 1;
|
|
}
|
|
|
|
message RestoreReportDraftRequest {
|
|
ReportAssetRef asset = 1;
|
|
uint64 expected_revision = 2;
|
|
uint64 version = 3;
|
|
}
|
|
|
|
message SetReportArchivedRequest {
|
|
ReportAssetRef asset = 1;
|
|
uint64 expected_revision = 2;
|
|
bool archived = 3;
|
|
}
|
|
|
|
message ExecuteReportDatasetRequest {
|
|
ReportAssetRef asset = 1;
|
|
// Published version for viewer requests; draft revision for previews.
|
|
uint64 version = 2;
|
|
string dataset_id = 3;
|
|
repeated ReportParameterBinding filters = 4;
|
|
ReportExecutionPurpose purpose = 5;
|
|
string panel_id = 6;
|
|
uint32 action_index = 7;
|
|
}
|
|
|
|
message ReportPanelPreference {
|
|
string panel_id = 1;
|
|
uint32 width = 2;
|
|
uint32 height = 3;
|
|
bool hidden = 4;
|
|
}
|
|
|
|
message ReportPersonalView {
|
|
string id = 1;
|
|
string title = 2;
|
|
uint64 report_version = 3;
|
|
repeated ReportParameterBinding filters = 4;
|
|
repeated ReportPanelPreference panels = 5;
|
|
uint64 revision = 6;
|
|
}
|
|
|
|
message GetReportPersonalViewsResponse {
|
|
repeated ReportPersonalView views = 1;
|
|
}
|
|
|
|
message SaveReportPersonalViewRequest {
|
|
ReportAssetRef asset = 1;
|
|
ReportPersonalView view = 2;
|
|
}
|
|
|
|
message DeleteReportPersonalViewRequest {
|
|
ReportAssetRef asset = 1;
|
|
string view_id = 2;
|
|
uint64 expected_revision = 3;
|
|
}
|
|
|
|
message ReportMutationResult {
|
|
bool success = 1;
|
|
}
|