1
1
from __future__ import annotations
2
2
3
3
import logging
4
- import time
5
- from typing import Dict , Final , Iterable , Optional , Sequence , Set , Tuple
4
+ from typing import Dict , Final , Iterable , Optional , Sequence , Set
6
5
7
6
from dbt_semantic_interfaces .enum_extension import assert_values_exhausted
8
7
from dbt_semantic_interfaces .protocols .metric import Metric , MetricInputMeasure , MetricType
9
8
from dbt_semantic_interfaces .protocols .semantic_manifest import SemanticManifest
10
9
from dbt_semantic_interfaces .references import MeasureReference , MetricReference
11
10
from dbt_semantic_interfaces .type_enums .time_granularity import TimeGranularity
12
11
13
- from metricflow_semantics .collection_helpers .lru_cache import LruCache
14
12
from metricflow_semantics .errors .error_classes import DuplicateMetricError , MetricNotFoundError , NonExistentMeasureError
15
13
from metricflow_semantics .experimental .ordered_set import FrozenOrderedSet
16
14
from metricflow_semantics .experimental .semantic_graph .attribute_resolution .annotated_spec_linkable_element_set import (
17
15
GroupByItemSet ,
18
16
)
19
- from metricflow_semantics .mf_logging .lazy_formattable import LazyFormat
20
17
from metricflow_semantics .model .linkable_element_property import GroupByItemProperty
21
18
from metricflow_semantics .model .semantics .element_filter import GroupByItemSetFilter
22
19
from metricflow_semantics .model .semantics .linkable_element_set_base import BaseGroupByItemSet
@@ -68,98 +65,11 @@ def __init__(
68
65
MetricReference , Sequence [TimeDimensionSpec ]
69
66
] = {}
70
67
71
- # Cache for `linkable_elements_for_measure()`.
72
- self ._group_by_item_set_for_measure_cache : Dict [
73
- Tuple [MeasureReference , GroupByItemSetFilter ], BaseGroupByItemSet
74
- ] = {}
75
-
76
- self ._group_by_items_including_metrics_cache = LruCache [
77
- Tuple [MeasureReference , GroupByItemSetFilter ], BaseGroupByItemSet
78
- ](128 )
79
- self ._group_by_items_for_no_metrics_query_cache = LruCache [GroupByItemSetFilter , BaseGroupByItemSet ](128 )
80
- self ._group_by_items_for_metrics_cache = LruCache [
81
- Tuple [Sequence [MetricReference ], GroupByItemSetFilter ], BaseGroupByItemSet
82
- ](128 )
83
-
84
- def linkable_elements_for_measure (
85
- self ,
86
- measure_reference : MeasureReference ,
87
- element_filter : GroupByItemSetFilter = GroupByItemSetFilter (),
88
- ) -> BaseGroupByItemSet :
89
- """Return the set of linkable elements reachable from a given measure."""
90
- start_time = time .perf_counter ()
91
-
92
- # Cache the result when group-by-metrics are selected in an LRU cache as there can be many of them and may
93
- # significantly increase memory usage.
94
- if (
95
- GroupByItemProperty .METRIC in element_filter .with_any_of
96
- and GroupByItemProperty .METRIC not in element_filter .without_any_of
97
- ):
98
- cache_key = (measure_reference , element_filter )
99
- result = self ._group_by_items_including_metrics_cache .get (cache_key )
100
- if result is not None :
101
- return result
102
-
103
- result = self ._group_by_item_set_resolver .get_common_set (
104
- measure_references = [measure_reference ], metric_references = [], set_filter = element_filter
105
- )
106
- self ._group_by_items_including_metrics_cache .set (cache_key , result )
107
- return result
108
-
109
- # Cache the result without element names in the filter for better hit rates.
110
- set_filter_without_element_names = element_filter .without_element_names ()
111
- cache_key = (measure_reference , set_filter_without_element_names )
112
-
113
- result = self ._group_by_item_set_for_measure_cache .get (cache_key )
114
- if result is not None :
115
- return result .filter (element_filter )
116
-
117
- result = self ._group_by_item_set_resolver .get_common_set (
118
- measure_references = [measure_reference ], metric_references = [], set_filter = set_filter_without_element_names
119
- )
120
- self ._group_by_item_set_for_measure_cache [cache_key ] = result
121
-
122
- logger .debug (
123
- LazyFormat (
124
- "Finished getting linkable elements" ,
125
- measure_reference = measure_reference ,
126
- set_filter = element_filter ,
127
- runtime = time .perf_counter () - start_time ,
128
- )
129
- )
130
- return result .filter (element_filter )
131
-
132
68
def get_group_by_items_for_distinct_values_query (
133
69
self , element_set_filter : GroupByItemSetFilter = GroupByItemSetFilter ()
134
70
) -> BaseGroupByItemSet :
135
71
"""Return the reachable linkable elements for a dimension values query with no metrics."""
136
- cache_key = element_set_filter
137
- result = self ._group_by_items_for_no_metrics_query_cache .get (cache_key )
138
- if result is not None :
139
- return result
140
-
141
- result = self ._group_by_item_set_resolver .get_set_for_distinct_values_query (element_set_filter )
142
- self ._group_by_items_for_no_metrics_query_cache .set (cache_key , result )
143
- return result
144
-
145
- def linkable_elements_for_metrics (
146
- self , metric_references : Sequence [MetricReference ], set_filter : GroupByItemSetFilter
147
- ) -> BaseGroupByItemSet :
148
- """Retrieve the matching set of linkable elements common to all metrics requested (intersection)."""
149
- cache_key = (metric_references , set_filter )
150
- result = self ._group_by_items_for_metrics_cache .get (cache_key )
151
- if result is not None :
152
- return result
153
-
154
- # This method has never returned group-by metrics, so ensure via filter.
155
- effective_filter = set_filter .copy (
156
- without_any_of = set_filter .without_any_of .union ((GroupByItemProperty .METRIC ,))
157
- )
158
- result = self ._group_by_item_set_resolver .get_common_set (
159
- metric_references = metric_references , set_filter = effective_filter
160
- )
161
- self ._group_by_items_for_metrics_cache .set (cache_key , result )
162
- return result
72
+ return self ._group_by_item_set_resolver .get_set_for_distinct_values_query (element_set_filter )
163
73
164
74
def get_common_group_by_items (
165
75
self ,
@@ -168,7 +78,6 @@ def get_common_group_by_items(
168
78
set_filter : GroupByItemSetFilter = DEFAULT_COMMON_SET_FILTER ,
169
79
) -> BaseGroupByItemSet :
170
80
"""Gets the set of the valid group-by items common to all inputs."""
171
-
172
81
if set_filter .element_names is None :
173
82
return self ._group_by_item_set_resolver .get_common_set (
174
83
measure_references = measure_references ,
0 commit comments