Skip to content

Commit

Permalink
Move data portion of Metric node to dbt/artifacts
Browse files Browse the repository at this point in the history
  • Loading branch information
QMalcolm committed Jan 29, 2024
1 parent 990e16c commit 1e16f5d
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 49 deletions.
6 changes: 6 additions & 0 deletions .changes/unreleased/Under the Hood-20240129-130549.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
kind: Under the Hood
body: Migrate data parts of `Metric` node to dbt/artifacts
time: 2024-01-29T13:05:49.04139-08:00
custom:
Author: QMalcolm
Issue: "9383"
1 change: 1 addition & 0 deletions core/dbt/artifacts/resources/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from dbt.artifacts.resources.v1.metric import (
ConstantPropertyInput,
ConversionTypeParams,
Metric,
MetricConfig,
MetricInput,
MetricInputMeasure,
Expand Down
60 changes: 57 additions & 3 deletions core/dbt/artifacts/resources/v1/metric.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,22 @@
import time

from dataclasses import dataclass, field
from dbt_common.dataclass_schema import dbtClassMixin
from dbt_common.contracts.config.base import BaseConfig, CompareBehavior
from dbt.artifacts.resources.v1.semantic_layer_components import WhereFilterIntersection
from dbt_semantic_interfaces.type_enums import ConversionCalculationType, TimeGranularity
from dbt.artifacts.resources.base import GraphResource
from dbt.artifacts.resources.types import NodeType
from dbt.artifacts.resources.v1.components import DependsOn, RefArgs
from dbt.artifacts.resources.v1.semantic_layer_components import (
SourceFileMetadata,
WhereFilterIntersection,
)
from dbt_semantic_interfaces.type_enums import (
ConversionCalculationType,
MetricType,
TimeGranularity,
)
from dbt_semantic_interfaces.references import MeasureReference, MetricReference
from typing import List, Optional
from typing import Any, Dict, List, Literal, Optional


@dataclass
Expand Down Expand Up @@ -79,3 +91,45 @@ class MetricConfig(BaseConfig):
default=None,
metadata=CompareBehavior.Exclude.meta(),
)


@dataclass
class Metric(GraphResource):
name: str
description: str
label: str
type: MetricType
type_params: MetricTypeParams
filter: Optional[WhereFilterIntersection] = None
metadata: Optional[SourceFileMetadata] = None
resource_type: Literal[NodeType.Metric]
meta: Dict[str, Any] = field(default_factory=dict)
tags: List[str] = field(default_factory=list)
config: MetricConfig = field(default_factory=MetricConfig)
unrendered_config: Dict[str, Any] = field(default_factory=dict)
sources: List[List[str]] = field(default_factory=list)
depends_on: DependsOn = field(default_factory=DependsOn)
refs: List[RefArgs] = field(default_factory=list)
metrics: List[List[str]] = field(default_factory=list)
created_at: float = field(default_factory=lambda: time.time())
group: Optional[str] = None

@property
def depends_on_nodes(self):
return self.depends_on.nodes

Check warning on line 119 in core/dbt/artifacts/resources/v1/metric.py

View check run for this annotation

Codecov / codecov/patch

core/dbt/artifacts/resources/v1/metric.py#L119

Added line #L119 was not covered by tests

@property
def search_name(self):
return self.name

@property
def input_measures(self) -> List[MetricInputMeasure]:
return self.type_params.input_measures

@property
def measure_references(self) -> List[MeasureReference]:
return [x.measure_reference() for x in self.input_measures]

@property
def input_metrics(self) -> List[MetricInput]:
return self.type_params.metrics or []
48 changes: 2 additions & 46 deletions core/dbt/contracts/graph/nodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@
SemanticModelReference,
TimeDimensionReference,
)
from dbt_semantic_interfaces.type_enums import MetricType

from .model_config import (
NodeConfig,
Expand All @@ -91,17 +90,13 @@
MacroArgument,
Documentation as DocumentationResource,
Macro as MacroResource,
MetricConfig,
MetricInput as MetricInputResource,
MetricInputMeasure as MetricInputMeasureResource,
MetricTypeParams as MetricTypeParamsResource,
Metric as MetricResource,
NodeVersion,
Group as GroupResource,
GraphResource,
RefArgs as RefArgsResource,
SavedQuery as SavedQueryResource,
SourceFileMetadata as SourceFileMetadataResource,
WhereFilterIntersection as WhereFilterIntersectionResource,
)


Expand Down Expand Up @@ -1461,46 +1456,7 @@ def group(self):


@dataclass
class Metric(GraphNode):
name: str
description: str
label: str
type: MetricType
type_params: MetricTypeParamsResource
filter: Optional[WhereFilterIntersectionResource] = None
metadata: Optional[SourceFileMetadataResource] = None
resource_type: Literal[NodeType.Metric]
meta: Dict[str, Any] = field(default_factory=dict)
tags: List[str] = field(default_factory=list)
config: MetricConfig = field(default_factory=MetricConfig)
unrendered_config: Dict[str, Any] = field(default_factory=dict)
sources: List[List[str]] = field(default_factory=list)
depends_on: DependsOn = field(default_factory=DependsOn)
refs: List[RefArgsResource] = field(default_factory=list)
metrics: List[List[str]] = field(default_factory=list)
created_at: float = field(default_factory=lambda: time.time())
group: Optional[str] = None

@property
def depends_on_nodes(self):
return self.depends_on.nodes

@property
def search_name(self):
return self.name

@property
def input_measures(self) -> List[MetricInputMeasureResource]:
return self.type_params.input_measures

@property
def measure_references(self) -> List[MeasureReference]:
return [x.measure_reference() for x in self.input_measures]

@property
def input_metrics(self) -> List[MetricInputResource]:
return self.type_params.metrics or []

class Metric(GraphNode, MetricResource):
def same_description(self, old: "Metric") -> bool:
return self.description == old.description

Expand Down

0 comments on commit 1e16f5d

Please sign in to comment.