Skip to content

Commit ca93230

Browse files
Add window_function attribute to TimeDimensionSpec
This will allow us to track which specs have had a window function applied between DataflowPlan nodes
1 parent a9a6f12 commit ca93230

File tree

3 files changed

+28
-0
lines changed

3 files changed

+28
-0
lines changed

metricflow-semantics/metricflow_semantics/specs/dunder_column_association_resolver.py

+5
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ def visit_time_dimension_spec(self, time_dimension_spec: TimeDimensionSpec) -> C
5454
if time_dimension_spec.aggregation_state
5555
else ""
5656
)
57+
+ (
58+
f"{DUNDER}{time_dimension_spec.window_function.value.lower()}"
59+
if time_dimension_spec.window_function
60+
else ""
61+
)
5762
)
5863

5964
def visit_entity_spec(self, entity_spec: EntitySpec) -> ColumnAssociation: # noqa: D102

metricflow-semantics/metricflow_semantics/specs/time_dimension_spec.py

+22
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from metricflow_semantics.naming.linkable_spec_name import StructuredLinkableSpecName
1616
from metricflow_semantics.specs.dimension_spec import DimensionSpec
1717
from metricflow_semantics.specs.instance_spec import InstanceSpecVisitor
18+
from metricflow_semantics.sql.sql_exprs import SqlWindowFunction
1819
from metricflow_semantics.time.granularity import ExpandedTimeGranularity
1920
from metricflow_semantics.visitor import VisitorOutputT
2021

@@ -91,6 +92,8 @@ class TimeDimensionSpec(DimensionSpec): # noqa: D101
9192
# Used for semi-additive joins. Some more thought is needed, but this may be useful in InstanceSpec.
9293
aggregation_state: Optional[AggregationState] = None
9394

95+
window_function: Optional[SqlWindowFunction] = None
96+
9497
@property
9598
def without_first_entity_link(self) -> TimeDimensionSpec: # noqa: D102
9699
assert len(self.entity_links) > 0, f"Spec does not have any entity links: {self}"
@@ -99,6 +102,8 @@ def without_first_entity_link(self) -> TimeDimensionSpec: # noqa: D102
99102
entity_links=self.entity_links[1:],
100103
time_granularity=self.time_granularity,
101104
date_part=self.date_part,
105+
aggregation_state=self.aggregation_state,
106+
window_function=self.window_function,
102107
)
103108

104109
@property
@@ -108,6 +113,8 @@ def without_entity_links(self) -> TimeDimensionSpec: # noqa: D102
108113
time_granularity=self.time_granularity,
109114
date_part=self.date_part,
110115
entity_links=(),
116+
aggregation_state=self.aggregation_state,
117+
window_function=self.window_function,
111118
)
112119

113120
@property
@@ -153,6 +160,7 @@ def with_grain(self, time_granularity: ExpandedTimeGranularity) -> TimeDimension
153160
time_granularity=time_granularity,
154161
date_part=self.date_part,
155162
aggregation_state=self.aggregation_state,
163+
window_function=self.window_function,
156164
)
157165

158166
def with_base_grain(self) -> TimeDimensionSpec: # noqa: D102
@@ -162,6 +170,7 @@ def with_base_grain(self) -> TimeDimensionSpec: # noqa: D102
162170
time_granularity=ExpandedTimeGranularity.from_time_granularity(self.time_granularity.base_granularity),
163171
date_part=self.date_part,
164172
aggregation_state=self.aggregation_state,
173+
window_function=self.window_function,
165174
)
166175

167176
def with_grain_and_date_part( # noqa: D102
@@ -173,6 +182,7 @@ def with_grain_and_date_part( # noqa: D102
173182
time_granularity=time_granularity,
174183
date_part=date_part,
175184
aggregation_state=self.aggregation_state,
185+
window_function=self.window_function,
176186
)
177187

178188
def with_aggregation_state(self, aggregation_state: AggregationState) -> TimeDimensionSpec: # noqa: D102
@@ -182,6 +192,17 @@ def with_aggregation_state(self, aggregation_state: AggregationState) -> TimeDim
182192
time_granularity=self.time_granularity,
183193
date_part=self.date_part,
184194
aggregation_state=aggregation_state,
195+
window_function=self.window_function,
196+
)
197+
198+
def with_window_function(self, window_function: SqlWindowFunction) -> TimeDimensionSpec: # noqa: D102
199+
return TimeDimensionSpec(
200+
element_name=self.element_name,
201+
entity_links=self.entity_links,
202+
time_granularity=self.time_granularity,
203+
date_part=self.date_part,
204+
aggregation_state=self.aggregation_state,
205+
window_function=window_function,
185206
)
186207

187208
def comparison_key(self, exclude_fields: Sequence[TimeDimensionSpecField] = ()) -> TimeDimensionSpecComparisonKey:
@@ -243,6 +264,7 @@ def with_entity_prefix(self, entity_prefix: EntityReference) -> TimeDimensionSpe
243264
time_granularity=self.time_granularity,
244265
date_part=self.date_part,
245266
aggregation_state=self.aggregation_state,
267+
window_function=self.window_function,
246268
)
247269

248270
@staticmethod

metricflow-semantics/tests_metricflow_semantics/collection_helpers/test_pretty_print.py

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ def test_classes() -> None: # noqa: D103
4747
time_granularity=ExpandedTimeGranularity(name='day', base_granularity=DAY),
4848
date_part=None,
4949
aggregation_state=None,
50+
window_function=None,
5051
)
5152
"""
5253
).rstrip()

0 commit comments

Comments
 (0)