mirror of
https://github.com/dbt-labs/dbt-core
synced 2025-12-20 07:21:27 +00:00
Compare commits
3 Commits
update-ind
...
feature/ad
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5f43a1c297 | ||
|
|
11e155de86 | ||
|
|
823aa0a575 |
7
.changes/unreleased/Features-20220914-140511.yaml
Normal file
7
.changes/unreleased/Features-20220914-140511.yaml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
kind: Features
|
||||||
|
body: add fill missing value attribute
|
||||||
|
time: 2022-09-14T14:05:11.927083-05:00
|
||||||
|
custom:
|
||||||
|
Author: dave-connors-3
|
||||||
|
Issue: "5842"
|
||||||
|
PR: "5843"
|
||||||
@@ -825,6 +825,7 @@ class ParsedMetric(UnparsedBaseNode, HasUniqueID, HasFqn):
|
|||||||
time_grains: List[str]
|
time_grains: List[str]
|
||||||
dimensions: List[str]
|
dimensions: List[str]
|
||||||
window: Optional[MetricTime]
|
window: Optional[MetricTime]
|
||||||
|
fill_missing_values: Optional[bool] = True
|
||||||
model: Optional[str] = None
|
model: Optional[str] = None
|
||||||
model_unique_id: Optional[str] = None
|
model_unique_id: Optional[str] = None
|
||||||
resource_type: NodeType = NodeType.Metric
|
resource_type: NodeType = NodeType.Metric
|
||||||
@@ -852,6 +853,9 @@ class ParsedMetric(UnparsedBaseNode, HasUniqueID, HasFqn):
|
|||||||
def same_window(self, old: "ParsedMetric") -> bool:
|
def same_window(self, old: "ParsedMetric") -> bool:
|
||||||
return self.window == old.window
|
return self.window == old.window
|
||||||
|
|
||||||
|
def same_fill_missing_values(self, old: "ParsedMetric") -> bool:
|
||||||
|
return self.fill_missing_values == old.fill_missing_values
|
||||||
|
|
||||||
def same_dimensions(self, old: "ParsedMetric") -> bool:
|
def same_dimensions(self, old: "ParsedMetric") -> bool:
|
||||||
return self.dimensions == old.dimensions
|
return self.dimensions == old.dimensions
|
||||||
|
|
||||||
@@ -891,6 +895,7 @@ class ParsedMetric(UnparsedBaseNode, HasUniqueID, HasFqn):
|
|||||||
return (
|
return (
|
||||||
self.same_model(old)
|
self.same_model(old)
|
||||||
and self.same_window(old)
|
and self.same_window(old)
|
||||||
|
and self.same_fill_missing_values(old)
|
||||||
and self.same_dimensions(old)
|
and self.same_dimensions(old)
|
||||||
and self.same_filters(old)
|
and self.same_filters(old)
|
||||||
and self.same_description(old)
|
and self.same_description(old)
|
||||||
|
|||||||
@@ -475,6 +475,7 @@ class UnparsedMetric(dbtClassMixin, Replaceable):
|
|||||||
time_grains: List[str] = field(default_factory=list)
|
time_grains: List[str] = field(default_factory=list)
|
||||||
dimensions: List[str] = field(default_factory=list)
|
dimensions: List[str] = field(default_factory=list)
|
||||||
window: Optional[MetricTime] = None
|
window: Optional[MetricTime] = None
|
||||||
|
fill_missing_values: Optional[bool] = True
|
||||||
model: Optional[str] = None
|
model: Optional[str] = None
|
||||||
filters: List[MetricFilter] = field(default_factory=list)
|
filters: List[MetricFilter] = field(default_factory=list)
|
||||||
meta: Dict[str, Any] = field(default_factory=dict)
|
meta: Dict[str, Any] = field(default_factory=dict)
|
||||||
|
|||||||
@@ -1113,6 +1113,7 @@ class MetricParser(YamlReader):
|
|||||||
timestamp=unparsed.timestamp,
|
timestamp=unparsed.timestamp,
|
||||||
dimensions=unparsed.dimensions,
|
dimensions=unparsed.dimensions,
|
||||||
window=unparsed.window,
|
window=unparsed.window,
|
||||||
|
fill_missing_values=unparsed.fill_missing_values,
|
||||||
time_grains=unparsed.time_grains,
|
time_grains=unparsed.time_grains,
|
||||||
filters=unparsed.filters,
|
filters=unparsed.filters,
|
||||||
meta=unparsed.meta,
|
meta=unparsed.meta,
|
||||||
|
|||||||
@@ -693,6 +693,7 @@ class TestUnparsedMetric(ContractTestCase):
|
|||||||
'timestamp': 'signup_date',
|
'timestamp': 'signup_date',
|
||||||
'time_grains': ['day', 'week', 'month'],
|
'time_grains': ['day', 'week', 'month'],
|
||||||
'dimensions': ['plan', 'country'],
|
'dimensions': ['plan', 'country'],
|
||||||
|
'fill_missing_values': False,
|
||||||
'filters': [
|
'filters': [
|
||||||
{
|
{
|
||||||
"field": "is_paying",
|
"field": "is_paying",
|
||||||
@@ -722,6 +723,7 @@ class TestUnparsedMetric(ContractTestCase):
|
|||||||
'time_grains': ['day', 'week', 'month'],
|
'time_grains': ['day', 'week', 'month'],
|
||||||
'timestamp': 'signup_date',
|
'timestamp': 'signup_date',
|
||||||
'dimensions': [],
|
'dimensions': [],
|
||||||
|
'fill_missing_values': True,
|
||||||
'filters': [],
|
'filters': [],
|
||||||
'tags': [],
|
'tags': [],
|
||||||
'window': {},
|
'window': {},
|
||||||
@@ -742,6 +744,7 @@ class TestUnparsedMetric(ContractTestCase):
|
|||||||
timestamp="signup_date",
|
timestamp="signup_date",
|
||||||
time_grains=['day', 'week', 'month'],
|
time_grains=['day', 'week', 'month'],
|
||||||
dimensions=['plan', 'country'],
|
dimensions=['plan', 'country'],
|
||||||
|
fill_missing_values=False,
|
||||||
filters=[MetricFilter(
|
filters=[MetricFilter(
|
||||||
field="is_paying",
|
field="is_paying",
|
||||||
value='True',
|
value='True',
|
||||||
|
|||||||
@@ -381,6 +381,7 @@ def make_metric(pkg, name, path=None):
|
|||||||
operator="=",
|
operator="=",
|
||||||
)],
|
)],
|
||||||
window=MetricTime(),
|
window=MetricTime(),
|
||||||
|
fill_missing_values=True,
|
||||||
meta={'is_okr': True},
|
meta={'is_okr': True},
|
||||||
tags=['okrs'],
|
tags=['okrs'],
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -117,6 +117,7 @@ class ManifestTest(unittest.TestCase):
|
|||||||
meta={'is_okr': True},
|
meta={'is_okr': True},
|
||||||
tags=['okrs'],
|
tags=['okrs'],
|
||||||
window=MetricTime(),
|
window=MetricTime(),
|
||||||
|
fill_missing_values=True,
|
||||||
resource_type=NodeType.Metric,
|
resource_type=NodeType.Metric,
|
||||||
depends_on=DependsOn(nodes=['model.root.multi']),
|
depends_on=DependsOn(nodes=['model.root.multi']),
|
||||||
refs=[['multi']],
|
refs=[['multi']],
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ metrics:
|
|||||||
expression: "*"
|
expression: "*"
|
||||||
timestamp: created_at
|
timestamp: created_at
|
||||||
time_grains: [day, week, month]
|
time_grains: [day, week, month]
|
||||||
|
fill_missing_values: False
|
||||||
dimensions:
|
dimensions:
|
||||||
- favorite_color
|
- favorite_color
|
||||||
- loves_dbt
|
- loves_dbt
|
||||||
@@ -82,12 +83,25 @@ class TestSimpleMetrics:
|
|||||||
assert len(results) == 1
|
assert len(results) == 1
|
||||||
manifest = get_manifest(project.project_root)
|
manifest = get_manifest(project.project_root)
|
||||||
metric_ids = list(manifest.metrics.keys())
|
metric_ids = list(manifest.metrics.keys())
|
||||||
|
fill_missing_values_settings = {}
|
||||||
|
for metric_id in list(manifest.metrics.keys()):
|
||||||
|
parsed_metric_node = manifest.metrics[metric_id]
|
||||||
|
fill_missing_values_settings[metric_id] = getattr(
|
||||||
|
parsed_metric_node, "fill_missing_values"
|
||||||
|
)
|
||||||
|
expected_fill_missing_values_settings = {
|
||||||
|
"metric.test.number_of_people": False,
|
||||||
|
"metric.test.collective_tenure": True,
|
||||||
|
"metric.test.collective_window": True,
|
||||||
|
}
|
||||||
|
|
||||||
expected_metric_ids = [
|
expected_metric_ids = [
|
||||||
"metric.test.number_of_people",
|
"metric.test.number_of_people",
|
||||||
"metric.test.collective_tenure",
|
"metric.test.collective_tenure",
|
||||||
"metric.test.collective_window",
|
"metric.test.collective_window",
|
||||||
]
|
]
|
||||||
assert metric_ids == expected_metric_ids
|
assert metric_ids == expected_metric_ids
|
||||||
|
assert fill_missing_values_settings == expected_fill_missing_values_settings
|
||||||
|
|
||||||
|
|
||||||
invalid_models__people_metrics_yml = """
|
invalid_models__people_metrics_yml = """
|
||||||
|
|||||||
Reference in New Issue
Block a user