Skip to content

Commit 320c5c7

Browse files
committed
Merge branch 'm-kovalsky/vertipaqlakehouse'
2 parents 24b1ad4 + b315252 commit 320c5c7

File tree

3 files changed

+160
-5
lines changed

3 files changed

+160
-5
lines changed

src/sempy_labs/_model_bpa.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,11 +201,12 @@ def run_model_bpa(
201201
delta_table_name = "modelbparesults"
202202

203203
lakehouse_id = fabric.get_lakehouse_id()
204+
lake_workspace = fabric.get_workspace_id()
204205
lakehouse = resolve_lakehouse_name(
205-
lakehouse_id=lakehouse_id, workspace=workspace
206+
lakehouse_id=lakehouse_id, workspace=lake_workspace
206207
)
207208

208-
lakeT = get_lakehouse_tables(lakehouse=lakehouse, workspace=workspace)
209+
lakeT = get_lakehouse_tables(lakehouse=lakehouse, workspace=lake_workspace)
209210
lakeT_filt = lakeT[lakeT["Table Name"] == delta_table_name]
210211

211212
dfExport["Severity"].replace("⚠️", "Warning", inplace=True)

src/sempy_labs/_translations.py

Lines changed: 154 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import sempy
12
import pandas as pd
23
from typing import List, Optional, Union
34
from sempy._utils._log import log
@@ -10,7 +11,7 @@ def translate_semantic_model(
1011
languages: Union[str, List[str]],
1112
exclude_characters: Optional[str] = None,
1213
workspace: Optional[str] = None,
13-
):
14+
) -> pd.DataFrame:
1415
"""
1516
Translates names, descriptions, display folders for all objects in a semantic model.
1617
@@ -29,6 +30,8 @@ def translate_semantic_model(
2930
3031
Returns
3132
-------
33+
pandas.DataFrame
34+
Shows a pandas dataframe which displays all of the translations in the semantic model.
3235
3336
"""
3437

@@ -302,3 +305,153 @@ def set_translation_if_exists(
302305
lang,
303306
i,
304307
)
308+
result = pd.DataFrame(
309+
columns=[
310+
"Language",
311+
"Object Type",
312+
"Table Name",
313+
"Object Name",
314+
"Translated Object Name",
315+
"Description",
316+
"Translated Description",
317+
"Display Folder",
318+
"Translated Display Folder",
319+
]
320+
)
321+
with connect_semantic_model(
322+
dataset=dataset, readonly=True, workspace=workspace
323+
) as tom:
324+
325+
sempy.fabric._client._utils._init_analysis_services()
326+
import Microsoft.AnalysisServices.Tabular as TOM
327+
328+
for c in tom.model.Cultures:
329+
for tr in c.ObjectTranslations:
330+
oType = str(tr.Object.ObjectType)
331+
oName = tr.Object.Name
332+
tValue = tr.Value
333+
prop = str(tr.Property)
334+
335+
if tr.Object.ObjectType == TOM.ObjectType.Table:
336+
desc = tom.model.Tables[oName].Description
337+
new_data = {
338+
"Language": c.Name,
339+
"Table Name": oName,
340+
"Object Name": oName,
341+
"Object Type": oType,
342+
"Description": desc,
343+
}
344+
result = pd.concat(
345+
[result, pd.DataFrame(new_data, index=[0])], ignore_index=True
346+
)
347+
condition = (
348+
(result["Language"] == c.Name)
349+
& (result["Table Name"] == oName)
350+
& (result["Object Name"] == oName)
351+
& (result["Object Type"] == oType)
352+
)
353+
elif tr.Object.ObjectType == TOM.ObjectType.Level:
354+
hierarchyName = tr.Object.Parent.Name
355+
tName = tr.Object.Parent.Parent.Name
356+
levelName = "'" + hierarchyName + "'[" + oName + "]"
357+
desc = (
358+
tom.model.Tables[tName]
359+
.Hierarchies[hierarchyName]
360+
.Levels[oName]
361+
.Description
362+
)
363+
new_data = {
364+
"Language": c.Name,
365+
"Table Name": tName,
366+
"Object Name": levelName,
367+
"Object Type": oType,
368+
"Description": desc,
369+
}
370+
result = pd.concat(
371+
[result, pd.DataFrame(new_data, index=[0])], ignore_index=True
372+
)
373+
condition = (
374+
(result["Language"] == c.Name)
375+
& (result["Table Name"] == tName)
376+
& (result["Object Name"] == levelName)
377+
& (result["Object Type"] == oType)
378+
)
379+
elif tr.Object.ObjectType == TOM.ObjectType.Column:
380+
tName = tr.Object.Table.Name
381+
desc = tom.model.Tables[tName].Columns[oName].Description
382+
display_folder = (
383+
tom.model.Tables[tName].Columns[oName].DisplayFolder
384+
)
385+
new_data = {
386+
"Language": c.Name,
387+
"Table Name": tName,
388+
"Object Name": oName,
389+
"Object Type": oType,
390+
"Description": desc,
391+
"Display Folder": display_folder,
392+
}
393+
result = pd.concat(
394+
[result, pd.DataFrame(new_data, index=[0])], ignore_index=True
395+
)
396+
condition = (
397+
(result["Language"] == c.Name)
398+
& (result["Table Name"] == tName)
399+
& (result["Object Name"] == oName)
400+
& (result["Object Type"] == oType)
401+
)
402+
elif tr.Object.ObjectType == TOM.ObjectType.Measure:
403+
tName = tr.Object.Table.Name
404+
desc = tom.model.Tables[tName].Measures[oName].Description
405+
display_folder = (
406+
tom.model.Tables[tName].Measures[oName].DisplayFolder
407+
)
408+
new_data = {
409+
"Language": c.Name,
410+
"Table Name": tName,
411+
"Object Name": oName,
412+
"Object Type": oType,
413+
"Description": desc,
414+
"Display Folder": display_folder,
415+
}
416+
result = pd.concat(
417+
[result, pd.DataFrame(new_data, index=[0])], ignore_index=True
418+
)
419+
condition = (
420+
(result["Language"] == c.Name)
421+
& (result["Table Name"] == tName)
422+
& (result["Object Name"] == oName)
423+
& (result["Object Type"] == oType)
424+
)
425+
elif tr.Object.ObjectType == TOM.ObjectType.Hierarchy:
426+
tName = tr.Object.Table.Name
427+
desc = tom.model.Tables[tName].Hierarchies[oName].Description
428+
display_folder = (
429+
tom.model.Tables[tName].Hierarchies[oName].DisplayFolder
430+
)
431+
new_data = {
432+
"Language": c.Name,
433+
"Table Name": tName,
434+
"Object Name": oName,
435+
"Object Type": oType,
436+
"Description": desc,
437+
"Display Folder": display_folder,
438+
}
439+
result = pd.concat(
440+
[result, pd.DataFrame(new_data, index=[0])], ignore_index=True
441+
)
442+
condition = (
443+
(result["Language"] == c.Name)
444+
& (result["Table Name"] == tName)
445+
& (result["Object Name"] == oName)
446+
& (result["Object Type"] == oType)
447+
)
448+
449+
if prop == "Caption":
450+
result.loc[condition, "Translated Object Name"] = tValue
451+
elif prop == "Description":
452+
result.loc[condition, "Translated Description"] = tValue
453+
else:
454+
result.loc[condition, "Translated Display Folder"] = tValue
455+
result.fillna("", inplace=True)
456+
457+
return result

src/sempy_labs/_vertipaq.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -452,12 +452,13 @@ def vertipaq_analyzer(
452452
spark = SparkSession.builder.getOrCreate()
453453

454454
lakehouse_id = fabric.get_lakehouse_id()
455+
lake_workspace = fabric.resolve_workspace_name()
455456
lakehouse = resolve_lakehouse_name(
456-
lakehouse_id=lakehouse_id, workspace=workspace
457+
lakehouse_id=lakehouse_id, workspace=lake_workspace
457458
)
458459
lakeTName = "vertipaq_analyzer_model"
459460

460-
lakeT = get_lakehouse_tables(lakehouse=lakehouse, workspace=workspace)
461+
lakeT = get_lakehouse_tables(lakehouse=lakehouse, workspace=lake_workspace)
461462
lakeT_filt = lakeT[lakeT["Table Name"] == lakeTName]
462463

463464
query = f"SELECT MAX(RunId) FROM {lakehouse}.{lakeTName}"

0 commit comments

Comments
 (0)