Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Consolidated meta config to use the same models #361

Merged
merged 16 commits into from
Nov 12, 2024
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changes/unreleased/Breaking Changes-20241024-131227.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
kind: Breaking Changes
body: Consolidated meta config to use the same models
time: 2024-10-24T13:12:27.343387-05:00
custom:
Author: DevonFulcher
Issue: None
6 changes: 6 additions & 0 deletions .changes/unreleased/Features-20241023-113450.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
kind: Features
body: Support meta for dimensions, entities, and measures
time: 2024-10-23T11:34:50.577294-05:00
custom:
Author: DevonFulcher
Issue: None
18 changes: 18 additions & 0 deletions dbt_semantic_interfaces/implementations/element_config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from typing import Any, Dict

from pydantic import Field
from typing_extensions import override

from dbt_semantic_interfaces.implementations.base import HashableBaseModel
from dbt_semantic_interfaces.protocols.meta import SemanticLayerElementConfig
from dbt_semantic_interfaces.protocols.protocol_hint import ProtocolHint


class PydanticSemanticLayerElementConfig(HashableBaseModel, ProtocolHint[SemanticLayerElementConfig]):
"""PydanticDimension config."""

@override
def _implements_protocol(self) -> SemanticLayerElementConfig: # noqa: D
return self

meta: Dict[str, Any] = Field(default_factory=dict)
4 changes: 4 additions & 0 deletions dbt_semantic_interfaces/implementations/elements/dimension.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
HashableBaseModel,
ModelWithMetadataParsing,
)
from dbt_semantic_interfaces.implementations.element_config import (
PydanticSemanticLayerElementConfig,
)
from dbt_semantic_interfaces.implementations.metadata import PydanticMetadata
from dbt_semantic_interfaces.references import (
DimensionReference,
Expand Down Expand Up @@ -48,6 +51,7 @@ class PydanticDimension(HashableBaseModel, ModelWithMetadataParsing):
expr: Optional[str] = None
metadata: Optional[PydanticMetadata]
label: Optional[str] = None
config: Optional[PydanticSemanticLayerElementConfig]

@property
def reference(self) -> DimensionReference: # noqa: D
Expand Down
4 changes: 4 additions & 0 deletions dbt_semantic_interfaces/implementations/elements/entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
HashableBaseModel,
ModelWithMetadataParsing,
)
from dbt_semantic_interfaces.implementations.element_config import (
PydanticSemanticLayerElementConfig,
)
from dbt_semantic_interfaces.implementations.metadata import PydanticMetadata
from dbt_semantic_interfaces.references import EntityReference
from dbt_semantic_interfaces.type_enums import EntityType
Expand All @@ -21,6 +24,7 @@ class PydanticEntity(HashableBaseModel, ModelWithMetadataParsing):
expr: Optional[str] = None
metadata: Optional[PydanticMetadata] = None
label: Optional[str] = None
config: Optional[PydanticSemanticLayerElementConfig]

@property
def reference(self) -> EntityReference: # noqa: D
Expand Down
4 changes: 4 additions & 0 deletions dbt_semantic_interfaces/implementations/elements/measure.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
HashableBaseModel,
ModelWithMetadataParsing,
)
from dbt_semantic_interfaces.implementations.element_config import (
PydanticSemanticLayerElementConfig,
)
from dbt_semantic_interfaces.implementations.metadata import PydanticMetadata
from dbt_semantic_interfaces.references import MeasureReference
from dbt_semantic_interfaces.type_enums import AggregationType
Expand Down Expand Up @@ -46,6 +49,7 @@ class PydanticMeasure(HashableBaseModel, ModelWithMetadataParsing):
non_additive_dimension: Optional[PydanticNonAdditiveDimensionParameters] = None
agg_time_dimension: Optional[str] = None
label: Optional[str] = None
config: Optional[PydanticSemanticLayerElementConfig] = None

@property
def reference(self) -> MeasureReference: # noqa: D
Expand Down
17 changes: 6 additions & 11 deletions dbt_semantic_interfaces/implementations/metric.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from __future__ import annotations

from typing import Any, Dict, List, Optional, Sequence, Set
from typing import Dict, List, Optional, Sequence, Set

from typing_extensions import override

Expand All @@ -12,11 +12,14 @@
PydanticCustomInputParser,
PydanticParseableValueType,
)
from dbt_semantic_interfaces.implementations.element_config import (
PydanticSemanticLayerElementConfig,
)
from dbt_semantic_interfaces.implementations.filters.where_filter import (
PydanticWhereFilterIntersection,
)
from dbt_semantic_interfaces.implementations.metadata import PydanticMetadata
from dbt_semantic_interfaces.protocols import Metric, MetricConfig, ProtocolHint
from dbt_semantic_interfaces.protocols import Metric, ProtocolHint
from dbt_semantic_interfaces.references import MeasureReference, MetricReference
from dbt_semantic_interfaces.type_enums import (
ConversionCalculationType,
Expand Down Expand Up @@ -183,14 +186,6 @@ class PydanticMetricTypeParams(HashableBaseModel):
input_measures: List[PydanticMetricInputMeasure] = Field(default_factory=list)


class PydanticMetricConfig(HashableBaseModel, ProtocolHint[MetricConfig]): # noqa: D
@override
def _implements_protocol(self) -> MetricConfig: # noqa: D
return self

meta: Dict[str, Any] = Field(default_factory=dict)


class PydanticMetric(HashableBaseModel, ModelWithMetadataParsing, ProtocolHint[Metric]):
"""Describes a metric."""

Expand All @@ -205,7 +200,7 @@ def _implements_protocol(self) -> Metric: # noqa: D
filter: Optional[PydanticWhereFilterIntersection]
metadata: Optional[PydanticMetadata]
label: Optional[str] = None
config: Optional[PydanticMetricConfig]
config: Optional[PydanticSemanticLayerElementConfig]
time_granularity: Optional[TimeGranularity] = None

@property
Expand Down
16 changes: 5 additions & 11 deletions dbt_semantic_interfaces/implementations/semantic_model.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
from __future__ import annotations

from typing import Any, Dict, List, Optional, Sequence
from typing import List, Optional, Sequence

from typing_extensions import override

from dbt_semantic_interfaces.implementations.base import (
HashableBaseModel,
ModelWithMetadataParsing,
)
from dbt_semantic_interfaces.implementations.element_config import (
PydanticSemanticLayerElementConfig,
)
from dbt_semantic_interfaces.implementations.elements.dimension import PydanticDimension
from dbt_semantic_interfaces.implementations.elements.entity import PydanticEntity
from dbt_semantic_interfaces.implementations.elements.measure import PydanticMeasure
Expand All @@ -16,7 +19,6 @@
from dbt_semantic_interfaces.protocols import (
ProtocolHint,
SemanticModel,
SemanticModelConfig,
SemanticModelDefaults,
)
from dbt_semantic_interfaces.references import (
Expand All @@ -38,14 +40,6 @@ def _implements_protocol(self) -> SemanticModelDefaults: # noqa: D
agg_time_dimension: Optional[str]


class PydanticSemanticModelConfig(HashableBaseModel, ProtocolHint[SemanticModelConfig]): # noqa: D
@override
def _implements_protocol(self) -> SemanticModelConfig: # noqa: D
return self

meta: Dict[str, Any] = Field(default_factory=dict)


class PydanticSemanticModel(HashableBaseModel, ModelWithMetadataParsing, ProtocolHint[SemanticModel]):
"""Describes a semantic model."""

Expand All @@ -65,7 +59,7 @@ def _implements_protocol(self) -> SemanticModel:
label: Optional[str] = None

metadata: Optional[PydanticMetadata]
config: Optional[PydanticSemanticModelConfig]
config: Optional[PydanticSemanticLayerElementConfig]

@property
def entity_references(self) -> List[LinkableElementReference]: # noqa: D
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,19 @@
],
"type": "object"
},
"dimension_config_schema": {
"$id": "dimension_config_schema",
"additionalProperties": false,
"properties": {
"meta": {
"propertyNames": {
"type": "string"
},
"type": "object"
}
},
"type": "object"
},
"dimension_schema": {
"$id": "dimension_schema",
"additionalProperties": false,
Expand All @@ -151,6 +164,9 @@
}
],
"properties": {
"config": {
"$ref": "#/definitions/dimension_config_schema"
},
"description": {
"type": "string"
},
Expand Down Expand Up @@ -227,10 +243,26 @@
],
"type": "object"
},
"entity_config_schema": {
"$id": "entity_config_schema",
"additionalProperties": false,
"properties": {
"meta": {
"propertyNames": {
"type": "string"
},
"type": "object"
}
},
"type": "object"
},
"entity_schema": {
"$id": "entity_schema",
"additionalProperties": false,
"properties": {
"config": {
"$ref": "#/definitions/entity_config_schema"
},
"entity": {
"type": "string"
},
Expand Down Expand Up @@ -337,6 +369,19 @@
"type"
]
},
"measure_config_schema": {
"$id": "measure_config_schema",
"additionalProperties": false,
"properties": {
"meta": {
"propertyNames": {
"type": "string"
},
"type": "object"
}
},
"type": "object"
},
"measure_schema": {
"$id": "measure_schema",
"additionalProperties": false,
Expand Down Expand Up @@ -370,6 +415,9 @@
"pattern": "(?!.*__).*^[a-z][a-z0-9_]*[a-z0-9]$",
"type": "string"
},
"config": {
"$ref": "#/definitions/measure_config_schema"
},
"create_metric": {
"type": "boolean"
},
Expand Down
34 changes: 34 additions & 0 deletions dbt_semantic_interfaces/parsing/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,16 @@
"additionalProperties": False,
}


entity_config_schema = {
"$id": "entity_config_schema",
"type": "object",
"properties": {
"meta": {"type": "object", "propertyNames": {"type": "string"}},
},
"additionalProperties": False,
}

entity_schema = {
"$id": "entity_schema",
"type": "object",
Expand All @@ -174,6 +184,7 @@
"expr": {"type": ["string", "boolean"]},
"entity": {"type": "string"},
"label": {"type": "string"},
"config": {"$ref": "entity_config_schema"},
},
"additionalProperties": False,
"required": ["name", "type"],
Expand Down Expand Up @@ -226,6 +237,15 @@
"additionalProperties": False,
}

measure_config_schema = {
"$id": "measure_config_schema",
"type": "object",
"properties": {
"meta": {"type": "object", "propertyNames": {"type": "string"}},
},
"additionalProperties": False,
}

measure_schema = {
"$id": "measure_schema",
"type": "object",
Expand All @@ -248,11 +268,21 @@
},
"description": {"type": "string"},
"label": {"type": "string"},
"config": {"$ref": "measure_config_schema"},
},
"additionalProperties": False,
"required": ["name", "agg"],
}

dimension_config_schema = {
"$id": "dimension_config_schema",
"type": "object",
"properties": {
"meta": {"type": "object", "propertyNames": {"type": "string"}},
},
"additionalProperties": False,
}

dimension_schema = {
"$id": "dimension_schema",
"type": "object",
Expand All @@ -267,6 +297,7 @@
"expr": {"type": ["string", "boolean"]},
"type_params": {"$ref": "dimension_type_params_schema"},
"label": {"type": "string"},
"config": {"$ref": "dimension_config_schema"},
},
# dimension must have type_params if its a time dimension
"anyOf": [{"not": {"$ref": "#/definitions/is-time-dimension"}}, {"required": ["type_params"]}],
Expand Down Expand Up @@ -529,6 +560,9 @@
saved_query_query_params_schema["$id"]: saved_query_query_params_schema,
semantic_model_config_schema["$id"]: semantic_model_config_schema,
metric_config_schema["$id"]: metric_config_schema,
dimension_config_schema["$id"]: dimension_config_schema,
entity_config_schema["$id"]: entity_config_schema,
measure_config_schema["$id"]: measure_config_schema,
}

resources: List[Tuple[str, Resource]] = [(str(k), DRAFT7.create_resource(v)) for k, v in schema_store.items()]
Expand Down
2 changes: 0 additions & 2 deletions dbt_semantic_interfaces/protocols/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
ConstantPropertyInput,
ConversionTypeParams,
Metric,
MetricConfig,
MetricInput,
MetricInputMeasure,
MetricTimeWindow,
Expand All @@ -28,7 +27,6 @@
)
from dbt_semantic_interfaces.protocols.semantic_model import ( # noqa:F401
SemanticModel,
SemanticModelConfig,
SemanticModelDefaults,
SemanticModelT,
)
Expand Down
6 changes: 6 additions & 0 deletions dbt_semantic_interfaces/protocols/dimension.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from abc import abstractmethod
from typing import Optional, Protocol

from dbt_semantic_interfaces.protocols.meta import SemanticLayerElementConfig
from dbt_semantic_interfaces.protocols.metadata import Metadata
from dbt_semantic_interfaces.references import (
DimensionReference,
Expand Down Expand Up @@ -107,3 +108,8 @@ def validity_params(self) -> Optional[DimensionValidityParams]:
def label(self) -> Optional[str]:
"""Returns a string representing a human readable label for the dimension."""
pass

@property
@abstractmethod
def config(self) -> Optional[SemanticLayerElementConfig]: # noqa: D
pass
Loading
Loading