From b8f9f96bcca8f7979ad499dc9d9f8e06ffe762a9 Mon Sep 17 00:00:00 2001 From: seolmin Date: Wed, 12 Feb 2025 16:50:42 +0900 Subject: [PATCH] feat: add sorting functionality to data tables and update related options Signed-off-by: seolmin --- .../data_table_manager/data_source_manager.py | 2 ++ .../data_transformation_manager.py | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/spaceone/dashboard/manager/data_table_manager/data_source_manager.py b/src/spaceone/dashboard/manager/data_table_manager/data_source_manager.py index 52a724d..364dff7 100644 --- a/src/spaceone/dashboard/manager/data_table_manager/data_source_manager.py +++ b/src/spaceone/dashboard/manager/data_table_manager/data_source_manager.py @@ -53,6 +53,7 @@ def __init__( self.group_by = options.get("group_by") self.filter = options.get("filter") self.filter_or = options.get("filter_or") + self.sort = options.get("sort") def get_data_and_labels_info(self) -> Tuple[dict, dict]: data_info = {self.data_name: {}} @@ -398,6 +399,7 @@ def _make_query( "filter": self.filter, "filter_or": self.filter_or, "fields": {self.data_name: {"key": data_key, "operator": "sum"}}, + "sort": self.sort, } def _add_none_value_group_by_columns(self) -> None: diff --git a/src/spaceone/dashboard/manager/data_table_manager/data_transformation_manager.py b/src/spaceone/dashboard/manager/data_table_manager/data_transformation_manager.py index 5bfe19a..bef16a9 100755 --- a/src/spaceone/dashboard/manager/data_table_manager/data_transformation_manager.py +++ b/src/spaceone/dashboard/manager/data_table_manager/data_transformation_manager.py @@ -49,6 +49,7 @@ def __init__( "PIVOT", "ADD_LABELS", "VALUE_MAPPING", + "SORT", ]: raise ERROR_NOT_SUPPORTED_OPERATOR(operator=operator) @@ -108,6 +109,8 @@ def load( self.add_labels_data_table(granularity, start, end, vars) elif self.operator == "VALUE_MAPPING": self.value_mapping_data_table(granularity, start, end, vars) + elif self.operator == "SORT": + self.sort_data_table(granularity, start, end, vars) self.state = "AVAILABLE" self.error_message = None @@ -506,6 +509,33 @@ def value_mapping_data_table( self.df = df + def sort_data_table( + self, + granularity: str = "MONTHLY", + start: str = None, + end: str = None, + vars: dict = None, + ) -> None: + data_table_vo = self.data_table_vos[0] + df = self._get_data_table(data_table_vo, granularity, start, end, vars) + + self.label_keys = list(data_table_vo.labels_info.keys()) + self.data_keys = list(data_table_vo.data_info.keys()) + + sort_options = self.options.get("sort") + for sort_option in sort_options: + if sort_option["key"] not in df.columns: + raise ERROR_INVALID_PARAMETER( + key="options.SORT.key", + reason=f"Invalid key: {sort_option['key']}", + ) + + sort_keys = [option["key"] for option in sort_options] + ascending_list = [not option.get("desc", False) for option in sort_options] + + df = df.sort_values(by=sort_keys, ascending=ascending_list) + self.df = df + def _get_data_table( self, data_table_vo: Union[PublicDataTable, PrivateDataTable],