semantic-link-labs 0.5.0__py3-none-any.whl → 0.7.0__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 (113) hide show
  1. semantic_link_labs-0.7.0.dist-info/METADATA +148 -0
  2. semantic_link_labs-0.7.0.dist-info/RECORD +111 -0
  3. {semantic_link_labs-0.5.0.dist-info → semantic_link_labs-0.7.0.dist-info}/WHEEL +1 -1
  4. sempy_labs/__init__.py +45 -15
  5. sempy_labs/_ai.py +42 -85
  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 +12 -8
  33. sempy_labs/_connections.py +77 -70
  34. sempy_labs/_dax.py +7 -9
  35. sempy_labs/_generate_semantic_model.py +75 -90
  36. sempy_labs/_helper_functions.py +371 -20
  37. sempy_labs/_icons.py +23 -0
  38. sempy_labs/_list_functions.py +855 -427
  39. sempy_labs/_model_auto_build.py +4 -3
  40. sempy_labs/_model_bpa.py +307 -1118
  41. sempy_labs/_model_bpa_bulk.py +363 -0
  42. sempy_labs/_model_bpa_rules.py +831 -0
  43. sempy_labs/_model_dependencies.py +20 -16
  44. sempy_labs/_one_lake_integration.py +18 -12
  45. sempy_labs/_query_scale_out.py +116 -129
  46. sempy_labs/_refresh_semantic_model.py +23 -10
  47. sempy_labs/_translations.py +367 -288
  48. sempy_labs/_vertipaq.py +152 -123
  49. sempy_labs/directlake/__init__.py +7 -1
  50. sempy_labs/directlake/_directlake_schema_compare.py +33 -30
  51. sempy_labs/directlake/_directlake_schema_sync.py +60 -77
  52. sempy_labs/directlake/_dl_helper.py +233 -0
  53. sempy_labs/directlake/_get_directlake_lakehouse.py +7 -8
  54. sempy_labs/directlake/_get_shared_expression.py +5 -3
  55. sempy_labs/directlake/_guardrails.py +20 -16
  56. sempy_labs/directlake/_list_directlake_model_calc_tables.py +17 -10
  57. sempy_labs/directlake/_show_unsupported_directlake_objects.py +3 -2
  58. sempy_labs/directlake/_update_directlake_model_lakehouse_connection.py +10 -5
  59. sempy_labs/directlake/_update_directlake_partition_entity.py +169 -22
  60. sempy_labs/directlake/_warm_cache.py +7 -4
  61. sempy_labs/lakehouse/_get_lakehouse_columns.py +1 -1
  62. sempy_labs/lakehouse/_get_lakehouse_tables.py +65 -71
  63. sempy_labs/lakehouse/_lakehouse.py +5 -3
  64. sempy_labs/lakehouse/_shortcuts.py +20 -13
  65. sempy_labs/migration/__init__.py +1 -1
  66. sempy_labs/migration/_create_pqt_file.py +184 -186
  67. sempy_labs/migration/_migrate_calctables_to_lakehouse.py +240 -269
  68. sempy_labs/migration/_migrate_calctables_to_semantic_model.py +78 -77
  69. sempy_labs/migration/_migrate_model_objects_to_semantic_model.py +444 -425
  70. sempy_labs/migration/_migrate_tables_columns_to_semantic_model.py +96 -102
  71. sempy_labs/migration/_migration_validation.py +2 -2
  72. sempy_labs/migration/_refresh_calc_tables.py +94 -100
  73. sempy_labs/report/_BPAReportTemplate.json +232 -0
  74. sempy_labs/report/__init__.py +6 -2
  75. sempy_labs/report/_bpareporttemplate/.pbi/localSettings.json +9 -0
  76. sempy_labs/report/_bpareporttemplate/.platform +11 -0
  77. sempy_labs/report/_bpareporttemplate/StaticResources/SharedResources/BaseThemes/CY24SU06.json +710 -0
  78. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/page.json +11 -0
  79. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/1b08bce3bebabb0a27a8/visual.json +191 -0
  80. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/2f22ddb70c301693c165/visual.json +438 -0
  81. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/3b1182230aa6c600b43a/visual.json +127 -0
  82. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/58577ba6380c69891500/visual.json +576 -0
  83. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/a2a8fa5028b3b776c96c/visual.json +207 -0
  84. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/adfd47ef30652707b987/visual.json +506 -0
  85. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/b6a80ee459e716e170b1/visual.json +127 -0
  86. sempy_labs/report/_bpareporttemplate/definition/pages/01d72098bda5055bd500/visuals/ce3130a721c020cc3d81/visual.json +513 -0
  87. sempy_labs/report/_bpareporttemplate/definition/pages/92735ae19b31712208ad/page.json +8 -0
  88. sempy_labs/report/_bpareporttemplate/definition/pages/92735ae19b31712208ad/visuals/66e60dfb526437cd78d1/visual.json +112 -0
  89. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/page.json +11 -0
  90. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/07deb8bce824e1be37d7/visual.json +513 -0
  91. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/0b1c68838818b32ad03b/visual.json +352 -0
  92. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/0c171de9d2683d10b930/visual.json +37 -0
  93. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/0efa01be0510e40a645e/visual.json +542 -0
  94. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/6bf2f0eb830ab53cc668/visual.json +221 -0
  95. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/88d8141cb8500b60030c/visual.json +127 -0
  96. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/a753273590beed656a03/visual.json +576 -0
  97. sempy_labs/report/_bpareporttemplate/definition/pages/c597da16dc7e63222a82/visuals/b8fdc82cddd61ac447bc/visual.json +127 -0
  98. sempy_labs/report/_bpareporttemplate/definition/pages/d37dce724a0ccc30044b/page.json +9 -0
  99. sempy_labs/report/_bpareporttemplate/definition/pages/d37dce724a0ccc30044b/visuals/ce8532a7e25020271077/visual.json +38 -0
  100. sempy_labs/report/_bpareporttemplate/definition/pages/pages.json +10 -0
  101. sempy_labs/report/_bpareporttemplate/definition/report.json +176 -0
  102. sempy_labs/report/_bpareporttemplate/definition/version.json +4 -0
  103. sempy_labs/report/_bpareporttemplate/definition.pbir +14 -0
  104. sempy_labs/report/_generate_report.py +260 -139
  105. sempy_labs/report/_report_functions.py +90 -59
  106. sempy_labs/report/_report_rebind.py +40 -34
  107. sempy_labs/tom/__init__.py +1 -4
  108. sempy_labs/tom/_model.py +601 -181
  109. semantic_link_labs-0.5.0.dist-info/METADATA +0 -22
  110. semantic_link_labs-0.5.0.dist-info/RECORD +0 -53
  111. sempy_labs/directlake/_fallback.py +0 -58
  112. {semantic_link_labs-0.5.0.dist-info → semantic_link_labs-0.7.0.dist-info}/LICENSE +0 -0
  113. {semantic_link_labs-0.5.0.dist-info → semantic_link_labs-0.7.0.dist-info}/top_level.txt +0 -0
@@ -1,8 +1,12 @@
1
- import sempy
2
1
  import sempy.fabric as fabric
3
- import re, datetime, time
2
+ import re
3
+ import datetime
4
4
  from sempy_labs.lakehouse._get_lakehouse_tables import get_lakehouse_tables
5
- from sempy_labs._helper_functions import resolve_lakehouse_name
5
+ from sempy_labs._helper_functions import (
6
+ resolve_lakehouse_name,
7
+ format_dax_object_name,
8
+ retry,
9
+ )
6
10
  from sempy_labs.tom import connect_semantic_model
7
11
  from typing import Optional
8
12
  from sempy._utils._log import log
@@ -66,7 +70,7 @@ def migrate_calc_tables_to_semantic_model(
66
70
  dfC_filt = dfC[
67
71
  (dfC["Table Name"].isin(dfP_filt["Table Name"]))
68
72
  ] # & (dfC['Type'] == 'CalculatedTableColumn')]
69
- # dfA = list_annotations(new_dataset, new_dataset_workspace)
73
+ # dfA = fabric.list_annotations(new_dataset, new_dataset_workspace)
70
74
  # dfA_filt = dfA[(dfA['Object Type'] == 'Model') & ~ (dfA['Annotation Value'].str.contains('NAMEOF'))]
71
75
 
72
76
  if len(dfP_filt) == 0:
@@ -75,76 +79,73 @@ def migrate_calc_tables_to_semantic_model(
75
79
  )
76
80
  return
77
81
 
78
- start_time = datetime.datetime.now()
79
- timeout = datetime.timedelta(minutes=1)
80
- success = False
81
-
82
- while not success:
83
- try:
84
- with connect_semantic_model(
85
- dataset=new_dataset, readonly=False, workspace=new_dataset_workspace
86
- ) as tom:
87
- success = True
88
- for tName in dfC_filt["Table Name"].unique():
89
- if tName.lower() in lc["Table Name"].values:
90
-
91
- try:
92
- tom.model.Tables[tName]
93
- except:
94
- tom.add_table(name=tName)
95
- tom.add_entity_partition(
96
- table_name=tName,
97
- entity_name=tName.replace(" ", "_").lower(),
98
- )
99
-
100
- columns_in_table = dfC_filt.loc[
101
- dfC_filt["Table Name"] == tName, "Column Name"
102
- ].unique()
103
-
104
- for cName in columns_in_table:
105
- scName = dfC.loc[
106
- (dfC["Table Name"] == tName)
107
- & (dfC["Column Name"] == cName),
108
- "Source",
109
- ].iloc[0]
110
- cDataType = dfC.loc[
111
- (dfC["Table Name"] == tName)
112
- & (dfC["Column Name"] == cName),
113
- "Data Type",
114
- ].iloc[0]
115
- cType = dfC.loc[
116
- (dfC["Table Name"] == tName)
117
- & (dfC["Column Name"] == cName),
118
- "Type",
119
- ].iloc[0]
120
-
121
- # av = tom.get_annotation_value(object = tom.model, name = tName)
122
-
123
- # if cType == 'CalculatedTableColumn':
124
- # lakeColumn = scName.replace(' ','_')
125
- # elif cType == 'Calculated':
126
- pattern = r"\[([^]]+)\]"
127
-
128
- matches = re.findall(pattern, scName)
129
- lakeColumn = matches[0].replace(" ", "")
130
- try:
131
- tom.model.Tables[tName].Columns[cName]
132
- except:
133
- tom.add_data_column(
134
- table_name=tName,
135
- column_name=cName,
136
- source_column=lakeColumn,
137
- data_type=cDataType,
138
- )
139
- print(
140
- f"{icons.green_dot} The '{tName}'[{cName}] column has been added."
141
- )
142
-
143
- print(
144
- f"\n{icons.green_dot} All viable calculated tables have been added to the model."
145
- )
146
-
147
- except Exception as e:
148
- if datetime.datetime.now() - start_time > timeout:
149
- break
150
- 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
+ )