Skip to content

Commit ed0f28c

Browse files
committed
Minor enhancements on update_consolidations arg
1 parent 1590311 commit ed0f28c

7 files changed

+1125
-490
lines changed

TM1py/Services/HierarchyService.py

+37-27
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
import json
1111
import math
12-
from typing import Dict, Tuple, List, Optional
12+
from typing import Dict, Tuple, List, Optional, Iterable
1313

1414
import networkx as nx
1515
from requests import Response
@@ -22,7 +22,7 @@
2222
from TM1py.Services.SubsetService import SubsetService
2323
from TM1py.Utils.Utils import case_and_space_insensitive_equals, format_url, CaseAndSpaceInsensitiveDict, \
2424
CaseAndSpaceInsensitiveSet, CaseAndSpaceInsensitiveTuplesDict, require_pandas, require_data_admin, \
25-
lower_and_drop_spaces, require_ops_admin, verify_version
25+
require_ops_admin, verify_version
2626

2727

2828
class HierarchyService(ObjectService):
@@ -353,8 +353,9 @@ def remove_edges_under_consolidation(self, dimension_name: str, hierarchy_name:
353353
hierarchy = self.get(dimension_name, hierarchy_name)
354354
from TM1py.Services import ElementService
355355
element_service = ElementService(self._rest)
356-
elements_under_consolidations = CaseAndSpaceInsensitiveSet(element_service.get_members_under_consolidation(dimension_name, hierarchy_name,
357-
consolidation_element))
356+
elements_under_consolidations = CaseAndSpaceInsensitiveSet(
357+
element_service.get_members_under_consolidation(dimension_name, hierarchy_name,
358+
consolidation_element))
358359
elements_under_consolidations.add(consolidation_element)
359360
remove_edges = []
360361
for (parent, component) in hierarchy.edges:
@@ -428,7 +429,7 @@ def update_or_create_hierarchy_from_dataframe(
428429
verify_edges: bool = True,
429430
element_type_column: str = 'ElementType',
430431
unwind_all: bool = False,
431-
unwind_consolidation: list = None,
432+
unwind_consolidations: Iterable = None,
432433
update_attribute_types: bool = False,
433434
**kwargs):
434435
""" Update or Create a hierarchy based on a dataframe, while never deleting existing elements.
@@ -459,8 +460,9 @@ def update_or_create_hierarchy_from_dataframe(
459460
Abort early if edges contain a circular reference
460461
:param unwind_all: bool
461462
Unwind hierarch before creating new edges
462-
:param unwind_consolidation: list
463-
Unwind a list specific consolidations in hierarch before creating new edges, if unwind_all is true, this list is ignored
463+
:param unwind_consolidations: list
464+
Unwind a list of specific consolidations in the hierarchy before creating new edges,
465+
if unwind_all is true, this list is ignored
464466
:param update_attribute_types: bool
465467
If True, function will delete and recreate attributes when a type change is requested.
466468
By default, function will not delete attributes.
@@ -493,10 +495,12 @@ def update_or_create_hierarchy_from_dataframe(
493495
if "unwind" in kwargs:
494496
unwind_all = kwargs["unwind"]
495497

496-
# verify unwind_consolidation is a list
497-
if unwind_consolidation is not None:
498-
if not isinstance(unwind_consolidation, list):
499-
raise ValueError(f"Inconsistent Type for 'unwind_consolidation': expected type-> list, current type-> '{type(unwind_consolidation)}'")
498+
if unwind_consolidations:
499+
if isinstance(unwind_consolidations, str) or not isinstance(unwind_consolidations, Iterable):
500+
raise ValueError(
501+
f"value for 'unwind_consolidations' must be an iterable (e.g., list), "
502+
f"but received: '{unwind_consolidations}' of type {type(unwind_consolidations).__name__}"
503+
)
500504

501505
# identify and sort level columns
502506
level_columns = []
@@ -650,20 +654,26 @@ def update_or_create_hierarchy_from_dataframe(
650654
if unwind_all:
651655
self.remove_all_edges(dimension_name=dimension_name, hierarchy_name=hierarchy_name)
652656
else:
653-
if unwind_consolidation is not None:
654-
all_edges = CaseAndSpaceInsensitiveTuplesDict()
655-
for elem in unwind_consolidation:
656-
if self.elements.exists(dimension_name=dimension_name, hierarchy_name=hierarchy_name, element_name=elem):
657-
temp_edges = self.elements.get_edges_under_consolidation(
658-
dimension_name=dimension_name,
659-
hierarchy_name=hierarchy_name,
660-
consolidation=elem)
661-
all_edges.join(temp_edges)
662-
self.elements.delete_edges(
663-
dimension_name=dimension_name,
657+
if unwind_consolidations:
658+
edges_to_delete = CaseAndSpaceInsensitiveTuplesDict()
659+
for elem in unwind_consolidations:
660+
if not self.elements.exists(
661+
dimension_name=dimension_name,
664662
hierarchy_name=hierarchy_name,
665-
edges=all_edges,
666-
use_ti=self.is_admin)
663+
element_name=elem):
664+
continue
665+
666+
edges_under_consolidation = self.elements.get_edges_under_consolidation(
667+
dimension_name=dimension_name,
668+
hierarchy_name=hierarchy_name,
669+
consolidation=elem)
670+
edges_to_delete.join(edges_under_consolidation)
671+
672+
self.elements.delete_edges(
673+
dimension_name=dimension_name,
674+
hierarchy_name=hierarchy_name,
675+
edges=edges_to_delete,
676+
use_blob=self.is_admin)
667677

668678
edges = CaseAndSpaceInsensitiveTuplesDict()
669679
for element_name, *record in df[[element_column, *level_columns, *level_weight_columns]].itertuples(
@@ -694,16 +704,16 @@ def update_or_create_hierarchy_from_dataframe(
694704
else:
695705
raise ex
696706

697-
delete_edges = {
707+
edges_to_delete = {
698708
(k, v): w
699709
for (k, v), w
700710
in edges.items()
701711
if w != current_edges.get((k, v), w)}
702-
if delete_edges:
712+
if edges_to_delete:
703713
self.elements.delete_edges(
704714
dimension_name=dimension_name,
705715
hierarchy_name=hierarchy_name,
706-
edges=delete_edges.keys(),
716+
edges=edges_to_delete.keys(),
707717
use_blob=self.is_admin)
708718

709719
new_edges = {

0 commit comments

Comments
 (0)