MINOR: PBI dataset expressions empty value fix (#21409)

(cherry picked from commit 8bbc4d8c3d7792d0d36a163f119efdccf61840e5)
This commit is contained in:
harshsoni2024 2025-05-27 16:50:55 +05:30 committed by OpenMetadata Release Bot
parent e083293db7
commit a8aa1d004f
3 changed files with 77 additions and 4 deletions

View File

@ -706,6 +706,12 @@ class PowerbiSource(DashboardServiceSource):
if dataset and dataset.expressions: if dataset and dataset.expressions:
# find keyword from dataset expressions # find keyword from dataset expressions
for dexpression in dataset.expressions: for dexpression in dataset.expressions:
if not dexpression.expression:
logger.debug(
f"No expression value found inside dataset"
f"({dataset.name}) expressions' name={dexpression.name}"
)
continue
if dexpression.name == match.group(2): if dexpression.name == match.group(2):
pattern = r'DefaultValue="([^"]+)"' pattern = r'DefaultValue="([^"]+)"'
kw_match = re.search(pattern, dexpression.expression) kw_match = re.search(pattern, dexpression.expression)
@ -784,7 +790,9 @@ class PowerbiSource(DashboardServiceSource):
if not isinstance(table.source, list): if not isinstance(table.source, list):
return {} return {}
source_expression = table.source[0].expression source_expression = table.source[0].expression
if not source_expression:
logger.debug(f"No source expression found for table: {table.name}")
return {}
# parse snowflake source # parse snowflake source
table_info = self._parse_snowflake_source( table_info = self._parse_snowflake_source(
source_expression, datamodel_entity source_expression, datamodel_entity

View File

@ -143,7 +143,7 @@ class PowerBITableSource(BaseModel):
PowerBI Table Source PowerBI Table Source
""" """
expression: str expression: Optional[str] = None
class PowerBiTable(BaseModel): class PowerBiTable(BaseModel):
@ -171,7 +171,7 @@ class TablesResponse(BaseModel):
class DatasetExpression(BaseModel): class DatasetExpression(BaseModel):
name: str name: str
expression: str expression: Optional[str] = None
class Dataset(BaseModel): class Dataset(BaseModel):

View File

@ -15,7 +15,12 @@ from metadata.generated.schema.type.entityReference import EntityReference
from metadata.generated.schema.type.entityReferenceList import EntityReferenceList from metadata.generated.schema.type.entityReferenceList import EntityReferenceList
from metadata.ingestion.ometa.ometa_api import OpenMetadata from metadata.ingestion.ometa.ometa_api import OpenMetadata
from metadata.ingestion.source.dashboard.powerbi.metadata import PowerbiSource from metadata.ingestion.source.dashboard.powerbi.metadata import PowerbiSource
from metadata.ingestion.source.dashboard.powerbi.models import Dataset, PowerBIDashboard from metadata.ingestion.source.dashboard.powerbi.models import (
Dataset,
PowerBIDashboard,
PowerBiTable,
PowerBITableSource,
)
MOCK_REDSHIFT_EXP = """ MOCK_REDSHIFT_EXP = """
let let
@ -167,6 +172,19 @@ MOCK_DATASET_FROM_WORKSPACE = Dataset(
}, },
], ],
) )
MOCK_DATASET_FROM_WORKSPACE_V2 = Dataset(
id="testdataset",
name="Test Dataset",
tables=[],
expressions=[
{
"name": "DB",
},
{
"name": "Schema",
},
],
)
MOCK_DASHBOARD_DATA_MODEL = DashboardDataModel( MOCK_DASHBOARD_DATA_MODEL = DashboardDataModel(
name="dummy_datamodel", name="dummy_datamodel",
id=uuid.uuid4(), id=uuid.uuid4(),
@ -292,3 +310,50 @@ class PowerBIUnitTest(TestCase):
# Verify get_reference_by_email was not called when there are no owners # Verify get_reference_by_email was not called when there are no owners
self.powerbi.metadata.get_reference_by_email.assert_not_called() self.powerbi.metadata.get_reference_by_email.assert_not_called()
@pytest.mark.order(3)
def test_parse_table_info_from_source_exp(self):
table = PowerBiTable(
name="test_table",
source=[PowerBITableSource(expression=MOCK_REDSHIFT_EXP)],
)
result = self.powerbi._parse_table_info_from_source_exp(
table, MOCK_DASHBOARD_DATA_MODEL
)
self.assertEqual(result, EXPECTED_REDSHIFT_RESULT)
# no source expression
table = PowerBiTable(
name="test_table",
source=[PowerBITableSource(expression=None)],
)
result = self.powerbi._parse_table_info_from_source_exp(
table, MOCK_DASHBOARD_DATA_MODEL
)
self.assertEqual(result, {})
# no source
table = PowerBiTable(
name="test_table",
source=[],
)
result = self.powerbi._parse_table_info_from_source_exp(
table, MOCK_DASHBOARD_DATA_MODEL
)
self.assertEqual(result, {})
@pytest.mark.order(4)
@patch.object(
PowerbiSource,
"_fetch_dataset_from_workspace",
return_value=MOCK_DATASET_FROM_WORKSPACE_V2,
)
def test_parse_dataset_expressions(self, *_):
# test with valid snowflake source but no
# dataset expression value
result = self.powerbi._parse_snowflake_source(
MOCK_SNOWFLAKE_EXP_V2, MOCK_DASHBOARD_DATA_MODEL
)
self.assertIsNone(result["database"])
self.assertIsNone(result["schema"])
self.assertEqual(result["table"], "CUSTOMER_TABLE")