Skip to content

Commit

Permalink
Merge pull request #158 from gooddata/xsh-837
Browse files Browse the repository at this point in the history
XSH-837: Allow returning local ids of header labels

Reviewed-by: Jan Kadlec
             https://github.com/hkad98
  • Loading branch information
gdgate committed Oct 10, 2022
2 parents e4e36d7 + 8264ede commit a88bda5
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 12 deletions.
3 changes: 3 additions & 0 deletions gooddata-pandas/gooddata_pandas/dataframe.py
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,7 @@ def for_exec_result_id(
result_cache_metadata: Optional[ResultCacheMetadata] = None,
result_size_dimensions_limits: ResultSizeDimensions = (),
result_size_bytes_limit: Optional[int] = None,
use_local_ids_in_headers: bool = False,
) -> pandas.DataFrame:
"""
Creates a data frame using an execution result's metadata identified by result_id. The data frame will respect
Expand Down Expand Up @@ -335,6 +336,7 @@ def for_exec_result_id(
:param result_cache_metadata: Metadata for the corresponding exec result. Optional.
:param result_size_dimensions_limits: A tuple containing maximum size of result dimensions. Optional.
:param result_size_bytes_limits: Maximum size of result in bytes. Optional.
:param use_local_ids_in_headers: Use local identifiers of header attributes and metrics. Optional.
:return: a new dataframe
"""
Expand All @@ -356,4 +358,5 @@ def for_exec_result_id(
label_overrides=label_overrides,
result_size_dimensions_limits=result_size_dimensions_limits,
result_size_bytes_limit=result_size_bytes_limit,
use_local_ids_in_headers=use_local_ids_in_headers,
)
50 changes: 38 additions & 12 deletions gooddata-pandas/gooddata_pandas/result_convertor.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,14 +197,19 @@ def _read_complete_execution_result(


def _create_header_mapper(
response: BareExecutionResponse, dim: int, label_overrides: Optional[LabelOverrides] = None
response: BareExecutionResponse,
dim: int,
label_overrides: Optional[LabelOverrides] = None,
use_local_ids_in_headers: bool = False,
) -> Callable[[Any, Optional[int]], str]:
"""
Prepares header mapper function which is doing header structures translations into appropriate label used
in a dataframe
:param response: Response structure to gather dimension header details
:param dim: dimension id
:param label_overrides: label overrides
:param use_local_ids_in_headers: Use local identifiers of header attributes and metrics. Optional.
:return: Mapper function
"""
if label_overrides is None:
Expand All @@ -223,20 +228,26 @@ def _mapper(header: Any, header_idx: Optional[int]) -> str:
label = header["attributeHeader"]["labelValue"]
elif "labelName" in header["attributeHeader"]:
attr_local_id = header["attributeHeader"]["localIdentifier"]
if attr_local_id in attribute_labels:
label = attribute_labels[attr_local_id]["title"]
if use_local_ids_in_headers:
label = attr_local_id
else:
label = header["attributeHeader"]["labelName"]
if attr_local_id in attribute_labels:
label = attribute_labels[attr_local_id]["title"]
else:
label = header["attributeHeader"]["labelName"]
elif "measureHeader" in header and header_idx is not None:
measure_idx = header["measureHeader"]["measureIndex"]
measure_descriptor = dim_descriptor["headers"][header_idx]["measureGroupHeaders"][measure_idx]

if measure_descriptor["localIdentifier"] in measure_labels:
label = measure_labels[measure_descriptor["localIdentifier"]]["title"]
elif "name" in measure_descriptor:
label = measure_descriptor["name"]
else:
if use_local_ids_in_headers:
label = measure_descriptor["localIdentifier"]
else:
if measure_descriptor["localIdentifier"] in measure_labels:
label = measure_labels[measure_descriptor["localIdentifier"]]["title"]
elif "name" in measure_descriptor:
label = measure_descriptor["name"]
else:
label = measure_descriptor["localIdentifier"]
elif "totalHeader" in header:
label = header["totalHeader"]["function"]
return label
Expand All @@ -249,11 +260,17 @@ def _headers_to_index(
headers: Tuple[_DataHeaders, Optional[_DataHeaders]],
response: BareExecutionResponse,
label_overrides: LabelOverrides,
use_local_ids_in_headers: bool = False,
) -> Optional[pandas.Index]:
if len(response.dimensions) <= dim_idx or not len(response.dimensions[dim_idx]["headers"]):
return None

mapper = _create_header_mapper(response=response, dim=dim_idx, label_overrides=label_overrides)
mapper = _create_header_mapper(
response=response,
dim=dim_idx,
label_overrides=label_overrides,
use_local_ids_in_headers=use_local_ids_in_headers,
)

return pandas.MultiIndex.from_arrays(
[
Expand Down Expand Up @@ -309,6 +326,7 @@ def convert_execution_response_to_dataframe(
label_overrides: LabelOverrides,
result_size_dimensions_limits: ResultSizeDimensions,
result_size_bytes_limit: Optional[int] = None,
use_local_ids_in_headers: bool = False,
) -> pandas.DataFrame:
"""
Converts execution result to a pandas dataframe, maintaining the dimensionality of the result.
Expand All @@ -332,9 +350,17 @@ def convert_execution_response_to_dataframe(
return pandas.DataFrame(
data=full_data,
index=_headers_to_index(
dim_idx=0, headers=full_headers, response=execution_response, label_overrides=label_overrides
dim_idx=0,
headers=full_headers,
response=execution_response,
label_overrides=label_overrides,
use_local_ids_in_headers=use_local_ids_in_headers,
),
columns=_headers_to_index(
dim_idx=1, headers=full_headers, response=execution_response, label_overrides=label_overrides
dim_idx=1,
headers=full_headers,
response=execution_response,
label_overrides=label_overrides,
use_local_ids_in_headers=use_local_ids_in_headers,
),
)

0 comments on commit a88bda5

Please sign in to comment.