-
Notifications
You must be signed in to change notification settings - Fork 98
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Remove unused only_apply_for_metric_time param from MinimumTimeGrainP…
…attern
- Loading branch information
1 parent
ac2b646
commit 377846a
Showing
2 changed files
with
70 additions
and
23 deletions.
There are no files selected for viewing
70 changes: 70 additions & 0 deletions
70
metricflow-semantics/metricflow_semantics/specs/patterns/min_time_grain.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
from __future__ import annotations | ||
|
||
from collections import defaultdict | ||
from typing import Dict, List, Sequence, Set | ||
|
||
from dbt_semantic_interfaces.type_enums import TimeGranularity | ||
from typing_extensions import override | ||
|
||
from metricflow_semantics.specs.patterns.spec_pattern import SpecPattern | ||
from metricflow_semantics.specs.spec_classes import ( | ||
InstanceSpec, | ||
LinkableInstanceSpec, | ||
TimeDimensionSpec, | ||
TimeDimensionSpecComparisonKey, | ||
TimeDimensionSpecField, | ||
) | ||
from metricflow_semantics.specs.spec_set import group_specs_by_type | ||
|
||
|
||
class MinimumTimeGrainPattern(SpecPattern): | ||
"""A pattern that matches linkable specs, but for time dimension specs, only the one with the finest grain. | ||
e.g. | ||
inputs: | ||
[ | ||
TimeDimensionSpec('metric_time', 'day'), | ||
TimeDimensionSpec('metric_time', 'month.'), | ||
DimensionSpec('listing__country'), | ||
] | ||
matches: | ||
[ | ||
TimeDimensionSpec('metric_time', 'day'), | ||
DimensionSpec('listing__country'), | ||
] | ||
The finest grain represents the defined grain of the time dimension in the semantic model when evaluating specs | ||
of the source. | ||
This pattern helps to implement matching of group-by-items for where filters - in those cases, an ambiguously | ||
specified group-by-item can only match to time dimension spec with the base grain. | ||
Also, this is currently used to help implement restrictions on cumulative metrics where they can only be queried | ||
by the base grain of metric_time. | ||
""" | ||
|
||
@override | ||
def match(self, candidate_specs: Sequence[InstanceSpec]) -> Sequence[InstanceSpec]: | ||
spec_set = group_specs_by_type(candidate_specs) | ||
|
||
spec_key_to_grains: Dict[TimeDimensionSpecComparisonKey, Set[TimeGranularity]] = defaultdict(set) | ||
spec_key_to_specs: Dict[TimeDimensionSpecComparisonKey, List[TimeDimensionSpec]] = defaultdict(list) | ||
for time_dimension_spec in spec_set.time_dimension_specs: | ||
spec_key = time_dimension_spec.comparison_key(exclude_fields=(TimeDimensionSpecField.TIME_GRANULARITY,)) | ||
spec_key_to_grains[spec_key].add(time_dimension_spec.time_granularity) | ||
spec_key_to_specs[spec_key].append(time_dimension_spec) | ||
|
||
matched_time_dimension_specs: List[TimeDimensionSpec] = [] | ||
for spec_key, time_grains in spec_key_to_grains.items(): | ||
matched_time_dimension_specs.append(spec_key_to_specs[spec_key][0].with_grain(min(time_grains))) | ||
|
||
matching_specs: Sequence[LinkableInstanceSpec] = ( | ||
spec_set.dimension_specs | ||
+ tuple(matched_time_dimension_specs) | ||
+ spec_set.entity_specs | ||
+ spec_set.group_by_metric_specs | ||
) | ||
|
||
return matching_specs |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters