diff --git a/gooddata-api-client/.openapi-generator/FILES b/gooddata-api-client/.openapi-generator/FILES index ec000f44a..652143d3f 100644 --- a/gooddata-api-client/.openapi-generator/FILES +++ b/gooddata-api-client/.openapi-generator/FILES @@ -229,8 +229,10 @@ docs/EntityIdentifier.md docs/ExecutionLinks.md docs/ExecutionResponse.md docs/ExecutionResult.md +docs/ExecutionResultDataSourceMessage.md docs/ExecutionResultGrandTotal.md docs/ExecutionResultHeader.md +docs/ExecutionResultMetadata.md docs/ExecutionResultPaging.md docs/ExecutionSettings.md docs/ExportDefinitionsApi.md @@ -1242,8 +1244,10 @@ gooddata_api_client/model/entity_identifier.py gooddata_api_client/model/execution_links.py gooddata_api_client/model/execution_response.py gooddata_api_client/model/execution_result.py +gooddata_api_client/model/execution_result_data_source_message.py gooddata_api_client/model/execution_result_grand_total.py gooddata_api_client/model/execution_result_header.py +gooddata_api_client/model/execution_result_metadata.py gooddata_api_client/model/execution_result_paging.py gooddata_api_client/model/execution_settings.py gooddata_api_client/model/export_request.py diff --git a/gooddata-api-client/README.md b/gooddata-api-client/README.md index 6571c4925..8b90f32a9 100644 --- a/gooddata-api-client/README.md +++ b/gooddata-api-client/README.md @@ -1111,8 +1111,10 @@ Class | Method | HTTP request | Description - [ExecutionLinks](docs/ExecutionLinks.md) - [ExecutionResponse](docs/ExecutionResponse.md) - [ExecutionResult](docs/ExecutionResult.md) + - [ExecutionResultDataSourceMessage](docs/ExecutionResultDataSourceMessage.md) - [ExecutionResultGrandTotal](docs/ExecutionResultGrandTotal.md) - [ExecutionResultHeader](docs/ExecutionResultHeader.md) + - [ExecutionResultMetadata](docs/ExecutionResultMetadata.md) - [ExecutionResultPaging](docs/ExecutionResultPaging.md) - [ExecutionSettings](docs/ExecutionSettings.md) - [ExportRequest](docs/ExportRequest.md) diff --git a/gooddata-api-client/docs/ActionsApi.md b/gooddata-api-client/docs/ActionsApi.md index e321fd5ac..91eedea11 100644 --- a/gooddata-api-client/docs/ActionsApi.md +++ b/gooddata-api-client/docs/ActionsApi.md @@ -710,7 +710,7 @@ No authorization required Applies all the given cancel tokens. -Each cancel token corresponds to one unique execution request for the same result id. If all cancel tokens for the same result id are applied, the execution for this result id is canceled. +Each cancel token corresponds to one unique execution request for the same result id. If all cancel tokens for the same result id are applied, the execution for this result id is cancelled. ### Example @@ -774,7 +774,7 @@ No authorization required | Status code | Description | Response headers | |-------------|-------------|------------------| -**200** | Status of the cancelling operation. | - | +**200** | Status of the cancellation operation. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/gooddata-api-client/docs/DeclarativeWorkspaceDataFilter.md b/gooddata-api-client/docs/DeclarativeWorkspaceDataFilter.md index 5939192f6..dace32cdc 100644 --- a/gooddata-api-client/docs/DeclarativeWorkspaceDataFilter.md +++ b/gooddata-api-client/docs/DeclarativeWorkspaceDataFilter.md @@ -8,9 +8,9 @@ Name | Type | Description | Notes **column_name** | **str** | Workspace Data Filters column name. Data are filtered using this physical column. | **id** | **str** | Workspace Data Filters ID. This ID is further used to refer to this instance. | **title** | **str** | Workspace Data Filters title. | +**workspace** | [**WorkspaceIdentifier**](WorkspaceIdentifier.md) | | **workspace_data_filter_settings** | [**[DeclarativeWorkspaceDataFilterSetting]**](DeclarativeWorkspaceDataFilterSetting.md) | Filter settings specifying values of filters valid for the workspace. | **description** | **str** | Workspace Data Filters description. | [optional] -**workspace** | [**WorkspaceIdentifier**](WorkspaceIdentifier.md) | | [optional] **any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/gooddata-api-client/docs/ExecutionResult.md b/gooddata-api-client/docs/ExecutionResult.md index aa159c562..3e743f9d9 100644 --- a/gooddata-api-client/docs/ExecutionResult.md +++ b/gooddata-api-client/docs/ExecutionResult.md @@ -8,6 +8,7 @@ Name | Type | Description | Notes **data** | **[{str: (bool, date, datetime, dict, float, int, list, str, none_type)}]** | A multi-dimensional array of computed results. The most common one being a 2-dimensional array. The arrays can be composed of Double or null values. | **dimension_headers** | [**[DimensionHeader]**](DimensionHeader.md) | An array containing dimension headers. The size of the array corresponds to the number of dimensions. Their order corresponds to the dimension order in the execution result spec. | **grand_totals** | [**[ExecutionResultGrandTotal]**](ExecutionResultGrandTotal.md) | | +**metadata** | [**ExecutionResultMetadata**](ExecutionResultMetadata.md) | | **paging** | [**ExecutionResultPaging**](ExecutionResultPaging.md) | | **any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional] diff --git a/gooddata-api-client/docs/ExecutionResultDataSourceMessage.md b/gooddata-api-client/docs/ExecutionResultDataSourceMessage.md new file mode 100644 index 000000000..96eec784f --- /dev/null +++ b/gooddata-api-client/docs/ExecutionResultDataSourceMessage.md @@ -0,0 +1,16 @@ +# ExecutionResultDataSourceMessage + +A piece of extra information related to the results (e.g. debug information, warnings, etc.). + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**correlation_id** | **str** | Id correlating different pieces of supplementary info together. | +**source** | **str** | Information about what part of the system created this piece of supplementary info. | +**type** | **str** | Type of the supplementary info instance. There are currently no well-known values for this, but there might be some in the future. | +**data** | **{str: (bool, date, datetime, dict, float, int, list, str, none_type)}** | Data of this particular supplementary info item: a free-form JSON specific to the particular supplementary info item type. | [optional] +**any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/gooddata-api-client/docs/ExecutionResultMetadata.md b/gooddata-api-client/docs/ExecutionResultMetadata.md new file mode 100644 index 000000000..feef9ca88 --- /dev/null +++ b/gooddata-api-client/docs/ExecutionResultMetadata.md @@ -0,0 +1,13 @@ +# ExecutionResultMetadata + +Additional metadata for the particular execution result. + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data_source_messages** | [**[ExecutionResultDataSourceMessage]**](ExecutionResultDataSourceMessage.md) | Additional information sent by the underlying data source. | +**any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/gooddata-api-client/gooddata_api_client/api/actions_api.py b/gooddata-api-client/gooddata_api_client/api/actions_api.py index b40871dc5..e50e55bdd 100644 --- a/gooddata-api-client/gooddata_api_client/api/actions_api.py +++ b/gooddata-api-client/gooddata_api_client/api/actions_api.py @@ -5261,7 +5261,7 @@ def cancel_executions( ): """Applies all the given cancel tokens. # noqa: E501 - Each cancel token corresponds to one unique execution request for the same result id. If all cancel tokens for the same result id are applied, the execution for this result id is canceled. # noqa: E501 + Each cancel token corresponds to one unique execution request for the same result id. If all cancel tokens for the same result id are applied, the execution for this result id is cancelled. # noqa: E501 This method makes a synchronous HTTP request by default. To make an asynchronous HTTP request, please pass async_req=True diff --git a/gooddata-api-client/gooddata_api_client/model/declarative_data_source.py b/gooddata-api-client/gooddata_api_client/model/declarative_data_source.py index 582ffcf6a..c78af5b03 100644 --- a/gooddata-api-client/gooddata_api_client/model/declarative_data_source.py +++ b/gooddata-api-client/gooddata_api_client/model/declarative_data_source.py @@ -86,6 +86,7 @@ class DeclarativeDataSource(ModelNormal): 'MOTHERDUCK': "MOTHERDUCK", 'FLEXCONNECT': "FLEXCONNECT", 'STARROCKS': "STARROCKS", + 'ATHENA': "ATHENA", }, ('cache_strategy',): { 'ALWAYS': "ALWAYS", diff --git a/gooddata-api-client/gooddata_api_client/model/declarative_single_workspace_permission.py b/gooddata-api-client/gooddata_api_client/model/declarative_single_workspace_permission.py index fd8d72181..ac9f1cd2e 100644 --- a/gooddata-api-client/gooddata_api_client/model/declarative_single_workspace_permission.py +++ b/gooddata-api-client/gooddata_api_client/model/declarative_single_workspace_permission.py @@ -67,6 +67,7 @@ class DeclarativeSingleWorkspacePermission(ModelNormal): 'EXPORT_TABULAR': "EXPORT_TABULAR", 'EXPORT_PDF': "EXPORT_PDF", 'CREATE_AUTOMATION': "CREATE_AUTOMATION", + 'USE_AI_ASSISTANT': "USE_AI_ASSISTANT", 'CREATE_FILTER_VIEW': "CREATE_FILTER_VIEW", 'VIEW': "VIEW", }, diff --git a/gooddata-api-client/gooddata_api_client/model/declarative_workspace_data_filter.py b/gooddata-api-client/gooddata_api_client/model/declarative_workspace_data_filter.py index eafb4a548..e28f7ff95 100644 --- a/gooddata-api-client/gooddata_api_client/model/declarative_workspace_data_filter.py +++ b/gooddata-api-client/gooddata_api_client/model/declarative_workspace_data_filter.py @@ -107,9 +107,9 @@ def openapi_types(): 'column_name': (str,), # noqa: E501 'id': (str,), # noqa: E501 'title': (str,), # noqa: E501 + 'workspace': (WorkspaceIdentifier,), # noqa: E501 'workspace_data_filter_settings': ([DeclarativeWorkspaceDataFilterSetting],), # noqa: E501 'description': (str,), # noqa: E501 - 'workspace': (WorkspaceIdentifier,), # noqa: E501 } @cached_property @@ -121,9 +121,9 @@ def discriminator(): 'column_name': 'columnName', # noqa: E501 'id': 'id', # noqa: E501 'title': 'title', # noqa: E501 + 'workspace': 'workspace', # noqa: E501 'workspace_data_filter_settings': 'workspaceDataFilterSettings', # noqa: E501 'description': 'description', # noqa: E501 - 'workspace': 'workspace', # noqa: E501 } read_only_vars = { @@ -133,13 +133,14 @@ def discriminator(): @classmethod @convert_js_args_to_python_args - def _from_openapi_data(cls, column_name, id, title, workspace_data_filter_settings, *args, **kwargs): # noqa: E501 + def _from_openapi_data(cls, column_name, id, title, workspace, workspace_data_filter_settings, *args, **kwargs): # noqa: E501 """DeclarativeWorkspaceDataFilter - a model defined in OpenAPI Args: column_name (str): Workspace Data Filters column name. Data are filtered using this physical column. id (str): Workspace Data Filters ID. This ID is further used to refer to this instance. title (str): Workspace Data Filters title. + workspace (WorkspaceIdentifier): workspace_data_filter_settings ([DeclarativeWorkspaceDataFilterSetting]): Filter settings specifying values of filters valid for the workspace. Keyword Args: @@ -174,7 +175,6 @@ def _from_openapi_data(cls, column_name, id, title, workspace_data_filter_settin through its discriminator because we passed in _visited_composed_classes = (Animal,) description (str): Workspace Data Filters description.. [optional] # noqa: E501 - workspace (WorkspaceIdentifier): [optional] # noqa: E501 """ _check_type = kwargs.pop('_check_type', True) @@ -209,6 +209,7 @@ def _from_openapi_data(cls, column_name, id, title, workspace_data_filter_settin self.column_name = column_name self.id = id self.title = title + self.workspace = workspace self.workspace_data_filter_settings = workspace_data_filter_settings for var_name, var_value in kwargs.items(): if var_name not in self.attribute_map and \ @@ -230,13 +231,14 @@ def _from_openapi_data(cls, column_name, id, title, workspace_data_filter_settin ]) @convert_js_args_to_python_args - def __init__(self, column_name, id, title, workspace_data_filter_settings, *args, **kwargs): # noqa: E501 + def __init__(self, column_name, id, title, workspace, workspace_data_filter_settings, *args, **kwargs): # noqa: E501 """DeclarativeWorkspaceDataFilter - a model defined in OpenAPI Args: column_name (str): Workspace Data Filters column name. Data are filtered using this physical column. id (str): Workspace Data Filters ID. This ID is further used to refer to this instance. title (str): Workspace Data Filters title. + workspace (WorkspaceIdentifier): workspace_data_filter_settings ([DeclarativeWorkspaceDataFilterSetting]): Filter settings specifying values of filters valid for the workspace. Keyword Args: @@ -271,7 +273,6 @@ def __init__(self, column_name, id, title, workspace_data_filter_settings, *args through its discriminator because we passed in _visited_composed_classes = (Animal,) description (str): Workspace Data Filters description.. [optional] # noqa: E501 - workspace (WorkspaceIdentifier): [optional] # noqa: E501 """ _check_type = kwargs.pop('_check_type', True) @@ -304,6 +305,7 @@ def __init__(self, column_name, id, title, workspace_data_filter_settings, *args self.column_name = column_name self.id = id self.title = title + self.workspace = workspace self.workspace_data_filter_settings = workspace_data_filter_settings for var_name, var_value in kwargs.items(): if var_name not in self.attribute_map and \ diff --git a/gooddata-api-client/gooddata_api_client/model/declarative_workspace_hierarchy_permission.py b/gooddata-api-client/gooddata_api_client/model/declarative_workspace_hierarchy_permission.py index 0d19e6cc7..854309a92 100644 --- a/gooddata-api-client/gooddata_api_client/model/declarative_workspace_hierarchy_permission.py +++ b/gooddata-api-client/gooddata_api_client/model/declarative_workspace_hierarchy_permission.py @@ -67,6 +67,7 @@ class DeclarativeWorkspaceHierarchyPermission(ModelNormal): 'EXPORT_TABULAR': "EXPORT_TABULAR", 'EXPORT_PDF': "EXPORT_PDF", 'CREATE_AUTOMATION': "CREATE_AUTOMATION", + 'USE_AI_ASSISTANT': "USE_AI_ASSISTANT", 'CREATE_FILTER_VIEW': "CREATE_FILTER_VIEW", 'VIEW': "VIEW", }, diff --git a/gooddata-api-client/gooddata_api_client/model/execution_result.py b/gooddata-api-client/gooddata_api_client/model/execution_result.py index f3bb62965..ebe9f1a59 100644 --- a/gooddata-api-client/gooddata_api_client/model/execution_result.py +++ b/gooddata-api-client/gooddata_api_client/model/execution_result.py @@ -33,9 +33,11 @@ def lazy_import(): from gooddata_api_client.model.dimension_header import DimensionHeader from gooddata_api_client.model.execution_result_grand_total import ExecutionResultGrandTotal + from gooddata_api_client.model.execution_result_metadata import ExecutionResultMetadata from gooddata_api_client.model.execution_result_paging import ExecutionResultPaging globals()['DimensionHeader'] = DimensionHeader globals()['ExecutionResultGrandTotal'] = ExecutionResultGrandTotal + globals()['ExecutionResultMetadata'] = ExecutionResultMetadata globals()['ExecutionResultPaging'] = ExecutionResultPaging @@ -95,6 +97,7 @@ def openapi_types(): 'data': ([{str: (bool, date, datetime, dict, float, int, list, str, none_type)}],), # noqa: E501 'dimension_headers': ([DimensionHeader],), # noqa: E501 'grand_totals': ([ExecutionResultGrandTotal],), # noqa: E501 + 'metadata': (ExecutionResultMetadata,), # noqa: E501 'paging': (ExecutionResultPaging,), # noqa: E501 } @@ -107,6 +110,7 @@ def discriminator(): 'data': 'data', # noqa: E501 'dimension_headers': 'dimensionHeaders', # noqa: E501 'grand_totals': 'grandTotals', # noqa: E501 + 'metadata': 'metadata', # noqa: E501 'paging': 'paging', # noqa: E501 } @@ -117,13 +121,14 @@ def discriminator(): @classmethod @convert_js_args_to_python_args - def _from_openapi_data(cls, data, dimension_headers, grand_totals, paging, *args, **kwargs): # noqa: E501 + def _from_openapi_data(cls, data, dimension_headers, grand_totals, metadata, paging, *args, **kwargs): # noqa: E501 """ExecutionResult - a model defined in OpenAPI Args: data ([{str: (bool, date, datetime, dict, float, int, list, str, none_type)}]): A multi-dimensional array of computed results. The most common one being a 2-dimensional array. The arrays can be composed of Double or null values. dimension_headers ([DimensionHeader]): An array containing dimension headers. The size of the array corresponds to the number of dimensions. Their order corresponds to the dimension order in the execution result spec. grand_totals ([ExecutionResultGrandTotal]): + metadata (ExecutionResultMetadata): paging (ExecutionResultPaging): Keyword Args: @@ -191,6 +196,7 @@ def _from_openapi_data(cls, data, dimension_headers, grand_totals, paging, *args self.data = data self.dimension_headers = dimension_headers self.grand_totals = grand_totals + self.metadata = metadata self.paging = paging for var_name, var_value in kwargs.items(): if var_name not in self.attribute_map and \ @@ -212,13 +218,14 @@ def _from_openapi_data(cls, data, dimension_headers, grand_totals, paging, *args ]) @convert_js_args_to_python_args - def __init__(self, data, dimension_headers, grand_totals, paging, *args, **kwargs): # noqa: E501 + def __init__(self, data, dimension_headers, grand_totals, metadata, paging, *args, **kwargs): # noqa: E501 """ExecutionResult - a model defined in OpenAPI Args: data ([{str: (bool, date, datetime, dict, float, int, list, str, none_type)}]): A multi-dimensional array of computed results. The most common one being a 2-dimensional array. The arrays can be composed of Double or null values. dimension_headers ([DimensionHeader]): An array containing dimension headers. The size of the array corresponds to the number of dimensions. Their order corresponds to the dimension order in the execution result spec. grand_totals ([ExecutionResultGrandTotal]): + metadata (ExecutionResultMetadata): paging (ExecutionResultPaging): Keyword Args: @@ -284,6 +291,7 @@ def __init__(self, data, dimension_headers, grand_totals, paging, *args, **kwarg self.data = data self.dimension_headers = dimension_headers self.grand_totals = grand_totals + self.metadata = metadata self.paging = paging for var_name, var_value in kwargs.items(): if var_name not in self.attribute_map and \ diff --git a/gooddata-api-client/gooddata_api_client/model/execution_result_data_source_message.py b/gooddata-api-client/gooddata_api_client/model/execution_result_data_source_message.py new file mode 100644 index 000000000..5e1f08885 --- /dev/null +++ b/gooddata-api-client/gooddata_api_client/model/execution_result_data_source_message.py @@ -0,0 +1,286 @@ +""" + OpenAPI definition + + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) # noqa: E501 + + The version of the OpenAPI document: v0 + Contact: support@gooddata.com + Generated by: https://openapi-generator.tech +""" + + +import re # noqa: F401 +import sys # noqa: F401 + +from gooddata_api_client.model_utils import ( # noqa: F401 + ApiTypeError, + ModelComposed, + ModelNormal, + ModelSimple, + cached_property, + change_keys_js_to_python, + convert_js_args_to_python_args, + date, + datetime, + file_type, + none_type, + validate_get_composed_info, + OpenApiModel +) +from gooddata_api_client.exceptions import ApiAttributeError + + + +class ExecutionResultDataSourceMessage(ModelNormal): + """NOTE: This class is auto generated by OpenAPI Generator. + Ref: https://openapi-generator.tech + + Do not edit the class manually. + + Attributes: + allowed_values (dict): The key is the tuple path to the attribute + and the for var_name this is (var_name,). The value is a dict + with a capitalized key describing the allowed value and an allowed + value. These dicts store the allowed enum values. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + discriminator_value_class_map (dict): A dict to go from the discriminator + variable value to the discriminator class name. + validations (dict): The key is the tuple path to the attribute + and the for var_name this is (var_name,). The value is a dict + that stores validations for max_length, min_length, max_items, + min_items, exclusive_maximum, inclusive_maximum, exclusive_minimum, + inclusive_minimum, and regex. + additional_properties_type (tuple): A tuple of classes accepted + as additional properties values. + """ + + allowed_values = { + } + + validations = { + } + + @cached_property + def additional_properties_type(): + """ + This must be a method because a model may have properties that are + of type self, this must run after the class is loaded + """ + return (bool, date, datetime, dict, float, int, list, str, none_type,) # noqa: E501 + + _nullable = False + + @cached_property + def openapi_types(): + """ + This must be a method because a model may have properties that are + of type self, this must run after the class is loaded + + Returns + openapi_types (dict): The key is attribute name + and the value is attribute type. + """ + return { + 'correlation_id': (str,), # noqa: E501 + 'source': (str,), # noqa: E501 + 'type': (str,), # noqa: E501 + 'data': ({str: (bool, date, datetime, dict, float, int, list, str, none_type)},), # noqa: E501 + } + + @cached_property + def discriminator(): + return None + + + attribute_map = { + 'correlation_id': 'correlationId', # noqa: E501 + 'source': 'source', # noqa: E501 + 'type': 'type', # noqa: E501 + 'data': 'data', # noqa: E501 + } + + read_only_vars = { + } + + _composed_schemas = {} + + @classmethod + @convert_js_args_to_python_args + def _from_openapi_data(cls, correlation_id, source, type, *args, **kwargs): # noqa: E501 + """ExecutionResultDataSourceMessage - a model defined in OpenAPI + + Args: + correlation_id (str): Id correlating different pieces of supplementary info together. + source (str): Information about what part of the system created this piece of supplementary info. + type (str): Type of the supplementary info instance. There are currently no well-known values for this, but there might be some in the future. + + Keyword Args: + _check_type (bool): if True, values for parameters in openapi_types + will be type checked and a TypeError will be + raised if the wrong type is input. + Defaults to True + _path_to_item (tuple/list): This is a list of keys or values to + drill down to the model in received_data + when deserializing a response + _spec_property_naming (bool): True if the variable names in the input data + are serialized names, as specified in the OpenAPI document. + False if the variable names in the input data + are pythonic names, e.g. snake case (default) + _configuration (Configuration): the instance to use when + deserializing a file_type parameter. + If passed, type conversion is attempted + If omitted no type conversion is done. + _visited_composed_classes (tuple): This stores a tuple of + classes that we have traveled through so that + if we see that class again we will not use its + discriminator again. + When traveling through a discriminator, the + composed schema that is + is traveled through is added to this set. + For example if Animal has a discriminator + petType and we pass in "Dog", and the class Dog + allOf includes Animal, we move through Animal + once using the discriminator, and pick Dog. + Then in Dog, we will make an instance of the + Animal class but this time we won't travel + through its discriminator because we passed in + _visited_composed_classes = (Animal,) + data ({str: (bool, date, datetime, dict, float, int, list, str, none_type)}): Data of this particular supplementary info item: a free-form JSON specific to the particular supplementary info item type.. [optional] # noqa: E501 + """ + + _check_type = kwargs.pop('_check_type', True) + _spec_property_naming = kwargs.pop('_spec_property_naming', True) + _path_to_item = kwargs.pop('_path_to_item', ()) + _configuration = kwargs.pop('_configuration', None) + _visited_composed_classes = kwargs.pop('_visited_composed_classes', ()) + + self = super(OpenApiModel, cls).__new__(cls) + + if args: + for arg in args: + if isinstance(arg, dict): + kwargs.update(arg) + else: + raise ApiTypeError( + "Invalid positional arguments=%s passed to %s. Remove those invalid positional arguments." % ( + args, + self.__class__.__name__, + ), + path_to_item=_path_to_item, + valid_classes=(self.__class__,), + ) + + self._data_store = {} + self._check_type = _check_type + self._spec_property_naming = _spec_property_naming + self._path_to_item = _path_to_item + self._configuration = _configuration + self._visited_composed_classes = _visited_composed_classes + (self.__class__,) + + self.correlation_id = correlation_id + self.source = source + self.type = type + for var_name, var_value in kwargs.items(): + if var_name not in self.attribute_map and \ + self._configuration is not None and \ + self._configuration.discard_unknown_keys and \ + self.additional_properties_type is None: + # discard variable. + continue + setattr(self, var_name, var_value) + return self + + required_properties = set([ + '_data_store', + '_check_type', + '_spec_property_naming', + '_path_to_item', + '_configuration', + '_visited_composed_classes', + ]) + + @convert_js_args_to_python_args + def __init__(self, correlation_id, source, type, *args, **kwargs): # noqa: E501 + """ExecutionResultDataSourceMessage - a model defined in OpenAPI + + Args: + correlation_id (str): Id correlating different pieces of supplementary info together. + source (str): Information about what part of the system created this piece of supplementary info. + type (str): Type of the supplementary info instance. There are currently no well-known values for this, but there might be some in the future. + + Keyword Args: + _check_type (bool): if True, values for parameters in openapi_types + will be type checked and a TypeError will be + raised if the wrong type is input. + Defaults to True + _path_to_item (tuple/list): This is a list of keys or values to + drill down to the model in received_data + when deserializing a response + _spec_property_naming (bool): True if the variable names in the input data + are serialized names, as specified in the OpenAPI document. + False if the variable names in the input data + are pythonic names, e.g. snake case (default) + _configuration (Configuration): the instance to use when + deserializing a file_type parameter. + If passed, type conversion is attempted + If omitted no type conversion is done. + _visited_composed_classes (tuple): This stores a tuple of + classes that we have traveled through so that + if we see that class again we will not use its + discriminator again. + When traveling through a discriminator, the + composed schema that is + is traveled through is added to this set. + For example if Animal has a discriminator + petType and we pass in "Dog", and the class Dog + allOf includes Animal, we move through Animal + once using the discriminator, and pick Dog. + Then in Dog, we will make an instance of the + Animal class but this time we won't travel + through its discriminator because we passed in + _visited_composed_classes = (Animal,) + data ({str: (bool, date, datetime, dict, float, int, list, str, none_type)}): Data of this particular supplementary info item: a free-form JSON specific to the particular supplementary info item type.. [optional] # noqa: E501 + """ + + _check_type = kwargs.pop('_check_type', True) + _spec_property_naming = kwargs.pop('_spec_property_naming', False) + _path_to_item = kwargs.pop('_path_to_item', ()) + _configuration = kwargs.pop('_configuration', None) + _visited_composed_classes = kwargs.pop('_visited_composed_classes', ()) + + if args: + for arg in args: + if isinstance(arg, dict): + kwargs.update(arg) + else: + raise ApiTypeError( + "Invalid positional arguments=%s passed to %s. Remove those invalid positional arguments." % ( + args, + self.__class__.__name__, + ), + path_to_item=_path_to_item, + valid_classes=(self.__class__,), + ) + + self._data_store = {} + self._check_type = _check_type + self._spec_property_naming = _spec_property_naming + self._path_to_item = _path_to_item + self._configuration = _configuration + self._visited_composed_classes = _visited_composed_classes + (self.__class__,) + + self.correlation_id = correlation_id + self.source = source + self.type = type + for var_name, var_value in kwargs.items(): + if var_name not in self.attribute_map and \ + self._configuration is not None and \ + self._configuration.discard_unknown_keys and \ + self.additional_properties_type is None: + # discard variable. + continue + setattr(self, var_name, var_value) + if var_name in self.read_only_vars: + raise ApiAttributeError(f"`{var_name}` is a read-only attribute. Use `from_openapi_data` to instantiate " + f"class with read only attributes.") diff --git a/gooddata-api-client/gooddata_api_client/model/execution_result_metadata.py b/gooddata-api-client/gooddata_api_client/model/execution_result_metadata.py new file mode 100644 index 000000000..92c672510 --- /dev/null +++ b/gooddata-api-client/gooddata_api_client/model/execution_result_metadata.py @@ -0,0 +1,276 @@ +""" + OpenAPI definition + + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) # noqa: E501 + + The version of the OpenAPI document: v0 + Contact: support@gooddata.com + Generated by: https://openapi-generator.tech +""" + + +import re # noqa: F401 +import sys # noqa: F401 + +from gooddata_api_client.model_utils import ( # noqa: F401 + ApiTypeError, + ModelComposed, + ModelNormal, + ModelSimple, + cached_property, + change_keys_js_to_python, + convert_js_args_to_python_args, + date, + datetime, + file_type, + none_type, + validate_get_composed_info, + OpenApiModel +) +from gooddata_api_client.exceptions import ApiAttributeError + + +def lazy_import(): + from gooddata_api_client.model.execution_result_data_source_message import ExecutionResultDataSourceMessage + globals()['ExecutionResultDataSourceMessage'] = ExecutionResultDataSourceMessage + + +class ExecutionResultMetadata(ModelNormal): + """NOTE: This class is auto generated by OpenAPI Generator. + Ref: https://openapi-generator.tech + + Do not edit the class manually. + + Attributes: + allowed_values (dict): The key is the tuple path to the attribute + and the for var_name this is (var_name,). The value is a dict + with a capitalized key describing the allowed value and an allowed + value. These dicts store the allowed enum values. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + discriminator_value_class_map (dict): A dict to go from the discriminator + variable value to the discriminator class name. + validations (dict): The key is the tuple path to the attribute + and the for var_name this is (var_name,). The value is a dict + that stores validations for max_length, min_length, max_items, + min_items, exclusive_maximum, inclusive_maximum, exclusive_minimum, + inclusive_minimum, and regex. + additional_properties_type (tuple): A tuple of classes accepted + as additional properties values. + """ + + allowed_values = { + } + + validations = { + } + + @cached_property + def additional_properties_type(): + """ + This must be a method because a model may have properties that are + of type self, this must run after the class is loaded + """ + lazy_import() + return (bool, date, datetime, dict, float, int, list, str, none_type,) # noqa: E501 + + _nullable = False + + @cached_property + def openapi_types(): + """ + This must be a method because a model may have properties that are + of type self, this must run after the class is loaded + + Returns + openapi_types (dict): The key is attribute name + and the value is attribute type. + """ + lazy_import() + return { + 'data_source_messages': ([ExecutionResultDataSourceMessage],), # noqa: E501 + } + + @cached_property + def discriminator(): + return None + + + attribute_map = { + 'data_source_messages': 'dataSourceMessages', # noqa: E501 + } + + read_only_vars = { + } + + _composed_schemas = {} + + @classmethod + @convert_js_args_to_python_args + def _from_openapi_data(cls, data_source_messages, *args, **kwargs): # noqa: E501 + """ExecutionResultMetadata - a model defined in OpenAPI + + Args: + data_source_messages ([ExecutionResultDataSourceMessage]): Additional information sent by the underlying data source. + + Keyword Args: + _check_type (bool): if True, values for parameters in openapi_types + will be type checked and a TypeError will be + raised if the wrong type is input. + Defaults to True + _path_to_item (tuple/list): This is a list of keys or values to + drill down to the model in received_data + when deserializing a response + _spec_property_naming (bool): True if the variable names in the input data + are serialized names, as specified in the OpenAPI document. + False if the variable names in the input data + are pythonic names, e.g. snake case (default) + _configuration (Configuration): the instance to use when + deserializing a file_type parameter. + If passed, type conversion is attempted + If omitted no type conversion is done. + _visited_composed_classes (tuple): This stores a tuple of + classes that we have traveled through so that + if we see that class again we will not use its + discriminator again. + When traveling through a discriminator, the + composed schema that is + is traveled through is added to this set. + For example if Animal has a discriminator + petType and we pass in "Dog", and the class Dog + allOf includes Animal, we move through Animal + once using the discriminator, and pick Dog. + Then in Dog, we will make an instance of the + Animal class but this time we won't travel + through its discriminator because we passed in + _visited_composed_classes = (Animal,) + """ + + _check_type = kwargs.pop('_check_type', True) + _spec_property_naming = kwargs.pop('_spec_property_naming', True) + _path_to_item = kwargs.pop('_path_to_item', ()) + _configuration = kwargs.pop('_configuration', None) + _visited_composed_classes = kwargs.pop('_visited_composed_classes', ()) + + self = super(OpenApiModel, cls).__new__(cls) + + if args: + for arg in args: + if isinstance(arg, dict): + kwargs.update(arg) + else: + raise ApiTypeError( + "Invalid positional arguments=%s passed to %s. Remove those invalid positional arguments." % ( + args, + self.__class__.__name__, + ), + path_to_item=_path_to_item, + valid_classes=(self.__class__,), + ) + + self._data_store = {} + self._check_type = _check_type + self._spec_property_naming = _spec_property_naming + self._path_to_item = _path_to_item + self._configuration = _configuration + self._visited_composed_classes = _visited_composed_classes + (self.__class__,) + + self.data_source_messages = data_source_messages + for var_name, var_value in kwargs.items(): + if var_name not in self.attribute_map and \ + self._configuration is not None and \ + self._configuration.discard_unknown_keys and \ + self.additional_properties_type is None: + # discard variable. + continue + setattr(self, var_name, var_value) + return self + + required_properties = set([ + '_data_store', + '_check_type', + '_spec_property_naming', + '_path_to_item', + '_configuration', + '_visited_composed_classes', + ]) + + @convert_js_args_to_python_args + def __init__(self, data_source_messages, *args, **kwargs): # noqa: E501 + """ExecutionResultMetadata - a model defined in OpenAPI + + Args: + data_source_messages ([ExecutionResultDataSourceMessage]): Additional information sent by the underlying data source. + + Keyword Args: + _check_type (bool): if True, values for parameters in openapi_types + will be type checked and a TypeError will be + raised if the wrong type is input. + Defaults to True + _path_to_item (tuple/list): This is a list of keys or values to + drill down to the model in received_data + when deserializing a response + _spec_property_naming (bool): True if the variable names in the input data + are serialized names, as specified in the OpenAPI document. + False if the variable names in the input data + are pythonic names, e.g. snake case (default) + _configuration (Configuration): the instance to use when + deserializing a file_type parameter. + If passed, type conversion is attempted + If omitted no type conversion is done. + _visited_composed_classes (tuple): This stores a tuple of + classes that we have traveled through so that + if we see that class again we will not use its + discriminator again. + When traveling through a discriminator, the + composed schema that is + is traveled through is added to this set. + For example if Animal has a discriminator + petType and we pass in "Dog", and the class Dog + allOf includes Animal, we move through Animal + once using the discriminator, and pick Dog. + Then in Dog, we will make an instance of the + Animal class but this time we won't travel + through its discriminator because we passed in + _visited_composed_classes = (Animal,) + """ + + _check_type = kwargs.pop('_check_type', True) + _spec_property_naming = kwargs.pop('_spec_property_naming', False) + _path_to_item = kwargs.pop('_path_to_item', ()) + _configuration = kwargs.pop('_configuration', None) + _visited_composed_classes = kwargs.pop('_visited_composed_classes', ()) + + if args: + for arg in args: + if isinstance(arg, dict): + kwargs.update(arg) + else: + raise ApiTypeError( + "Invalid positional arguments=%s passed to %s. Remove those invalid positional arguments." % ( + args, + self.__class__.__name__, + ), + path_to_item=_path_to_item, + valid_classes=(self.__class__,), + ) + + self._data_store = {} + self._check_type = _check_type + self._spec_property_naming = _spec_property_naming + self._path_to_item = _path_to_item + self._configuration = _configuration + self._visited_composed_classes = _visited_composed_classes + (self.__class__,) + + self.data_source_messages = data_source_messages + for var_name, var_value in kwargs.items(): + if var_name not in self.attribute_map and \ + self._configuration is not None and \ + self._configuration.discard_unknown_keys and \ + self.additional_properties_type is None: + # discard variable. + continue + setattr(self, var_name, var_value) + if var_name in self.read_only_vars: + raise ApiAttributeError(f"`{var_name}` is a read-only attribute. Use `from_openapi_data` to instantiate " + f"class with read only attributes.") diff --git a/gooddata-api-client/gooddata_api_client/model/json_api_data_source_identifier_out_attributes.py b/gooddata-api-client/gooddata_api_client/model/json_api_data_source_identifier_out_attributes.py index 53ed24c7d..d7c049dd1 100644 --- a/gooddata-api-client/gooddata_api_client/model/json_api_data_source_identifier_out_attributes.py +++ b/gooddata-api-client/gooddata_api_client/model/json_api_data_source_identifier_out_attributes.py @@ -80,6 +80,7 @@ class JsonApiDataSourceIdentifierOutAttributes(ModelNormal): 'MOTHERDUCK': "MOTHERDUCK", 'FLEXCONNECT': "FLEXCONNECT", 'STARROCKS': "STARROCKS", + 'ATHENA': "ATHENA", }, } diff --git a/gooddata-api-client/gooddata_api_client/model/json_api_data_source_in_attributes.py b/gooddata-api-client/gooddata_api_client/model/json_api_data_source_in_attributes.py index 65cb349a3..794579594 100644 --- a/gooddata-api-client/gooddata_api_client/model/json_api_data_source_in_attributes.py +++ b/gooddata-api-client/gooddata_api_client/model/json_api_data_source_in_attributes.py @@ -84,6 +84,7 @@ class JsonApiDataSourceInAttributes(ModelNormal): 'MOTHERDUCK': "MOTHERDUCK", 'FLEXCONNECT': "FLEXCONNECT", 'STARROCKS': "STARROCKS", + 'ATHENA': "ATHENA", }, ('cache_strategy',): { 'None': None, diff --git a/gooddata-api-client/gooddata_api_client/model/json_api_data_source_out_attributes.py b/gooddata-api-client/gooddata_api_client/model/json_api_data_source_out_attributes.py index 21f8aa4c8..8b2a1b05f 100644 --- a/gooddata-api-client/gooddata_api_client/model/json_api_data_source_out_attributes.py +++ b/gooddata-api-client/gooddata_api_client/model/json_api_data_source_out_attributes.py @@ -84,6 +84,7 @@ class JsonApiDataSourceOutAttributes(ModelNormal): 'MOTHERDUCK': "MOTHERDUCK", 'FLEXCONNECT': "FLEXCONNECT", 'STARROCKS': "STARROCKS", + 'ATHENA': "ATHENA", }, ('authentication_type',): { 'None': None, diff --git a/gooddata-api-client/gooddata_api_client/model/json_api_data_source_patch_attributes.py b/gooddata-api-client/gooddata_api_client/model/json_api_data_source_patch_attributes.py index 60c332e63..188c1061a 100644 --- a/gooddata-api-client/gooddata_api_client/model/json_api_data_source_patch_attributes.py +++ b/gooddata-api-client/gooddata_api_client/model/json_api_data_source_patch_attributes.py @@ -89,6 +89,7 @@ class JsonApiDataSourcePatchAttributes(ModelNormal): 'MOTHERDUCK': "MOTHERDUCK", 'FLEXCONNECT': "FLEXCONNECT", 'STARROCKS': "STARROCKS", + 'ATHENA': "ATHENA", }, } diff --git a/gooddata-api-client/gooddata_api_client/model/json_api_workspace_out_meta.py b/gooddata-api-client/gooddata_api_client/model/json_api_workspace_out_meta.py index a4758e6db..5771a0633 100644 --- a/gooddata-api-client/gooddata_api_client/model/json_api_workspace_out_meta.py +++ b/gooddata-api-client/gooddata_api_client/model/json_api_workspace_out_meta.py @@ -71,6 +71,7 @@ class JsonApiWorkspaceOutMeta(ModelNormal): 'EXPORT_TABULAR': "EXPORT_TABULAR", 'EXPORT_PDF': "EXPORT_PDF", 'CREATE_AUTOMATION': "CREATE_AUTOMATION", + 'USE_AI_ASSISTANT': "USE_AI_ASSISTANT", 'CREATE_FILTER_VIEW': "CREATE_FILTER_VIEW", 'VIEW': "VIEW", }, diff --git a/gooddata-api-client/gooddata_api_client/model/test_definition_request.py b/gooddata-api-client/gooddata_api_client/model/test_definition_request.py index 6f44beeb7..bc817186c 100644 --- a/gooddata-api-client/gooddata_api_client/model/test_definition_request.py +++ b/gooddata-api-client/gooddata_api_client/model/test_definition_request.py @@ -84,6 +84,7 @@ class TestDefinitionRequest(ModelNormal): 'MOTHERDUCK': "MOTHERDUCK", 'FLEXCONNECT': "FLEXCONNECT", 'STARROCKS': "STARROCKS", + 'ATHENA': "ATHENA", }, } diff --git a/gooddata-api-client/gooddata_api_client/model/user_management_workspace_permission_assignment.py b/gooddata-api-client/gooddata_api_client/model/user_management_workspace_permission_assignment.py index 6d81a4b1c..3f48d6fa5 100644 --- a/gooddata-api-client/gooddata_api_client/model/user_management_workspace_permission_assignment.py +++ b/gooddata-api-client/gooddata_api_client/model/user_management_workspace_permission_assignment.py @@ -63,6 +63,7 @@ class UserManagementWorkspacePermissionAssignment(ModelNormal): 'EXPORT_TABULAR': "EXPORT_TABULAR", 'EXPORT_PDF': "EXPORT_PDF", 'CREATE_AUTOMATION': "CREATE_AUTOMATION", + 'USE_AI_ASSISTANT': "USE_AI_ASSISTANT", 'CREATE_FILTER_VIEW': "CREATE_FILTER_VIEW", 'VIEW': "VIEW", }, @@ -73,6 +74,7 @@ class UserManagementWorkspacePermissionAssignment(ModelNormal): 'EXPORT_TABULAR': "EXPORT_TABULAR", 'EXPORT_PDF': "EXPORT_PDF", 'CREATE_AUTOMATION': "CREATE_AUTOMATION", + 'USE_AI_ASSISTANT': "USE_AI_ASSISTANT", 'CREATE_FILTER_VIEW': "CREATE_FILTER_VIEW", 'VIEW': "VIEW", }, diff --git a/gooddata-api-client/gooddata_api_client/model/workspace_permission_assignment.py b/gooddata-api-client/gooddata_api_client/model/workspace_permission_assignment.py index f508b6ecc..6b463d1af 100644 --- a/gooddata-api-client/gooddata_api_client/model/workspace_permission_assignment.py +++ b/gooddata-api-client/gooddata_api_client/model/workspace_permission_assignment.py @@ -67,6 +67,7 @@ class WorkspacePermissionAssignment(ModelNormal): 'EXPORT_TABULAR': "EXPORT_TABULAR", 'EXPORT_PDF': "EXPORT_PDF", 'CREATE_AUTOMATION': "CREATE_AUTOMATION", + 'USE_AI_ASSISTANT': "USE_AI_ASSISTANT", 'CREATE_FILTER_VIEW': "CREATE_FILTER_VIEW", 'VIEW': "VIEW", }, @@ -77,6 +78,7 @@ class WorkspacePermissionAssignment(ModelNormal): 'EXPORT_TABULAR': "EXPORT_TABULAR", 'EXPORT_PDF': "EXPORT_PDF", 'CREATE_AUTOMATION': "CREATE_AUTOMATION", + 'USE_AI_ASSISTANT': "USE_AI_ASSISTANT", 'CREATE_FILTER_VIEW': "CREATE_FILTER_VIEW", 'VIEW': "VIEW", }, diff --git a/gooddata-api-client/gooddata_api_client/models/__init__.py b/gooddata-api-client/gooddata_api_client/models/__init__.py index fe1476756..b528cf807 100644 --- a/gooddata-api-client/gooddata_api_client/models/__init__.py +++ b/gooddata-api-client/gooddata_api_client/models/__init__.py @@ -217,8 +217,10 @@ from gooddata_api_client.model.execution_links import ExecutionLinks from gooddata_api_client.model.execution_response import ExecutionResponse from gooddata_api_client.model.execution_result import ExecutionResult +from gooddata_api_client.model.execution_result_data_source_message import ExecutionResultDataSourceMessage from gooddata_api_client.model.execution_result_grand_total import ExecutionResultGrandTotal from gooddata_api_client.model.execution_result_header import ExecutionResultHeader +from gooddata_api_client.model.execution_result_metadata import ExecutionResultMetadata from gooddata_api_client.model.execution_result_paging import ExecutionResultPaging from gooddata_api_client.model.execution_settings import ExecutionSettings from gooddata_api_client.model.export_request import ExportRequest diff --git a/gooddata-fdw/tests/execute/fixtures/execute_compute_table_all_columns.yaml b/gooddata-fdw/tests/execute/fixtures/execute_compute_table_all_columns.yaml index a41d57a99..dbc003ff6 100644 --- a/gooddata-fdw/tests/execute/fixtures/execute_compute_table_all_columns.yaml +++ b/gooddata-fdw/tests/execute/fixtures/execute_compute_table_all_columns.yaml @@ -454,6 +454,8 @@ interactions: - measureHeader: measureIndex: 3 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 18 diff --git a/gooddata-fdw/tests/execute/fixtures/execute_compute_table_metrics_only.yaml b/gooddata-fdw/tests/execute/fixtures/execute_compute_table_metrics_only.yaml index 7b232df99..1dcc8e0ef 100644 --- a/gooddata-fdw/tests/execute/fixtures/execute_compute_table_metrics_only.yaml +++ b/gooddata-fdw/tests/execute/fixtures/execute_compute_table_metrics_only.yaml @@ -229,6 +229,8 @@ interactions: - measureHeader: measureIndex: 3 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 4 diff --git a/gooddata-fdw/tests/execute/fixtures/execute_compute_table_with_reduced_granularity.yaml b/gooddata-fdw/tests/execute/fixtures/execute_compute_table_with_reduced_granularity.yaml index 9094b8ffe..61b8cb1d1 100644 --- a/gooddata-fdw/tests/execute/fixtures/execute_compute_table_with_reduced_granularity.yaml +++ b/gooddata-fdw/tests/execute/fixtures/execute_compute_table_with_reduced_granularity.yaml @@ -245,6 +245,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 4 diff --git a/gooddata-fdw/tests/execute/fixtures/execute_insight_all_columns.yaml b/gooddata-fdw/tests/execute/fixtures/execute_insight_all_columns.yaml index 8d952d246..764ee6df2 100644 --- a/gooddata-fdw/tests/execute/fixtures/execute_insight_all_columns.yaml +++ b/gooddata-fdw/tests/execute/fixtures/execute_insight_all_columns.yaml @@ -750,6 +750,8 @@ interactions: - measureHeader: measureIndex: 3 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 18 diff --git a/gooddata-fdw/tests/execute/fixtures/execute_insight_some_columns.yaml b/gooddata-fdw/tests/execute/fixtures/execute_insight_some_columns.yaml index 8d952d246..764ee6df2 100644 --- a/gooddata-fdw/tests/execute/fixtures/execute_insight_some_columns.yaml +++ b/gooddata-fdw/tests/execute/fixtures/execute_insight_some_columns.yaml @@ -750,6 +750,8 @@ interactions: - measureHeader: measureIndex: 3 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 18 diff --git a/gooddata-flexconnect/gooddata_flexconnect/__init__.py b/gooddata-flexconnect/gooddata_flexconnect/__init__.py index f47c53c29..11e4c8a9a 100644 --- a/gooddata-flexconnect/gooddata_flexconnect/__init__.py +++ b/gooddata-flexconnect/gooddata_flexconnect/__init__.py @@ -1,5 +1,10 @@ # (C) 2024 GoodData Corporation +from gooddata_flexconnect.function.data_source_messages import ( + DataSourceMessage, + add_data_source_messages_metadata, + with_data_source_messages, +) from gooddata_flexconnect.function.execution_context import ( ExecutionContext, ExecutionContextAbsoluteDateFilter, diff --git a/gooddata-flexconnect/gooddata_flexconnect/function/data_source_messages.py b/gooddata-flexconnect/gooddata_flexconnect/function/data_source_messages.py new file mode 100644 index 000000000..a90186099 --- /dev/null +++ b/gooddata-flexconnect/gooddata_flexconnect/function/data_source_messages.py @@ -0,0 +1,101 @@ +# (C) 2025 GoodData Corporation +from collections.abc import Iterable +from dataclasses import dataclass +from typing import Any, Optional + +import orjson +import pyarrow + +_DATA_SOURCE_MESSAGES_KEY = b"x-gdc-data-source-messages" +""" +Key used in the PyArrow metadata to carry the data source messages. +""" + + +@dataclass(frozen=True) +class DataSourceMessage: + """ + A message sent by the data source. This will be included in the execution results' metadata. + """ + + source: str + """ + Identification of the source of the message, typically the id or other identifier of the data source. + """ + + correlation_id: str + """ + Unique id of the operation, meant to correlate different messages together. + """ + + type: str + """ + Type of the message, currently free-form, we might define some enum for these in the future. + """ + + data: Optional[Any] = None + """ + Optional message-specific data. This can be anything that can be JSON-serialized. + Try to keep this as small as possible: the backend has a quite strict size limit on the messages. + """ + + def to_dict(self) -> dict[str, Any]: + """ + Converts this instance to its dictionary representation. + """ + return {"source": self.source, "correlation_id": self.correlation_id, "type": self.type, "data": self.data} + + +def add_data_source_messages_metadata( + data_source_messages: Iterable[DataSourceMessage], original_metadata: Optional[dict] = None +) -> dict[bytes, bytes]: + """ + Given a list of DataSourceMessages, creates a PyArrow-compatible metadata dictionary. + + This is useful when creating a PyArrow Table directly: + + >>> t = pyarrow.table( + ... [1, 2, 3], + ... ["test"], + ... metadata=add_data_source_messages_metadata( + ... [DataSourceMessage(correlation_id="123", source="test_source", type="info")] + ... ), + ... ) + + You can also add other metadata as needed: + >>> t2 = pyarrow.table( + ... [1, 2, 3], + ... ["test"], + ... metadata=add_data_source_messages_metadata( + ... [DataSourceMessage(correlation_id="123", source="test_source", type="info")], + ... original_metadata={b"some": b"extra metadata"}, + ... ), + ... ) + + :param data_source_messages: list of DataSourceMessages to include + :param original_metadata: original medata to add the DataSourceMessages to. + :return: a new metadata dictionary + """ + if original_metadata is None: + original_metadata = {} + return {**original_metadata, _DATA_SOURCE_MESSAGES_KEY: orjson.dumps(data_source_messages)} + + +def with_data_source_messages( + data_source_messages: Iterable[DataSourceMessage], schema: pyarrow.Schema +) -> pyarrow.Schema: + """ + Given a schema and a list of DataSourceMessages, returns a new schema with the DataSourceMessages included. + + This is useful when creating PyArrow RecordBatchReaders: + + >>> s = with_data_source_messages( + ... [DataSourceMessage(correlation_id="123", source="test_source", type="info")], + ... pyarrow.schema(...), # the original schema for your RecordBatchReader + ... ) + >>> rbr = pyarrow.RecordBatchReader.from_batches(schema=s, batches=...) + + :param schema: the schema to enrich with the DataSourceMessages + :param data_source_messages: list of DataSourceMessages to include + """ + return schema.with_metadata(add_data_source_messages_metadata(data_source_messages, schema.metadata)) diff --git a/gooddata-flexconnect/tests/function/test_data_source_messages.py b/gooddata-flexconnect/tests/function/test_data_source_messages.py new file mode 100644 index 000000000..39c5ae8bb --- /dev/null +++ b/gooddata-flexconnect/tests/function/test_data_source_messages.py @@ -0,0 +1,64 @@ +# (C) 2025 GoodData Corporation +import orjson +import pyarrow +import pytest +from gooddata_flexconnect.function.data_source_messages import ( + _DATA_SOURCE_MESSAGES_KEY, + DataSourceMessage, + add_data_source_messages_metadata, + with_data_source_messages, +) + + +@pytest.fixture(scope="module") +def sample_schema(): + return pyarrow.schema( + [ + pyarrow.field("name", pyarrow.string()), + pyarrow.field("height", pyarrow.int32()), + ] + ) + + +@pytest.fixture(scope="module") +def sample_data_source_message(): + return DataSourceMessage(correlation_id="123", source="test_source", type="test") + + +def test_with_data_source_messages_empty_original(sample_schema, sample_data_source_message): + augmented_schema = with_data_source_messages([sample_data_source_message], sample_schema) + + # with_data_source_messages creates a copy, the original schema must stay intact + assert sample_schema.metadata is None + + assert augmented_schema.names == sample_schema.names + assert augmented_schema.metadata is not None + assert orjson.loads(augmented_schema.metadata[_DATA_SOURCE_MESSAGES_KEY]) == [sample_data_source_message.to_dict()] + + +def test_with_data_source_messages_non_empty_original(sample_schema, sample_data_source_message): + sample_schema_with_some_metadata = sample_schema.with_metadata({b"foo": b"bar"}) + + augmented_schema = with_data_source_messages([sample_data_source_message], sample_schema_with_some_metadata) + + # with_data_source_messages creates a copy, the original schema must stay intact + assert sample_schema_with_some_metadata.metadata == {b"foo": b"bar"} + + # ensure the original metadata is still there + assert augmented_schema.names == sample_schema.names + assert augmented_schema.metadata is not None + assert augmented_schema.metadata[b"foo"] == b"bar" + assert orjson.loads(augmented_schema.metadata[_DATA_SOURCE_MESSAGES_KEY]) == [sample_data_source_message.to_dict()] + + +def test_add_data_source_messages_metadata_empty_original(sample_data_source_message): + metadata = add_data_source_messages_metadata(data_source_messages=[sample_data_source_message]) + assert orjson.loads(metadata[_DATA_SOURCE_MESSAGES_KEY]) == [sample_data_source_message.to_dict()] + + +def test_add_data_source_messages_metadata_non_empty_original(sample_data_source_message): + metadata = add_data_source_messages_metadata( + data_source_messages=[sample_data_source_message], original_metadata={b"foo": b"bar"} + ) + assert orjson.loads(metadata[_DATA_SOURCE_MESSAGES_KEY]) == [sample_data_source_message.to_dict()] + assert metadata[b"foo"] == b"bar" diff --git a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_bytes_limits_failure.yaml b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_bytes_limits_failure.yaml index 01de2aa40..b9350973d 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_bytes_limits_failure.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_bytes_limits_failure.yaml @@ -1164,6 +1164,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 48 diff --git a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_dimensions_limits_failure.yaml b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_dimensions_limits_failure.yaml index 01de2aa40..b9350973d 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_dimensions_limits_failure.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_dimensions_limits_failure.yaml @@ -1164,6 +1164,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 48 diff --git a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_one_dim1.yaml b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_one_dim1.yaml index b857835d0..8cdc3101d 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_one_dim1.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_one_dim1.yaml @@ -4810,6 +4810,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 364 @@ -9448,6 +9450,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 364 diff --git a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_one_dim2.yaml b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_one_dim2.yaml index 5d692b7f4..3b97bc566 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_one_dim2.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_one_dim2.yaml @@ -1652,6 +1652,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 1 @@ -2944,6 +2946,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 1 @@ -4236,6 +4240,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 1 @@ -5096,6 +5102,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 1 @@ -6575,6 +6583,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 1 @@ -7867,6 +7877,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 1 @@ -9159,6 +9171,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 1 @@ -10019,6 +10033,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 1 diff --git a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_totals1.yaml b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_totals1.yaml index c118ceece..81502de93 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_totals1.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_totals1.yaml @@ -1855,6 +1855,8 @@ interactions: function: MAX totalDimensions: - dim_1 + metadata: + dataSourceMessages: [] paging: count: - 4 @@ -3518,6 +3520,8 @@ interactions: function: MAX totalDimensions: - dim_1 + metadata: + dataSourceMessages: [] paging: count: - 4 diff --git a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_totals2.yaml b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_totals2.yaml index e7f5b9b43..b3249ec99 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_totals2.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_totals2.yaml @@ -2906,6 +2906,8 @@ interactions: function: MAX totalDimensions: - dim_1 + metadata: + dataSourceMessages: [] paging: count: - 17 @@ -5622,6 +5624,8 @@ interactions: function: MAX totalDimensions: - dim_1 + metadata: + dataSourceMessages: [] paging: count: - 17 diff --git a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_totals3.yaml b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_totals3.yaml index db8ec3e8f..44358264a 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_totals3.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_totals3.yaml @@ -1855,6 +1855,8 @@ interactions: function: MAX totalDimensions: - dim_0 + metadata: + dataSourceMessages: [] paging: count: - 96 @@ -3518,6 +3520,8 @@ interactions: function: MAX totalDimensions: - dim_0 + metadata: + dataSourceMessages: [] paging: count: - 96 diff --git a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_totals4.yaml b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_totals4.yaml index 7cb9fe261..576ab476e 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_totals4.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_totals4.yaml @@ -2906,6 +2906,8 @@ interactions: function: MAX totalDimensions: - dim_0 + metadata: + dataSourceMessages: [] paging: count: - 96 @@ -5622,6 +5624,8 @@ interactions: function: MAX totalDimensions: - dim_0 + metadata: + dataSourceMessages: [] paging: count: - 96 diff --git a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_two_dim1.yaml b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_two_dim1.yaml index 1a4eeea15..8dd3935e4 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_two_dim1.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_two_dim1.yaml @@ -1164,6 +1164,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 48 @@ -2155,6 +2157,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 48 @@ -3146,6 +3150,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 48 diff --git a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_two_dim2.yaml b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_two_dim2.yaml index e0392cbdc..9eae6be24 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_two_dim2.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_two_dim2.yaml @@ -1556,6 +1556,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 100 @@ -2554,6 +2556,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 82 @@ -3937,6 +3941,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 100 @@ -4935,6 +4941,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 82 diff --git a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_two_dim3.yaml b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_two_dim3.yaml index 5966df09b..06aa80197 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_two_dim3.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_exec_def_two_dim3.yaml @@ -1616,6 +1616,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 4 @@ -3059,6 +3061,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 4 diff --git a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_items.yaml b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_items.yaml index c39a2498e..062ecae01 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_items.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_items.yaml @@ -569,6 +569,8 @@ interactions: labelValue: Outdoor primaryLabelValue: Outdoor grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 2 diff --git a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_items_no_index.yaml b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_items_no_index.yaml index c39a2498e..062ecae01 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_items_no_index.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_items_no_index.yaml @@ -569,6 +569,8 @@ interactions: labelValue: Outdoor primaryLabelValue: Outdoor grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 2 diff --git a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_visualization.yaml b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_visualization.yaml index f54bd99be..3ab53f3b7 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_visualization.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_visualization.yaml @@ -915,6 +915,8 @@ interactions: labelValue: Neptide primaryLabelValue: Neptide grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 4 diff --git a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_visualization_date.yaml b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_visualization_date.yaml index 48d9dcaf3..24e805a8a 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_visualization_date.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_visualization_date.yaml @@ -635,6 +635,8 @@ interactions: labelValue: 2024-12 primaryLabelValue: 2024-12 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 2 diff --git a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_visualization_no_index.yaml b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_visualization_no_index.yaml index 25fe5f0aa..d2feb877e 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_visualization_no_index.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/dataframe_for_visualization_no_index.yaml @@ -915,6 +915,8 @@ interactions: labelValue: Neptide primaryLabelValue: Neptide grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 4 diff --git a/gooddata-pandas/tests/dataframe/fixtures/empty_indexed_dataframe.yaml b/gooddata-pandas/tests/dataframe/fixtures/empty_indexed_dataframe.yaml index e4fa1e410..37aef42c7 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/empty_indexed_dataframe.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/empty_indexed_dataframe.yaml @@ -353,6 +353,8 @@ interactions: - headerGroups: - headers: [] grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 0 diff --git a/gooddata-pandas/tests/dataframe/fixtures/empty_not_indexed_dataframe.yaml b/gooddata-pandas/tests/dataframe/fixtures/empty_not_indexed_dataframe.yaml index e4fa1e410..37aef42c7 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/empty_not_indexed_dataframe.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/empty_not_indexed_dataframe.yaml @@ -353,6 +353,8 @@ interactions: - headerGroups: - headers: [] grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 0 diff --git a/gooddata-pandas/tests/dataframe/fixtures/filtered_empty_df.yaml b/gooddata-pandas/tests/dataframe/fixtures/filtered_empty_df.yaml index 9e458cd28..7a522ee15 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/filtered_empty_df.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/filtered_empty_df.yaml @@ -191,6 +191,8 @@ interactions: - headerGroups: - headers: [] grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 0 diff --git a/gooddata-pandas/tests/dataframe/fixtures/multi_index_filtered_metrics_and_label.yaml b/gooddata-pandas/tests/dataframe/fixtures/multi_index_filtered_metrics_and_label.yaml index ba41d2f66..7250fdf3b 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/multi_index_filtered_metrics_and_label.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/multi_index_filtered_metrics_and_label.yaml @@ -558,6 +558,8 @@ interactions: labelValue: Home primaryLabelValue: Home grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 2 diff --git a/gooddata-pandas/tests/dataframe/fixtures/multi_index_filtered_metrics_and_label_reuse.yaml b/gooddata-pandas/tests/dataframe/fixtures/multi_index_filtered_metrics_and_label_reuse.yaml index 72e89a0a6..c6fdc103a 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/multi_index_filtered_metrics_and_label_reuse.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/multi_index_filtered_metrics_and_label_reuse.yaml @@ -474,6 +474,8 @@ interactions: labelValue: Outdoor primaryLabelValue: Outdoor grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 2 diff --git a/gooddata-pandas/tests/dataframe/fixtures/multi_index_metrics.yaml b/gooddata-pandas/tests/dataframe/fixtures/multi_index_metrics.yaml index 2f5e48991..d60c9554d 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/multi_index_metrics.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/multi_index_metrics.yaml @@ -570,6 +570,8 @@ interactions: labelValue: Outdoor primaryLabelValue: Outdoor grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 2 diff --git a/gooddata-pandas/tests/dataframe/fixtures/multi_index_metrics_and_label.yaml b/gooddata-pandas/tests/dataframe/fixtures/multi_index_metrics_and_label.yaml index e52bc0d30..10b196d84 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/multi_index_metrics_and_label.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/multi_index_metrics_and_label.yaml @@ -2514,6 +2514,8 @@ interactions: labelValue: Outdoor primaryLabelValue: Outdoor grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 2 diff --git a/gooddata-pandas/tests/dataframe/fixtures/not_indexed_filtered_metrics_and_labels.yaml b/gooddata-pandas/tests/dataframe/fixtures/not_indexed_filtered_metrics_and_labels.yaml index 9bdddaa16..cdd17b7c5 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/not_indexed_filtered_metrics_and_labels.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/not_indexed_filtered_metrics_and_labels.yaml @@ -370,6 +370,8 @@ interactions: labelValue: Midwest primaryLabelValue: Midwest grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 2 diff --git a/gooddata-pandas/tests/dataframe/fixtures/not_indexed_metrics.yaml b/gooddata-pandas/tests/dataframe/fixtures/not_indexed_metrics.yaml index 673b9f6ae..df4a58fc7 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/not_indexed_metrics.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/not_indexed_metrics.yaml @@ -201,6 +201,8 @@ interactions: - measureHeader: measureIndex: 1 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 2 diff --git a/gooddata-pandas/tests/dataframe/fixtures/not_indexed_metrics_and_labels.yaml b/gooddata-pandas/tests/dataframe/fixtures/not_indexed_metrics_and_labels.yaml index d1d9442ad..b2a8317ad 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/not_indexed_metrics_and_labels.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/not_indexed_metrics_and_labels.yaml @@ -382,6 +382,8 @@ interactions: labelValue: West primaryLabelValue: West grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 2 diff --git a/gooddata-pandas/tests/dataframe/fixtures/simple_index_filtered_metrics_and_label.yaml b/gooddata-pandas/tests/dataframe/fixtures/simple_index_filtered_metrics_and_label.yaml index 86cfbdbfe..291d19d61 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/simple_index_filtered_metrics_and_label.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/simple_index_filtered_metrics_and_label.yaml @@ -477,6 +477,8 @@ interactions: labelValue: Midwest primaryLabelValue: Midwest grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 2 diff --git a/gooddata-pandas/tests/dataframe/fixtures/simple_index_metrics.yaml b/gooddata-pandas/tests/dataframe/fixtures/simple_index_metrics.yaml index e81988795..2d28b3ac0 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/simple_index_metrics.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/simple_index_metrics.yaml @@ -538,6 +538,8 @@ interactions: labelValue: Outdoor primaryLabelValue: Outdoor grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 1 diff --git a/gooddata-pandas/tests/dataframe/fixtures/simple_index_metrics_and_label.yaml b/gooddata-pandas/tests/dataframe/fixtures/simple_index_metrics_and_label.yaml index a1a7942d7..7b4b19b42 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/simple_index_metrics_and_label.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/simple_index_metrics_and_label.yaml @@ -380,6 +380,8 @@ interactions: labelValue: West primaryLabelValue: West grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 2 diff --git a/gooddata-pandas/tests/dataframe/fixtures/simple_index_metrics_no_duplicate.yaml b/gooddata-pandas/tests/dataframe/fixtures/simple_index_metrics_no_duplicate.yaml index ef70ca050..48a1814f8 100644 --- a/gooddata-pandas/tests/dataframe/fixtures/simple_index_metrics_no_duplicate.yaml +++ b/gooddata-pandas/tests/dataframe/fixtures/simple_index_metrics_no_duplicate.yaml @@ -380,6 +380,8 @@ interactions: labelValue: West primaryLabelValue: West grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 2 diff --git a/gooddata-pandas/tests/series/fixtures/multi_index_filtered_series.yaml b/gooddata-pandas/tests/series/fixtures/multi_index_filtered_series.yaml index 8efa24f8e..4328ee2b1 100644 --- a/gooddata-pandas/tests/series/fixtures/multi_index_filtered_series.yaml +++ b/gooddata-pandas/tests/series/fixtures/multi_index_filtered_series.yaml @@ -462,6 +462,8 @@ interactions: labelValue: Clothing primaryLabelValue: Clothing grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 1 diff --git a/gooddata-pandas/tests/series/fixtures/multi_index_metric_series.yaml b/gooddata-pandas/tests/series/fixtures/multi_index_metric_series.yaml index 450853a9e..7f15c1c01 100644 --- a/gooddata-pandas/tests/series/fixtures/multi_index_metric_series.yaml +++ b/gooddata-pandas/tests/series/fixtures/multi_index_metric_series.yaml @@ -538,6 +538,8 @@ interactions: labelValue: Outdoor primaryLabelValue: Outdoor grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 1 diff --git a/gooddata-pandas/tests/series/fixtures/not_indexed_filtered_metric_series.yaml b/gooddata-pandas/tests/series/fixtures/not_indexed_filtered_metric_series.yaml index d300bee0a..30b251376 100644 --- a/gooddata-pandas/tests/series/fixtures/not_indexed_filtered_metric_series.yaml +++ b/gooddata-pandas/tests/series/fixtures/not_indexed_filtered_metric_series.yaml @@ -185,6 +185,8 @@ interactions: - measureHeader: measureIndex: 0 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 1 @@ -383,6 +385,8 @@ interactions: - measureHeader: measureIndex: 0 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 1 diff --git a/gooddata-pandas/tests/series/fixtures/not_indexed_label_series.yaml b/gooddata-pandas/tests/series/fixtures/not_indexed_label_series.yaml index 60a6cedd7..2791a60a3 100644 --- a/gooddata-pandas/tests/series/fixtures/not_indexed_label_series.yaml +++ b/gooddata-pandas/tests/series/fixtures/not_indexed_label_series.yaml @@ -336,6 +336,8 @@ interactions: labelValue: West primaryLabelValue: West grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 5 diff --git a/gooddata-pandas/tests/series/fixtures/not_indexed_label_series_with_granularity.yaml b/gooddata-pandas/tests/series/fixtures/not_indexed_label_series_with_granularity.yaml index 1e593aadf..1cc21c8dd 100644 --- a/gooddata-pandas/tests/series/fixtures/not_indexed_label_series_with_granularity.yaml +++ b/gooddata-pandas/tests/series/fixtures/not_indexed_label_series_with_granularity.yaml @@ -500,6 +500,8 @@ interactions: labelValue: West primaryLabelValue: West grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 17 diff --git a/gooddata-pandas/tests/series/fixtures/not_indexed_metric_series.yaml b/gooddata-pandas/tests/series/fixtures/not_indexed_metric_series.yaml index d49383be6..b20359d24 100644 --- a/gooddata-pandas/tests/series/fixtures/not_indexed_metric_series.yaml +++ b/gooddata-pandas/tests/series/fixtures/not_indexed_metric_series.yaml @@ -185,6 +185,8 @@ interactions: - measureHeader: measureIndex: 0 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 1 diff --git a/gooddata-pandas/tests/series/fixtures/not_indexed_metric_series_with_granularity.yaml b/gooddata-pandas/tests/series/fixtures/not_indexed_metric_series_with_granularity.yaml index 0bf3e6c79..3d8506951 100644 --- a/gooddata-pandas/tests/series/fixtures/not_indexed_metric_series_with_granularity.yaml +++ b/gooddata-pandas/tests/series/fixtures/not_indexed_metric_series_with_granularity.yaml @@ -362,6 +362,8 @@ interactions: labelValue: West primaryLabelValue: West grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 1 diff --git a/gooddata-pandas/tests/series/fixtures/simple_index_filtered_series.yaml b/gooddata-pandas/tests/series/fixtures/simple_index_filtered_series.yaml index a027f87a6..b9803436c 100644 --- a/gooddata-pandas/tests/series/fixtures/simple_index_filtered_series.yaml +++ b/gooddata-pandas/tests/series/fixtures/simple_index_filtered_series.yaml @@ -420,6 +420,8 @@ interactions: labelValue: Midwest primaryLabelValue: Midwest grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 1 diff --git a/gooddata-pandas/tests/series/fixtures/simple_index_label_series.yaml b/gooddata-pandas/tests/series/fixtures/simple_index_label_series.yaml index 60a6cedd7..2791a60a3 100644 --- a/gooddata-pandas/tests/series/fixtures/simple_index_label_series.yaml +++ b/gooddata-pandas/tests/series/fixtures/simple_index_label_series.yaml @@ -336,6 +336,8 @@ interactions: labelValue: West primaryLabelValue: West grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 5 diff --git a/gooddata-pandas/tests/series/fixtures/simple_index_metric_series.yaml b/gooddata-pandas/tests/series/fixtures/simple_index_metric_series.yaml index 0bf3e6c79..3d8506951 100644 --- a/gooddata-pandas/tests/series/fixtures/simple_index_metric_series.yaml +++ b/gooddata-pandas/tests/series/fixtures/simple_index_metric_series.yaml @@ -362,6 +362,8 @@ interactions: labelValue: West primaryLabelValue: West grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 1 diff --git a/gooddata-sdk/gooddata_sdk/compute/model/execution.py b/gooddata-sdk/gooddata_sdk/compute/model/execution.py index 55615f69c..b8028c474 100644 --- a/gooddata-sdk/gooddata_sdk/compute/model/execution.py +++ b/gooddata-sdk/gooddata_sdk/compute/model/execution.py @@ -225,6 +225,7 @@ def __init__(self, result: models.ExecutionResult): self._headers: list[models.DimensionHeader] = result["dimension_headers"] self._grand_totals: list[models.ExecutionResultGrandTotal] = result["grand_totals"] self._paging: models.ExecutionResultPaging = result["paging"] + self._metadata: models.ExecutionResultMetadata = result["metadata"] @property def data(self) -> list[Any]: @@ -254,6 +255,10 @@ def paging_count(self) -> list[int]: def paging_offset(self) -> list[int]: return self._paging["offset"] + @property + def metadata(self) -> models.ExecutionResultMetadata: + return self._metadata + def is_complete(self, dim: int = 0) -> bool: return self.paging_offset[dim] + self.paging_count[dim] >= self.paging_total[dim] diff --git a/gooddata-sdk/tests/table/fixtures/table_with_attribute_and_metric.yaml b/gooddata-sdk/tests/table/fixtures/table_with_attribute_and_metric.yaml index 35ad8e211..02810e82d 100644 --- a/gooddata-sdk/tests/table/fixtures/table_with_attribute_and_metric.yaml +++ b/gooddata-sdk/tests/table/fixtures/table_with_attribute_and_metric.yaml @@ -232,6 +232,8 @@ interactions: - measureHeader: measureIndex: 0 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 5 diff --git a/gooddata-sdk/tests/table/fixtures/table_with_attribute_metric_and_filter.yaml b/gooddata-sdk/tests/table/fixtures/table_with_attribute_metric_and_filter.yaml index 43989b70c..604113263 100644 --- a/gooddata-sdk/tests/table/fixtures/table_with_attribute_metric_and_filter.yaml +++ b/gooddata-sdk/tests/table/fixtures/table_with_attribute_metric_and_filter.yaml @@ -227,6 +227,8 @@ interactions: - measureHeader: measureIndex: 0 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 2 diff --git a/gooddata-sdk/tests/table/fixtures/table_with_attribute_show_all_values.yaml b/gooddata-sdk/tests/table/fixtures/table_with_attribute_show_all_values.yaml index 6acd74fce..5abe19de9 100644 --- a/gooddata-sdk/tests/table/fixtures/table_with_attribute_show_all_values.yaml +++ b/gooddata-sdk/tests/table/fixtures/table_with_attribute_show_all_values.yaml @@ -417,6 +417,8 @@ interactions: - measureHeader: measureIndex: 0 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 51 @@ -847,6 +849,8 @@ interactions: - measureHeader: measureIndex: 0 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 50 @@ -1201,6 +1205,8 @@ interactions: - measureHeader: measureIndex: 0 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 31 diff --git a/gooddata-sdk/tests/table/fixtures/table_with_just_attribute.yaml b/gooddata-sdk/tests/table/fixtures/table_with_just_attribute.yaml index 39ed0079d..de2c3b3c5 100644 --- a/gooddata-sdk/tests/table/fixtures/table_with_just_attribute.yaml +++ b/gooddata-sdk/tests/table/fixtures/table_with_just_attribute.yaml @@ -205,6 +205,8 @@ interactions: labelValue: West primaryLabelValue: West grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 5 diff --git a/gooddata-sdk/tests/table/fixtures/table_with_just_metric.yaml b/gooddata-sdk/tests/table/fixtures/table_with_just_metric.yaml index ac4c0ef5b..4de1bd7c4 100644 --- a/gooddata-sdk/tests/table/fixtures/table_with_just_metric.yaml +++ b/gooddata-sdk/tests/table/fixtures/table_with_just_metric.yaml @@ -186,6 +186,8 @@ interactions: - measureHeader: measureIndex: 0 grandTotals: [] + metadata: + dataSourceMessages: [] paging: count: - 1 diff --git a/pyproject.toml b/pyproject.toml index f709f8af8..310271565 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,6 +44,8 @@ target-version = "py39" [tool.ruff.format] exclude = ['(gooddata-api-client|.*\.snapshot\..*)'] +# use ruff to format code examples in docstrings as well +docstring-code-format = true [tool.ruff.lint.pydocstyle] convention = "google" diff --git a/schemas/gooddata-afm-client.json b/schemas/gooddata-afm-client.json index acced67d7..bb1119bea 100644 --- a/schemas/gooddata-afm-client.json +++ b/schemas/gooddata-afm-client.json @@ -1652,6 +1652,9 @@ }, "type": "array" }, + "metadata": { + "$ref": "#/components/schemas/ExecutionResultMetadata" + }, "paging": { "$ref": "#/components/schemas/ExecutionResultPaging" } @@ -1660,10 +1663,38 @@ "data", "dimensionHeaders", "grandTotals", + "metadata", "paging" ], "type": "object" }, + "ExecutionResultDataSourceMessage": { + "description": "A piece of extra information related to the results (e.g. debug information, warnings, etc.).", + "properties": { + "correlationId": { + "description": "Id correlating different pieces of supplementary info together.", + "type": "string" + }, + "data": { + "description": "Data of this particular supplementary info item: a free-form JSON specific to the particular supplementary info item type.", + "type": "object" + }, + "source": { + "description": "Information about what part of the system created this piece of supplementary info.", + "type": "string" + }, + "type": { + "description": "Type of the supplementary info instance. There are currently no well-known values for this, but there might be some in the future.", + "type": "string" + } + }, + "required": [ + "correlationId", + "source", + "type" + ], + "type": "object" + }, "ExecutionResultGrandTotal": { "description": "Contains the data of grand totals with the same dimensions.", "properties": { @@ -1722,6 +1753,22 @@ ], "type": "object" }, + "ExecutionResultMetadata": { + "description": "Additional metadata for the particular execution result.", + "properties": { + "dataSourceMessages": { + "description": "Additional information sent by the underlying data source.", + "items": { + "$ref": "#/components/schemas/ExecutionResultDataSourceMessage" + }, + "type": "array" + } + }, + "required": [ + "dataSourceMessages" + ], + "type": "object" + }, "ExecutionResultPaging": { "description": "A paging information related to the data presented in the execution result. These paging information are multi-dimensional.", "properties": { @@ -3475,7 +3522,7 @@ }, "/api/v1/actions/workspaces/{workspaceId}/execution/afm/cancel": { "post": { - "description": "Each cancel token corresponds to one unique execution request for the same result id. If all cancel tokens for the same result id are applied, the execution for this result id is canceled.", + "description": "Each cancel token corresponds to one unique execution request for the same result id. If all cancel tokens for the same result id are applied, the execution for this result id is cancelled.", "operationId": "cancelExecutions", "parameters": [ { @@ -3508,7 +3555,7 @@ } } }, - "description": "Status of the cancelling operation." + "description": "Status of the cancellation operation." } }, "summary": "Applies all the given cancel tokens.", diff --git a/schemas/gooddata-api-client.json b/schemas/gooddata-api-client.json index 6afe8e984..2d4dfc54a 100644 --- a/schemas/gooddata-api-client.json +++ b/schemas/gooddata-api-client.json @@ -3213,7 +3213,8 @@ "SINGLESTORE", "MOTHERDUCK", "FLEXCONNECT", - "STARROCKS" + "STARROCKS", + "ATHENA" ], "example": "POSTGRESQL", "type": "string" @@ -4598,6 +4599,7 @@ "EXPORT_TABULAR", "EXPORT_PDF", "CREATE_AUTOMATION", + "USE_AI_ASSISTANT", "CREATE_FILTER_VIEW", "VIEW" ], @@ -5239,6 +5241,7 @@ "columnName", "id", "title", + "workspace", "workspaceDataFilterSettings" ], "type": "object" @@ -5377,6 +5380,7 @@ "EXPORT_TABULAR", "EXPORT_PDF", "CREATE_AUTOMATION", + "USE_AI_ASSISTANT", "CREATE_FILTER_VIEW", "VIEW" ], @@ -6005,6 +6009,9 @@ }, "type": "array" }, + "metadata": { + "$ref": "#/components/schemas/ExecutionResultMetadata" + }, "paging": { "$ref": "#/components/schemas/ExecutionResultPaging" } @@ -6013,10 +6020,38 @@ "data", "dimensionHeaders", "grandTotals", + "metadata", "paging" ], "type": "object" }, + "ExecutionResultDataSourceMessage": { + "description": "A piece of extra information related to the results (e.g. debug information, warnings, etc.).", + "properties": { + "correlationId": { + "description": "Id correlating different pieces of supplementary info together.", + "type": "string" + }, + "data": { + "description": "Data of this particular supplementary info item: a free-form JSON specific to the particular supplementary info item type.", + "type": "object" + }, + "source": { + "description": "Information about what part of the system created this piece of supplementary info.", + "type": "string" + }, + "type": { + "description": "Type of the supplementary info instance. There are currently no well-known values for this, but there might be some in the future.", + "type": "string" + } + }, + "required": [ + "correlationId", + "source", + "type" + ], + "type": "object" + }, "ExecutionResultGrandTotal": { "description": "Contains the data of grand totals with the same dimensions.", "properties": { @@ -6075,6 +6110,22 @@ ], "type": "object" }, + "ExecutionResultMetadata": { + "description": "Additional metadata for the particular execution result.", + "properties": { + "dataSourceMessages": { + "description": "Additional information sent by the underlying data source.", + "items": { + "$ref": "#/components/schemas/ExecutionResultDataSourceMessage" + }, + "type": "array" + } + }, + "required": [ + "dataSourceMessages" + ], + "type": "object" + }, "ExecutionResultPaging": { "description": "A paging information related to the data presented in the execution result. These paging information are multi-dimensional.", "properties": { @@ -10372,7 +10423,8 @@ "SINGLESTORE", "MOTHERDUCK", "FLEXCONNECT", - "STARROCKS" + "STARROCKS", + "ATHENA" ], "type": "string" } @@ -10578,7 +10630,8 @@ "SINGLESTORE", "MOTHERDUCK", "FLEXCONNECT", - "STARROCKS" + "STARROCKS", + "ATHENA" ], "type": "string" }, @@ -10742,7 +10795,8 @@ "SINGLESTORE", "MOTHERDUCK", "FLEXCONNECT", - "STARROCKS" + "STARROCKS", + "ATHENA" ], "type": "string" }, @@ -10960,7 +11014,8 @@ "SINGLESTORE", "MOTHERDUCK", "FLEXCONNECT", - "STARROCKS" + "STARROCKS", + "ATHENA" ], "type": "string" }, @@ -19215,6 +19270,7 @@ "EXPORT_TABULAR", "EXPORT_PDF", "CREATE_AUTOMATION", + "USE_AI_ASSISTANT", "CREATE_FILTER_VIEW", "VIEW" ], @@ -22498,7 +22554,8 @@ "SINGLESTORE", "MOTHERDUCK", "FLEXCONNECT", - "STARROCKS" + "STARROCKS", + "ATHENA" ], "example": "POSTGRESQL", "type": "string" @@ -23072,6 +23129,7 @@ "EXPORT_TABULAR", "EXPORT_PDF", "CREATE_AUTOMATION", + "USE_AI_ASSISTANT", "CREATE_FILTER_VIEW", "VIEW" ], @@ -23095,6 +23153,7 @@ "EXPORT_TABULAR", "EXPORT_PDF", "CREATE_AUTOMATION", + "USE_AI_ASSISTANT", "CREATE_FILTER_VIEW", "VIEW" ], @@ -23481,6 +23540,7 @@ "EXPORT_TABULAR", "EXPORT_PDF", "CREATE_AUTOMATION", + "USE_AI_ASSISTANT", "CREATE_FILTER_VIEW", "VIEW" ], @@ -23497,6 +23557,7 @@ "EXPORT_TABULAR", "EXPORT_PDF", "CREATE_AUTOMATION", + "USE_AI_ASSISTANT", "CREATE_FILTER_VIEW", "VIEW" ], @@ -25779,7 +25840,7 @@ }, "/api/v1/actions/workspaces/{workspaceId}/execution/afm/cancel": { "post": { - "description": "Each cancel token corresponds to one unique execution request for the same result id. If all cancel tokens for the same result id are applied, the execution for this result id is canceled.", + "description": "Each cancel token corresponds to one unique execution request for the same result id. If all cancel tokens for the same result id are applied, the execution for this result id is cancelled.", "operationId": "cancelExecutions", "parameters": [ { @@ -25812,7 +25873,7 @@ } } }, - "description": "Status of the cancelling operation." + "description": "Status of the cancellation operation." } }, "summary": "Applies all the given cancel tokens.", diff --git a/schemas/gooddata-metadata-client.json b/schemas/gooddata-metadata-client.json index bd70c3a59..635433fca 100644 --- a/schemas/gooddata-metadata-client.json +++ b/schemas/gooddata-metadata-client.json @@ -1965,7 +1965,8 @@ "SINGLESTORE", "MOTHERDUCK", "FLEXCONNECT", - "STARROCKS" + "STARROCKS", + "ATHENA" ], "example": "POSTGRESQL", "type": "string" @@ -3350,6 +3351,7 @@ "EXPORT_TABULAR", "EXPORT_PDF", "CREATE_AUTOMATION", + "USE_AI_ASSISTANT", "CREATE_FILTER_VIEW", "VIEW" ], @@ -3975,6 +3977,7 @@ "columnName", "id", "title", + "workspace", "workspaceDataFilterSettings" ], "type": "object" @@ -4113,6 +4116,7 @@ "EXPORT_TABULAR", "EXPORT_PDF", "CREATE_AUTOMATION", + "USE_AI_ASSISTANT", "CREATE_FILTER_VIEW", "VIEW" ], @@ -8324,7 +8328,8 @@ "SINGLESTORE", "MOTHERDUCK", "FLEXCONNECT", - "STARROCKS" + "STARROCKS", + "ATHENA" ], "type": "string" } @@ -8530,7 +8535,8 @@ "SINGLESTORE", "MOTHERDUCK", "FLEXCONNECT", - "STARROCKS" + "STARROCKS", + "ATHENA" ], "type": "string" }, @@ -8694,7 +8700,8 @@ "SINGLESTORE", "MOTHERDUCK", "FLEXCONNECT", - "STARROCKS" + "STARROCKS", + "ATHENA" ], "type": "string" }, @@ -8912,7 +8919,8 @@ "SINGLESTORE", "MOTHERDUCK", "FLEXCONNECT", - "STARROCKS" + "STARROCKS", + "ATHENA" ], "type": "string" }, @@ -17167,6 +17175,7 @@ "EXPORT_TABULAR", "EXPORT_PDF", "CREATE_AUTOMATION", + "USE_AI_ASSISTANT", "CREATE_FILTER_VIEW", "VIEW" ], @@ -19492,6 +19501,7 @@ "EXPORT_TABULAR", "EXPORT_PDF", "CREATE_AUTOMATION", + "USE_AI_ASSISTANT", "CREATE_FILTER_VIEW", "VIEW" ], @@ -19515,6 +19525,7 @@ "EXPORT_TABULAR", "EXPORT_PDF", "CREATE_AUTOMATION", + "USE_AI_ASSISTANT", "CREATE_FILTER_VIEW", "VIEW" ], @@ -19743,6 +19754,7 @@ "EXPORT_TABULAR", "EXPORT_PDF", "CREATE_AUTOMATION", + "USE_AI_ASSISTANT", "CREATE_FILTER_VIEW", "VIEW" ], @@ -19759,6 +19771,7 @@ "EXPORT_TABULAR", "EXPORT_PDF", "CREATE_AUTOMATION", + "USE_AI_ASSISTANT", "CREATE_FILTER_VIEW", "VIEW" ], diff --git a/schemas/gooddata-scan-client.json b/schemas/gooddata-scan-client.json index fa72deedd..7a57bd8ad 100644 --- a/schemas/gooddata-scan-client.json +++ b/schemas/gooddata-scan-client.json @@ -628,7 +628,8 @@ "SINGLESTORE", "MOTHERDUCK", "FLEXCONNECT", - "STARROCKS" + "STARROCKS", + "ATHENA" ], "example": "POSTGRESQL", "type": "string"