1
1
import copy
2
2
import logging
3
3
4
- from typing import Sequence
4
+ from typing import Sequence , Tuple
5
5
6
6
from metricflow .model .objects .user_configured_model import UserConfiguredModel
7
7
from metricflow .model .transformations .add_input_metric_measures import AddInputMetricMeasuresRule
@@ -23,12 +23,12 @@ class ModelTransformer:
23
23
Generally used to make it more convenient for the user to develop their model.
24
24
"""
25
25
26
- DEFAULT_PRE_VALIDATION_RULES : Sequence [ModelTransformRule ] = (
26
+ PRIMARY_RULES : Sequence [ModelTransformRule ] = (
27
27
LowerCaseNamesRule (),
28
28
SetMeasureAggregationTimeDimensionRule (),
29
29
)
30
30
31
- DEFAULT_POST_VALIDATION_RULES : Sequence [ModelTransformRule ] = (
31
+ SECONDARY_RULES : Sequence [ModelTransformRule ] = (
32
32
CreateProxyMeasureRule (),
33
33
BooleanMeasureAggregationRule (),
34
34
CompositeIdentifierExpressionRule (),
@@ -37,25 +37,49 @@ class ModelTransformer:
37
37
AddInputMetricMeasuresRule (),
38
38
)
39
39
40
+ DEFAULT_RULES : Tuple [Sequence [ModelTransformRule ], ...] = (
41
+ PRIMARY_RULES ,
42
+ SECONDARY_RULES ,
43
+ )
44
+
40
45
@staticmethod
41
- def pre_validation_transform_model (
42
- model : UserConfiguredModel , rules : Sequence [ModelTransformRule ] = DEFAULT_PRE_VALIDATION_RULES
46
+ def transform (
47
+ model : UserConfiguredModel ,
48
+ ordered_rule_sequences : Tuple [Sequence [ModelTransformRule ], ...] = DEFAULT_RULES ,
43
49
) -> UserConfiguredModel :
44
- """Transform a model according to configured rules before validations are run."""
50
+ """Copies the passed in model, applies the rules to the new model, and then returns that model
51
+
52
+ It's important to note that some rules need to happen before or after other rules. Thus rules
53
+ are passed in as an ordered tuple of rule sequences. Primary rules are run first, and then
54
+ secondary rules. We don't currently have tertiary, quaternary, or etc currently, but this
55
+ system easily allows for it.
56
+ """
45
57
model_copy = copy .deepcopy (model )
46
58
47
- for transform_rule in rules :
48
- model_copy = transform_rule .transform_model (model_copy )
59
+ for rule_sequence in ordered_rule_sequences :
60
+ for rule in rule_sequence :
61
+ model_copy = rule .transform_model (model_copy )
49
62
50
63
return model_copy
51
64
65
+ @staticmethod
66
+ def pre_validation_transform_model (
67
+ model : UserConfiguredModel , rules : Sequence [ModelTransformRule ] = PRIMARY_RULES
68
+ ) -> UserConfiguredModel :
69
+ """Transform a model according to configured rules before validations are run."""
70
+ logger .warning (
71
+ "DEPRECATION: `ModelTransformer.pre_validation_transform_model` is deprecated. Please use `ModelTransformer.transform` instead."
72
+ )
73
+
74
+ return ModelTransformer .transform (model = model , ordered_rule_sequences = (rules ,))
75
+
52
76
@staticmethod
53
77
def post_validation_transform_model (
54
- model : UserConfiguredModel , rules : Sequence [ModelTransformRule ] = DEFAULT_POST_VALIDATION_RULES
78
+ model : UserConfiguredModel , rules : Sequence [ModelTransformRule ] = SECONDARY_RULES
55
79
) -> UserConfiguredModel :
56
80
"""Transform a model according to configured rules after validations are run."""
57
- model_copy = copy . deepcopy ( model )
58
- for transform_rule in rules :
59
- model_copy = transform_rule . transform_model ( model_copy )
81
+ logger . warning (
82
+ "DEPRECATION: `ModelTransformer.post_validation_transform_model` is deprecated. Please use `ModelTransformer.transform` instead."
83
+ )
60
84
61
- return model_copy
85
+ return ModelTransformer . transform ( model = model , ordered_rule_sequences = ( rules ,))
0 commit comments