semantic-link-labs 0.6.0__py3-none-any.whl → 0.7.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of semantic-link-labs might be problematic. Click here for more details.

Files changed (104) hide show
  1. semantic_link_labs-0.7.1.dist-info/METADATA +148 -0
  2. semantic_link_labs-0.7.1.dist-info/RECORD +111 -0
  3. {semantic_link_labs-0.6.0.dist-info → semantic_link_labs-0.7.1.dist-info}/WHEEL +1 -1
  4. sempy_labs/__init__.py +26 -2
  5. sempy_labs/_ai.py +3 -65
  6. sempy_labs/_bpa_translation/_translations_am-ET.po +828 -0
  7. sempy_labs/_bpa_translation/_translations_ar-AE.po +860 -0
  8. sempy_labs/_bpa_translation/_translations_cs-CZ.po +894 -0
  9. sempy_labs/_bpa_translation/_translations_da-DK.po +894 -0
  10. sempy_labs/_bpa_translation/_translations_de-DE.po +933 -0
  11. sempy_labs/_bpa_translation/_translations_el-GR.po +936 -0
  12. sempy_labs/_bpa_translation/_translations_es-ES.po +915 -0
  13. sempy_labs/_bpa_translation/_translations_fa-IR.po +883 -0
  14. sempy_labs/_bpa_translation/_translations_fr-FR.po +938 -0
  15. sempy_labs/_bpa_translation/_translations_ga-IE.po +912 -0
  16. sempy_labs/_bpa_translation/_translations_he-IL.po +855 -0
  17. sempy_labs/_bpa_translation/_translations_hi-IN.po +892 -0
  18. sempy_labs/_bpa_translation/_translations_hu-HU.po +910 -0
  19. sempy_labs/_bpa_translation/_translations_is-IS.po +887 -0
  20. sempy_labs/_bpa_translation/_translations_it-IT.po +931 -0
  21. sempy_labs/_bpa_translation/_translations_ja-JP.po +805 -0
  22. sempy_labs/_bpa_translation/_translations_nl-NL.po +924 -0
  23. sempy_labs/_bpa_translation/_translations_pl-PL.po +913 -0
  24. sempy_labs/_bpa_translation/_translations_pt-BR.po +909 -0
  25. sempy_labs/_bpa_translation/_translations_pt-PT.po +904 -0
  26. sempy_labs/_bpa_translation/_translations_ru-RU.po +909 -0
  27. sempy_labs/_bpa_translation/_translations_ta-IN.po +922 -0
  28. sempy_labs/_bpa_translation/_translations_te-IN.po +896 -0
  29. sempy_labs/_bpa_translation/_translations_th-TH.po +873 -0
  30. sempy_labs/_bpa_translation/_translations_zh-CN.po +767 -0
  31. sempy_labs/_bpa_translation/_translations_zu-ZA.po +916 -0
  32. sempy_labs/_clear_cache.py +9 -4
  33. sempy_labs/_generate_semantic_model.py +30 -56
  34. sempy_labs/_helper_functions.py +361 -14
  35. sempy_labs/_icons.py +10 -1
  36. sempy_labs/_list_functions.py +539 -260
  37. sempy_labs/_model_bpa.py +194 -18
  38. sempy_labs/_model_bpa_bulk.py +367 -0
  39. sempy_labs/_model_bpa_rules.py +19 -8
  40. sempy_labs/_model_dependencies.py +12 -10
  41. sempy_labs/_one_lake_integration.py +7 -7
  42. sempy_labs/_query_scale_out.py +61 -96
  43. sempy_labs/_refresh_semantic_model.py +7 -0
  44. sempy_labs/_translations.py +154 -1
  45. sempy_labs/_vertipaq.py +103 -90
  46. sempy_labs/directlake/__init__.py +5 -1
  47. sempy_labs/directlake/_directlake_schema_compare.py +27 -31
  48. sempy_labs/directlake/_directlake_schema_sync.py +55 -66
  49. sempy_labs/directlake/_dl_helper.py +233 -0
  50. sempy_labs/directlake/_get_directlake_lakehouse.py +6 -7
  51. sempy_labs/directlake/_get_shared_expression.py +1 -1
  52. sempy_labs/directlake/_guardrails.py +17 -13
  53. sempy_labs/directlake/_update_directlake_partition_entity.py +54 -30
  54. sempy_labs/directlake/_warm_cache.py +1 -1
  55. sempy_labs/lakehouse/__init__.py +2 -0
  56. sempy_labs/lakehouse/_get_lakehouse_tables.py +61 -69
  57. sempy_labs/lakehouse/_lakehouse.py +66 -9
  58. sempy_labs/lakehouse/_shortcuts.py +1 -1
  59. sempy_labs/migration/_create_pqt_file.py +174 -182
  60. sempy_labs/migration/_migrate_calctables_to_lakehouse.py +236 -268
  61. sempy_labs/migration/_migrate_calctables_to_semantic_model.py +75 -73
  62. sempy_labs/migration/_migrate_model_objects_to_semantic_model.py +442 -426
  63. sempy_labs/migration/_migrate_tables_columns_to_semantic_model.py +91 -97
  64. sempy_labs/migration/_refresh_calc_tables.py +92 -101
  65. sempy_labs/report/_BPAReportTemplate.json +232 -0
  66. sempy_labs/report/__init__.py +6 -2
  67. sempy_labs/report/_bpareporttemplate/.pbi/localSettings.json +9 -0
  68. sempy_labs/report/_bpareporttemplate/.platform +11 -0
  69. sempy_labs/report/_bpareporttemplate/StaticResources/SharedResources/BaseThemes/CY24SU06.json +710 -0
  70. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/page.json +11 -0
  71. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/1b08bce3bebabb0a27a8/visual.json +191 -0
  72. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/2f22ddb70c301693c165/visual.json +438 -0
  73. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/3b1182230aa6c600b43a/visual.json +127 -0
  74. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/58577ba6380c69891500/visual.json +576 -0
  75. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/a2a8fa5028b3b776c96c/visual.json +207 -0
  76. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/adfd47ef30652707b987/visual.json +506 -0
  77. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/b6a80ee459e716e170b1/visual.json +127 -0
  78. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/ce3130a721c020cc3d81/visual.json +513 -0
  79. sempy_labs/report/_bpareporttemplate/definition/pages/92735ae19b31712208ad/page.json +8 -0
  80. sempy_labs/report/_bpareporttemplate/definition/pages/92735ae19b31712208ad/visuals/66e60dfb526437cd78d1/visual.json +112 -0
  81. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/page.json +11 -0
  82. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/07deb8bce824e1be37d7/visual.json +513 -0
  83. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/0b1c68838818b32ad03b/visual.json +352 -0
  84. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/0c171de9d2683d10b930/visual.json +37 -0
  85. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/0efa01be0510e40a645e/visual.json +542 -0
  86. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/6bf2f0eb830ab53cc668/visual.json +221 -0
  87. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/88d8141cb8500b60030c/visual.json +127 -0
  88. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/a753273590beed656a03/visual.json +576 -0
  89. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/b8fdc82cddd61ac447bc/visual.json +127 -0
  90. sempy_labs/report/_bpareporttemplate/definition/pages/d37dce724a0ccc30044b/page.json +9 -0
  91. sempy_labs/report/_bpareporttemplate/definition/pages/d37dce724a0ccc30044b/visuals/ce8532a7e25020271077/visual.json +38 -0
  92. sempy_labs/report/_bpareporttemplate/definition/pages/pages.json +10 -0
  93. sempy_labs/report/_bpareporttemplate/definition/report.json +176 -0
  94. sempy_labs/report/_bpareporttemplate/definition/version.json +4 -0
  95. sempy_labs/report/_bpareporttemplate/definition.pbir +14 -0
  96. sempy_labs/report/_generate_report.py +255 -139
  97. sempy_labs/report/_report_functions.py +26 -33
  98. sempy_labs/report/_report_rebind.py +31 -26
  99. sempy_labs/tom/_model.py +75 -58
  100. semantic_link_labs-0.6.0.dist-info/METADATA +0 -22
  101. semantic_link_labs-0.6.0.dist-info/RECORD +0 -54
  102. sempy_labs/directlake/_fallback.py +0 -60
  103. {semantic_link_labs-0.6.0.dist-info → semantic_link_labs-0.7.1.dist-info}/LICENSE +0 -0
  104. {semantic_link_labs-0.6.0.dist-info → semantic_link_labs-0.7.1.dist-info}/top_level.txt +0 -0
@@ -1,9 +1,12 @@
1
1
  import sempy.fabric as fabric
2
2
  import re
3
3
  import datetime
4
- import time
5
4
  from sempy_labs.lakehouse._get_lakehouse_tables import get_lakehouse_tables
6
- from sempy_labs._helper_functions import resolve_lakehouse_name, format_dax_object_name
5
+ from sempy_labs._helper_functions import (
6
+ resolve_lakehouse_name,
7
+ format_dax_object_name,
8
+ retry,
9
+ )
7
10
  from sempy_labs.tom import connect_semantic_model
8
11
  from typing import Optional
9
12
  from sempy._utils._log import log
@@ -76,74 +79,73 @@ def migrate_calc_tables_to_semantic_model(
76
79
  )
77
80
  return
78
81
 
79
- start_time = datetime.datetime.now()
80
- timeout = datetime.timedelta(minutes=1)
81
- success = False
82
-
83
- while not success:
84
- try:
85
- with connect_semantic_model(
86
- dataset=new_dataset, readonly=False, workspace=new_dataset_workspace
87
- ) as tom:
88
- success = True
89
- for tName in dfC_filt["Table Name"].unique():
90
- if tName.lower() in lc["Table Name"].values:
91
- if not any(t.Name == tName for t in tom.model.Tables):
92
- tom.add_table(name=tName)
93
- tom.add_entity_partition(
94
- table_name=tName,
95
- entity_name=tName.replace(" ", "_").lower(),
96
- )
97
-
98
- columns_in_table = dfC_filt.loc[
99
- dfC_filt["Table Name"] == tName, "Column Name"
100
- ].unique()
101
-
102
- for cName in columns_in_table:
103
- scName = dfC.loc[
104
- (dfC["Table Name"] == tName)
105
- & (dfC["Column Name"] == cName),
106
- "Source",
107
- ].iloc[0]
108
- cDataType = dfC.loc[
109
- (dfC["Table Name"] == tName)
110
- & (dfC["Column Name"] == cName),
111
- "Data Type",
112
- ].iloc[0]
113
- # cType = dfC.loc[
114
- # (dfC["Table Name"] == tName)
115
- # & (dfC["Column Name"] == cName),
116
- # "Type",
117
- # ].iloc[0]
118
-
119
- # av = tom.get_annotation_value(object = tom.model, name = tName)
120
-
121
- # if cType == 'CalculatedTableColumn':
122
- # lakeColumn = scName.replace(' ','_')
123
- # elif cType == 'Calculated':
124
- pattern = r"\[([^]]+)\]"
125
-
126
- matches = re.findall(pattern, scName)
127
- lakeColumn = matches[0].replace(" ", "")
128
- if not any(
129
- c.Name == cName and c.Parent.Name == tName
130
- for c in tom.all_columns()
131
- ):
132
- tom.add_data_column(
133
- table_name=tName,
134
- column_name=cName,
135
- source_column=lakeColumn,
136
- data_type=cDataType,
137
- )
138
- print(
139
- f"{icons.green_dot} The {format_dax_object_name(tName,cName)} column has been added."
140
- )
141
-
142
- print(
143
- f"\n{icons.green_dot} All viable calculated tables have been added to the model."
144
- )
145
-
146
- except Exception:
147
- if datetime.datetime.now() - start_time > timeout:
148
- break
149
- time.sleep(1)
82
+ @retry(
83
+ sleep_time=1,
84
+ timeout_error_message=f"{icons.red_dot} Function timed out after 1 minute",
85
+ )
86
+ def dyn_connect():
87
+ with connect_semantic_model(
88
+ dataset=new_dataset, readonly=True, workspace=new_dataset_workspace
89
+ ) as tom:
90
+
91
+ tom.model
92
+
93
+ dyn_connect()
94
+
95
+ with connect_semantic_model(
96
+ dataset=new_dataset, readonly=False, workspace=new_dataset_workspace
97
+ ) as tom:
98
+ for tName in dfC_filt["Table Name"].unique():
99
+ if tName.lower() in lc["Table Name"].values:
100
+ if not any(t.Name == tName for t in tom.model.Tables):
101
+ tom.add_table(name=tName)
102
+ tom.add_entity_partition(
103
+ table_name=tName,
104
+ entity_name=tName.replace(" ", "_").lower(),
105
+ )
106
+
107
+ columns_in_table = dfC_filt.loc[
108
+ dfC_filt["Table Name"] == tName, "Column Name"
109
+ ].unique()
110
+
111
+ for cName in columns_in_table:
112
+ scName = dfC.loc[
113
+ (dfC["Table Name"] == tName) & (dfC["Column Name"] == cName),
114
+ "Source",
115
+ ].iloc[0]
116
+ cDataType = dfC.loc[
117
+ (dfC["Table Name"] == tName) & (dfC["Column Name"] == cName),
118
+ "Data Type",
119
+ ].iloc[0]
120
+ # cType = dfC.loc[
121
+ # (dfC["Table Name"] == tName)
122
+ # & (dfC["Column Name"] == cName),
123
+ # "Type",
124
+ # ].iloc[0]
125
+
126
+ # av = tom.get_annotation_value(object = tom.model, name = tName)
127
+
128
+ # if cType == 'CalculatedTableColumn':
129
+ # lakeColumn = scName.replace(' ','_')
130
+ # elif cType == 'Calculated':
131
+ pattern = r"\[([^]]+)\]"
132
+
133
+ matches = re.findall(pattern, scName)
134
+ lakeColumn = matches[0].replace(" ", "")
135
+ if not any(
136
+ c.Name == cName and c.Parent.Name == tName
137
+ for c in tom.all_columns()
138
+ ):
139
+ tom.add_data_column(
140
+ table_name=tName,
141
+ column_name=cName,
142
+ source_column=lakeColumn,
143
+ data_type=cDataType,
144
+ )
145
+ print(
146
+ f"{icons.green_dot} The {format_dax_object_name(tName,cName)} column has been added."
147
+ )
148
+
149
+ print(
150
+ f"\n{icons.green_dot} All viable calculated tables have been added to the model."
151
+ )