|
9 | 9 |
|
10 | 10 | import json
|
11 | 11 | import math
|
12 |
| -from typing import Dict, Tuple, List, Optional |
| 12 | +from typing import Dict, Tuple, List, Optional, Iterable |
13 | 13 |
|
14 | 14 | import networkx as nx
|
15 | 15 | from requests import Response
|
|
22 | 22 | from TM1py.Services.SubsetService import SubsetService
|
23 | 23 | from TM1py.Utils.Utils import case_and_space_insensitive_equals, format_url, CaseAndSpaceInsensitiveDict, \
|
24 | 24 | CaseAndSpaceInsensitiveSet, CaseAndSpaceInsensitiveTuplesDict, require_pandas, require_data_admin, \
|
25 |
| - lower_and_drop_spaces, require_ops_admin, verify_version |
| 25 | + require_ops_admin, verify_version |
26 | 26 |
|
27 | 27 |
|
28 | 28 | class HierarchyService(ObjectService):
|
@@ -353,8 +353,9 @@ def remove_edges_under_consolidation(self, dimension_name: str, hierarchy_name:
|
353 | 353 | hierarchy = self.get(dimension_name, hierarchy_name)
|
354 | 354 | from TM1py.Services import ElementService
|
355 | 355 | 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)) |
358 | 359 | elements_under_consolidations.add(consolidation_element)
|
359 | 360 | remove_edges = []
|
360 | 361 | for (parent, component) in hierarchy.edges:
|
@@ -428,7 +429,7 @@ def update_or_create_hierarchy_from_dataframe(
|
428 | 429 | verify_edges: bool = True,
|
429 | 430 | element_type_column: str = 'ElementType',
|
430 | 431 | unwind_all: bool = False,
|
431 |
| - unwind_consolidation: list = None, |
| 432 | + unwind_consolidations: Iterable = None, |
432 | 433 | update_attribute_types: bool = False,
|
433 | 434 | **kwargs):
|
434 | 435 | """ 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(
|
459 | 460 | Abort early if edges contain a circular reference
|
460 | 461 | :param unwind_all: bool
|
461 | 462 | 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 |
464 | 466 | :param update_attribute_types: bool
|
465 | 467 | If True, function will delete and recreate attributes when a type change is requested.
|
466 | 468 | By default, function will not delete attributes.
|
@@ -493,10 +495,12 @@ def update_or_create_hierarchy_from_dataframe(
|
493 | 495 | if "unwind" in kwargs:
|
494 | 496 | unwind_all = kwargs["unwind"]
|
495 | 497 |
|
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 | + ) |
500 | 504 |
|
501 | 505 | # identify and sort level columns
|
502 | 506 | level_columns = []
|
@@ -650,20 +654,26 @@ def update_or_create_hierarchy_from_dataframe(
|
650 | 654 | if unwind_all:
|
651 | 655 | self.remove_all_edges(dimension_name=dimension_name, hierarchy_name=hierarchy_name)
|
652 | 656 | 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, |
664 | 662 | 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) |
667 | 677 |
|
668 | 678 | edges = CaseAndSpaceInsensitiveTuplesDict()
|
669 | 679 | 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(
|
694 | 704 | else:
|
695 | 705 | raise ex
|
696 | 706 |
|
697 |
| - delete_edges = { |
| 707 | + edges_to_delete = { |
698 | 708 | (k, v): w
|
699 | 709 | for (k, v), w
|
700 | 710 | in edges.items()
|
701 | 711 | if w != current_edges.get((k, v), w)}
|
702 |
| - if delete_edges: |
| 712 | + if edges_to_delete: |
703 | 713 | self.elements.delete_edges(
|
704 | 714 | dimension_name=dimension_name,
|
705 | 715 | hierarchy_name=hierarchy_name,
|
706 |
| - edges=delete_edges.keys(), |
| 716 | + edges=edges_to_delete.keys(), |
707 | 717 | use_blob=self.is_admin)
|
708 | 718 |
|
709 | 719 | new_edges = {
|
|
0 commit comments