Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -549,7 +549,9 @@ def _get_child_measures(self, table: PowerBiTable) -> List[Column]:
measure_type = DataType.MEASURE_VISIBLE
if measure.isHidden:
measure_type = DataType.MEASURE_HIDDEN
expression_text = f"Expression : {measure.expression}"
expression_text = (
f"Expression : {measure.expression}" if measure.expression else ""
)
description_text = (
f"Description : {measure.description}"
if measure.description
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
PowerBI Models
"""
from datetime import datetime
from typing import List, Optional
from typing import List, Optional, Union

from pydantic import BaseModel, Field
from pydantic import BaseModel, Field, field_validator
from typing_extensions import Annotated


Expand Down Expand Up @@ -135,17 +135,31 @@ class PowerBiMeasures(BaseModel):
"""

name: str
expression: str
expression: Optional[Union[str, List[str]]] = None
Comment thread
AntoineGlacet marked this conversation as resolved.
description: Optional[str] = None
Comment thread
harshsoni2024 marked this conversation as resolved.
isHidden: Optional[bool] = False

@field_validator("expression", mode="before")
@classmethod
def normalize_expression(cls, v):
if isinstance(v, list):
return "\n".join(v)
return v


class PowerBITableSource(BaseModel):
"""
PowerBI Table Source
"""

expression: Optional[str] = None
expression: Optional[Union[str, List[str]]] = None

@field_validator("expression", mode="before")
@classmethod
def normalize_expression(cls, v):
if isinstance(v, list):
return "\n".join(v)
return v


class PowerBiTable(BaseModel):
Expand Down Expand Up @@ -173,7 +187,14 @@ class TablesResponse(BaseModel):

class DatasetExpression(BaseModel):
name: str
expression: Optional[str] = None
expression: Optional[Union[str, List[str]]] = None

@field_validator("expression", mode="before")
@classmethod
def normalize_expression(cls, v):
if isinstance(v, list):
return "\n".join(v)
return v


class UpstreaDataflow(BaseModel):
Expand Down
77 changes: 77 additions & 0 deletions ingestion/tests/unit/test_powerbi_table_measures.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
from metadata.generated.schema.type.basic import Markdown
from metadata.ingestion.source.dashboard.powerbi.metadata import PowerbiSource
from metadata.ingestion.source.dashboard.powerbi.models import (
DatasetExpression,
PowerBiMeasures,
PowerBiTable,
PowerBITableSource,
)

test_cases = {
Expand Down Expand Up @@ -68,6 +70,32 @@
)
],
},
"multiline_expression_as_list": {
"input": [
PowerBiMeasures(
name="multiline_measure",
expression=[
"",
"VAR PL_Net_Selection =",
" SUMX('DB P&L', [Value] * RELATED('Map Account'[Sign]))",
"",
"RETURN PL_Net_Selection / 1000000",
],
description="Multiline DAX",
isHidden=False,
)
],
"expected": [
Column(
name="multiline_measure",
dataType=DataType.MEASURE_VISIBLE,
dataTypeDisplay=DataType.MEASURE_VISIBLE,
description=Markdown(
"Expression : \nVAR PL_Net_Selection =\n SUMX('DB P&L', [Value] * RELATED('Map Account'[Sign]))\n\nRETURN PL_Net_Selection / 1000000\n\nDescription : Multiline DAX"
),
)
],
},
}


Expand All @@ -93,3 +121,52 @@ def test_get_child_measures(test_case_name, test_case):
assert actual_col.dataType == expected_col.dataType
assert actual_col.dataTypeDisplay == expected_col.dataTypeDisplay
assert actual_col.description == expected_col.description


def test_powerbi_measures_string_expression():
measure = PowerBiMeasures(name="test", expression="SUM(Sales)", isHidden=False)
assert measure.expression == "SUM(Sales)"


def test_powerbi_measures_list_expression():
measure = PowerBiMeasures(
name="test",
expression=["", "VAR x = 1", "RETURN x"],
isHidden=False,
)
assert measure.expression == "\nVAR x = 1\nRETURN x"


def test_powerbi_measures_empty_list_expression():
measure = PowerBiMeasures(name="test", expression=[], isHidden=False)
assert measure.expression == ""


def test_powerbi_table_source_string_expression():
source = PowerBITableSource(expression="SELECT * FROM table")
assert source.expression == "SELECT * FROM table"


def test_powerbi_table_source_list_expression():
source = PowerBITableSource(expression=["let", " Source = ...", "in Source"])
assert source.expression == "let\n Source = ...\nin Source"


def test_powerbi_table_source_none_expression():
source = PowerBITableSource(expression=None)
assert source.expression is None


def test_dataset_expression_string():
expr = DatasetExpression(name="test", expression="SUM(Sales)")
assert expr.expression == "SUM(Sales)"


def test_dataset_expression_list():
expr = DatasetExpression(name="test", expression=["", "VAR x = 1", "RETURN x"])
assert expr.expression == "\nVAR x = 1\nRETURN x"


def test_dataset_expression_none():
expr = DatasetExpression(name="test", expression=None)
assert expr.expression is None
Loading