From a321b1ac8b705ee8b6be51a97a709134407bdfac Mon Sep 17 00:00:00 2001 From: Paul Yang Date: Thu, 9 Oct 2025 16:57:40 -0700 Subject: [PATCH 1/2] /* PR_START p/misc 01 */Rename `Metricflow*` -> `MetricFlow*` --- .../dsi/manifest_object_lookup.py | 4 +- .../dsi/simple_metric_model_object_lookup.py | 8 +-- .../experimental/metricflow_exception.py | 8 +-- .../mf_graph/formatting/graph_formatter.py | 6 +- .../formatting/pretty_graph_formatter.py | 8 +-- .../experimental/mf_graph/graph_converter.py | 6 +- .../experimental/mf_graph/graph_element.py | 2 +- .../experimental/mf_graph/graph_id.py | 4 +- .../experimental/mf_graph/graph_labeling.py | 2 +- .../experimental/mf_graph/mf_graph.py | 60 +++++++++---------- .../experimental/mf_graph/mutable_graph.py | 40 ++++++------- .../experimental/mf_graph/node_descriptor.py | 2 +- .../mf_graph/path_finding/graph_path.py | 10 ++-- .../mf_graph/path_finding/pathfinder.py | 30 +++++----- .../path_finding/pathfinder_result.py | 6 +- .../path_finding/traversal_profile_differ.py | 4 +- .../attribute_resolution/attribute_recipe.py | 4 +- .../recipe_writer_path.py | 4 +- .../sg_linkable_spec_resolver.py | 16 ++--- .../semantic_graph/builder/metric_subgraph.py | 6 +- .../semantic_graph/edges/edge_labels.py | 12 ++-- .../semantic_graph/edges/sg_edges.py | 10 ++-- .../semantic_graph/nodes/attribute_nodes.py | 26 ++++---- .../semantic_graph/nodes/entity_nodes.py | 54 ++++++++--------- .../semantic_graph/nodes/node_labels.py | 24 ++++---- .../semantic_graph/sg_exceptions.py | 4 +- .../semantic_graph/sg_interfaces.py | 20 +++---- .../trie_resolver/dunder_name_trie.py | 4 +- .../dunder_name_trie_resolver.py | 4 +- .../trie_resolver/group_by_metric_resolver.py | 12 ++-- .../trie_resolver/simple_resolver.py | 18 +++--- .../model/semantic_manifest_lookup.py | 4 +- .../model/semantics/metric_lookup.py | 20 +++---- .../experimental/graph_helpers.py | 4 +- .../experimental/mf_graph/flow_graph.py | 26 ++++---- .../mf_graph/formatting/dot_formatter.py | 12 ++-- .../mf_graph/formatting/mf_to_dot.py | 14 ++--- .../formatting/mf_to_graphical_dot.py | 26 ++++---- .../mf_graph/formatting/svg_formatter.py | 14 ++--- .../mf_graph/path_finding/test_path_finder.py | 4 +- .../test_recipe_writer.py | 4 +- .../semantic_graph/sg_fixtures.py | 4 +- .../test_group_by_metric_trie_resolver.py | 4 +- .../test_simple_trie_resolver.py | 6 +- metricflow/engine/metricflow_engine.py | 4 +- 45 files changed, 282 insertions(+), 282 deletions(-) diff --git a/metricflow-semantics/metricflow_semantics/experimental/dsi/manifest_object_lookup.py b/metricflow-semantics/metricflow_semantics/experimental/dsi/manifest_object_lookup.py index fa7a8c448b..d265251ef0 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/dsi/manifest_object_lookup.py +++ b/metricflow-semantics/metricflow_semantics/experimental/dsi/manifest_object_lookup.py @@ -17,7 +17,7 @@ ModelObjectLookup, ) from metricflow_semantics.experimental.dsi.simple_metric_model_object_lookup import SimpleMetricModelObjectLookup -from metricflow_semantics.experimental.metricflow_exception import MetricflowInternalError +from metricflow_semantics.experimental.metricflow_exception import MetricFlowInternalError from metricflow_semantics.experimental.ordered_set import FrozenOrderedSet, MutableOrderedSet, OrderedSet from metricflow_semantics.experimental.semantic_graph.model_id import SemanticModelId from metricflow_semantics.mf_logging.attribute_pretty_format import AttributeMapping, AttributePrettyFormattable @@ -67,7 +67,7 @@ def _semantic_model_and_simple_metrics_pairs(self) -> Sequence[Pair[SemanticMode if metric_type is MetricType.SIMPLE: metric_aggregation_params = metric.type_params.metric_aggregation_params if metric_aggregation_params is None: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat("A simple metric is missing `metric_aggregation_params`", metric=metric) ) model_name_to_simple_metrics[metric_aggregation_params.semantic_model].append(metric) diff --git a/metricflow-semantics/metricflow_semantics/experimental/dsi/simple_metric_model_object_lookup.py b/metricflow-semantics/metricflow_semantics/experimental/dsi/simple_metric_model_object_lookup.py index 1bc84de341..2610cede4d 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/dsi/simple_metric_model_object_lookup.py +++ b/metricflow-semantics/metricflow_semantics/experimental/dsi/simple_metric_model_object_lookup.py @@ -12,7 +12,7 @@ from metricflow_semantics.experimental.dataclass_helpers import fast_frozen_dataclass from metricflow_semantics.experimental.dsi.model_object_lookup import ModelObjectLookup -from metricflow_semantics.experimental.metricflow_exception import InvalidManifestException, MetricflowInternalError +from metricflow_semantics.experimental.metricflow_exception import InvalidManifestException, MetricFlowInternalError from metricflow_semantics.mf_logging.attribute_pretty_format import AttributeMapping from metricflow_semantics.mf_logging.lazy_formattable import LazyFormat from metricflow_semantics.model.semantics.simple_metric_input import ( @@ -45,7 +45,7 @@ def __init__( # noqa: D107 model_name = semantic_model.name # Sanity checks. if not simple_metrics: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat( "Can't initialize with empty `simple_metrics`", simple_metrics=simple_metrics, @@ -53,12 +53,12 @@ def __init__( # noqa: D107 ) for metric in simple_metrics: if metric.type is not MetricType.SIMPLE: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat("Can't initialize with a metric that is not a simple metric", metric=metric) ) metric_aggregation_params = metric.type_params.metric_aggregation_params if metric_aggregation_params is None or metric_aggregation_params.semantic_model != model_name: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat( "Can't initialize with a metric that is not associated with this semantic model", metric=metric, diff --git a/metricflow-semantics/metricflow_semantics/experimental/metricflow_exception.py b/metricflow-semantics/metricflow_semantics/experimental/metricflow_exception.py index 9722d71703..162d5520ab 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/metricflow_exception.py +++ b/metricflow-semantics/metricflow_semantics/experimental/metricflow_exception.py @@ -1,19 +1,19 @@ from __future__ import annotations -class MetricflowException(Exception): +class MetricFlowException(Exception): """Base class for custom exceptions in MF.""" pass -class MetricflowInternalError(MetricflowException): +class MetricFlowInternalError(MetricFlowException): """A non-recoverable error due to an issue within MF and not caused by the user..""" pass -class InvalidManifestException(MetricflowException): +class InvalidManifestException(MetricFlowException): """Raised when an invalid manifest is detected. Generally, a semantic manifest is validated before it is passed into the engine. This is useful to raise in @@ -23,5 +23,5 @@ class InvalidManifestException(MetricflowException): pass -class GraphvizException(MetricflowException): +class GraphvizException(MetricFlowException): """Raised when there is an error when calling `graphviz` methods.""" diff --git a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/formatting/graph_formatter.py b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/formatting/graph_formatter.py index 51b43f2ad8..541a669962 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/formatting/graph_formatter.py +++ b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/formatting/graph_formatter.py @@ -5,15 +5,15 @@ from abc import ABC, abstractmethod if typing.TYPE_CHECKING: - from metricflow_semantics.experimental.mf_graph.mf_graph import MetricflowGraph + from metricflow_semantics.experimental.mf_graph.mf_graph import MetricFlowGraph logger = logging.getLogger(__name__) -class MetricflowGraphFormatter(ABC): +class MetricFlowGraphFormatter(ABC): """Interface for a graph-to-text formatter.""" @abstractmethod - def format_graph(self, graph: MetricflowGraph) -> str: + def format_graph(self, graph: MetricFlowGraph) -> str: """Format the given graph to text.""" raise NotImplementedError diff --git a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/formatting/pretty_graph_formatter.py b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/formatting/pretty_graph_formatter.py index 900ca7d51e..2175fba860 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/formatting/pretty_graph_formatter.py +++ b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/formatting/pretty_graph_formatter.py @@ -5,18 +5,18 @@ from typing_extensions import override -from metricflow_semantics.experimental.mf_graph.formatting.graph_formatter import MetricflowGraphFormatter +from metricflow_semantics.experimental.mf_graph.formatting.graph_formatter import MetricFlowGraphFormatter from metricflow_semantics.mf_logging.pretty_print import mf_pformat if typing.TYPE_CHECKING: - from metricflow_semantics.experimental.mf_graph.mf_graph import MetricflowGraph + from metricflow_semantics.experimental.mf_graph.mf_graph import MetricFlowGraph logger = logging.getLogger(__name__) -class PrettyFormatGraphFormatter(MetricflowGraphFormatter): +class PrettyFormatGraphFormatter(MetricFlowGraphFormatter): """Formats a graph using `mf_pformat()`.""" @override - def format_graph(self, graph: MetricflowGraph) -> str: + def format_graph(self, graph: MetricFlowGraph) -> str: return mf_pformat(graph) diff --git a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/graph_converter.py b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/graph_converter.py index 092a6e4a97..80200ff16d 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/graph_converter.py +++ b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/graph_converter.py @@ -4,7 +4,7 @@ from abc import ABC, abstractmethod from typing import Generic, TypeVar -from metricflow_semantics.experimental.mf_graph.mf_graph import MetricflowGraph +from metricflow_semantics.experimental.mf_graph.mf_graph import MetricFlowGraph logger = logging.getLogger(__name__) @@ -12,10 +12,10 @@ OutputGraphT = TypeVar("OutputGraphT") -class MetricflowGraphConverter(Generic[OutputGraphT], ABC): +class MetricFlowGraphConverter(Generic[OutputGraphT], ABC): """Base class for a class that converts graphs.""" @abstractmethod - def convert_graph(self, graph: MetricflowGraph) -> OutputGraphT: + def convert_graph(self, graph: MetricFlowGraph) -> OutputGraphT: """Convert the graph to the given output type.""" raise NotImplementedError() diff --git a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/graph_element.py b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/graph_element.py index d1d6f301d3..1a487d6d5b 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/graph_element.py +++ b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/graph_element.py @@ -15,7 +15,7 @@ def displayed_properties(self) -> AnyLengthTuple[DisplayedProperty]: return () -class MetricflowGraphElement(HasDisplayedProperty, ABC): +class MetricFlowGraphElement(HasDisplayedProperty, ABC): """An element in a graph (e.g. node).""" pass diff --git a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/graph_id.py b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/graph_id.py index 56827f7016..9530f0ab58 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/graph_id.py +++ b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/graph_id.py @@ -15,7 +15,7 @@ logger = logging.getLogger(__name__) -class MetricflowGraphId(ABC): +class MetricFlowGraphId(ABC): """Interface for an object to identify different graphs.""" @property @@ -25,7 +25,7 @@ def str_value(self) -> str: raise NotImplementedError -class SequentialGraphId(MetricflowGraphId, MetricFlowPrettyFormattable): +class SequentialGraphId(MetricFlowGraphId, MetricFlowPrettyFormattable): """Graph IDs that are generated sequentially.""" # `itertools.count()` returns an iterable that is thread-safe, so this is a way of generating sequential diff --git a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/graph_labeling.py b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/graph_labeling.py index 09ef63ce64..2635a1c398 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/graph_labeling.py +++ b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/graph_labeling.py @@ -8,7 +8,7 @@ from metricflow_semantics.experimental.mf_graph.comparable import Comparable, ComparisonKey -class MetricflowGraphLabel(Comparable, ABC): +class MetricFlowGraphLabel(Comparable, ABC): """Base class for objects that can be used to lookup nodes / edges in a graph.""" @cached_property diff --git a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/mf_graph.py b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/mf_graph.py index 8be1b734c0..7dc29fd277 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/mf_graph.py +++ b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/mf_graph.py @@ -20,14 +20,14 @@ DotGraphAttributeSet, DotNodeAttributeSet, ) -from metricflow_semantics.experimental.mf_graph.formatting.graph_formatter import MetricflowGraphFormatter +from metricflow_semantics.experimental.mf_graph.formatting.graph_formatter import MetricFlowGraphFormatter from metricflow_semantics.experimental.mf_graph.formatting.pretty_graph_formatter import PrettyFormatGraphFormatter from metricflow_semantics.experimental.mf_graph.graph_element import ( - MetricflowGraphElement, + MetricFlowGraphElement, ) -from metricflow_semantics.experimental.mf_graph.graph_id import MetricflowGraphId -from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricflowGraphLabel -from metricflow_semantics.experimental.mf_graph.node_descriptor import MetricflowGraphNodeDescriptor +from metricflow_semantics.experimental.mf_graph.graph_id import MetricFlowGraphId +from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricFlowGraphLabel +from metricflow_semantics.experimental.mf_graph.node_descriptor import MetricFlowGraphNodeDescriptor from metricflow_semantics.experimental.ordered_set import FrozenOrderedSet, MutableOrderedSet, OrderedSet from metricflow_semantics.mf_logging.format_option import PrettyFormatOption from metricflow_semantics.mf_logging.lazy_formattable import LazyFormat @@ -39,17 +39,17 @@ logger = logging.getLogger(__name__) -NodeT = TypeVar("NodeT", bound="MetricflowGraphNode") -EdgeT = TypeVar("EdgeT", bound="MetricflowGraphEdge") +NodeT = TypeVar("NodeT", bound="MetricFlowGraphNode") +EdgeT = TypeVar("EdgeT", bound="MetricFlowGraphEdge") -NodeT_co = TypeVar("NodeT_co", bound="MetricflowGraphNode", covariant=True) -EdgeT_co = TypeVar("EdgeT_co", bound="MetricflowGraphEdge", covariant=True) +NodeT_co = TypeVar("NodeT_co", bound="MetricFlowGraphNode", covariant=True) +EdgeT_co = TypeVar("EdgeT_co", bound="MetricFlowGraphEdge", covariant=True) -class MetricflowGraphNode(MetricflowGraphElement, MetricFlowPrettyFormattable, Comparable, ABC): +class MetricFlowGraphNode(MetricFlowGraphElement, MetricFlowPrettyFormattable, Comparable, ABC): """Base class for nodes in a directed graph.""" - _DEFAULT_NODE_LABELS: ClassVar[OrderedSet[MetricflowGraphLabel]] = FrozenOrderedSet() + _DEFAULT_NODE_LABELS: ClassVar[OrderedSet[MetricFlowGraphLabel]] = FrozenOrderedSet() def as_dot_node(self, include_graphical_attributes: bool) -> DotNodeAttributeSet: """Return this as attributes for a DOT node. @@ -65,13 +65,13 @@ def as_dot_node(self, include_graphical_attributes: bool) -> DotNodeAttributeSet @property @abstractmethod - def node_descriptor(self) -> MetricflowGraphNodeDescriptor: # noqa: D102 + def node_descriptor(self) -> MetricFlowGraphNodeDescriptor: # noqa: D102 raise NotImplementedError @property - def labels(self) -> OrderedSet[MetricflowGraphLabel]: + def labels(self) -> OrderedSet[MetricFlowGraphLabel]: """Return the labels that can be used for lookups to get this node.""" - return MetricflowGraphNode._DEFAULT_NODE_LABELS + return MetricFlowGraphNode._DEFAULT_NODE_LABELS @override def pretty_format(self, format_context: PrettyFormatContext) -> Optional[str]: @@ -89,13 +89,13 @@ def pretty_format(self, format_context: PrettyFormatContext) -> Optional[str]: @fast_frozen_dataclass(order=False) -class MetricflowGraphEdge(MetricflowGraphElement, MetricFlowPrettyFormattable, Comparable, Generic[NodeT_co], ABC): +class MetricFlowGraphEdge(MetricFlowGraphElement, MetricFlowPrettyFormattable, Comparable, Generic[NodeT_co], ABC): """Base class for edges in a directed graph. An edge can be visualized as an arrow that points from the tail node to the head node. """ - _DEFAULT_EDGE_LABELS: ClassVar[OrderedSet[MetricflowGraphLabel]] = FrozenOrderedSet() + _DEFAULT_EDGE_LABELS: ClassVar[OrderedSet[MetricFlowGraphLabel]] = FrozenOrderedSet() tail_node: NodeT_co head_node: NodeT_co @@ -125,9 +125,9 @@ def as_dot_edge(self, include_graphical_attributes: bool) -> DotEdgeAttributeSet ) @property - def labels(self) -> OrderedSet[MetricflowGraphLabel]: + def labels(self) -> OrderedSet[MetricFlowGraphLabel]: """Return the labels that can be used for lookups to get this edge.""" - return MetricflowGraphEdge._DEFAULT_EDGE_LABELS + return MetricFlowGraphEdge._DEFAULT_EDGE_LABELS @override def pretty_format(self, format_context: PrettyFormatContext) -> Optional[str]: @@ -144,7 +144,7 @@ def pretty_format(self, format_context: PrettyFormatContext) -> Optional[str]: ) @cached_property - def labels_for_path_addition(self) -> OrderedSet[MetricflowGraphLabel]: + def labels_for_path_addition(self) -> OrderedSet[MetricFlowGraphLabel]: """Return the labels for this edge and the head node. This is useful for collecting labels while building a path by adding an edge. @@ -152,7 +152,7 @@ def labels_for_path_addition(self) -> OrderedSet[MetricflowGraphLabel]: return self.labels.union(self.head_node.labels) -class MetricflowGraph(MetricFlowPrettyFormattable, Generic[NodeT_co, EdgeT_co], ABC): +class MetricFlowGraph(MetricFlowPrettyFormattable, Generic[NodeT_co, EdgeT_co], ABC): """Base class for a directed graph.""" @property @@ -162,11 +162,11 @@ def nodes(self) -> OrderedSet[NodeT_co]: raise NotImplementedError() @abstractmethod - def nodes_with_labels(self, *graph_labels: MetricflowGraphLabel) -> OrderedSet[NodeT_co]: + def nodes_with_labels(self, *graph_labels: MetricFlowGraphLabel) -> OrderedSet[NodeT_co]: """Return nodes in the graph with any one of the given labels.""" raise NotImplementedError() - def node_with_label(self, label: MetricflowGraphLabel) -> NodeT_co: + def node_with_label(self, label: MetricFlowGraphLabel) -> NodeT_co: """Finds the node with the given label. If not exactly one if found, an error is raised.""" nodes = self.nodes_with_labels(label) matching_node_count = len(nodes) @@ -187,26 +187,26 @@ def edges(self) -> OrderedSet[EdgeT_co]: raise NotImplementedError() @abstractmethod - def edges_with_tail_node(self, tail_node: MetricflowGraphNode) -> OrderedSet[EdgeT_co]: + def edges_with_tail_node(self, tail_node: MetricFlowGraphNode) -> OrderedSet[EdgeT_co]: """Returns edges with the given tail node.""" raise NotImplementedError() @abstractmethod - def edges_with_head_node(self, tail_node: MetricflowGraphNode) -> OrderedSet[EdgeT_co]: + def edges_with_head_node(self, tail_node: MetricFlowGraphNode) -> OrderedSet[EdgeT_co]: """Returns edges with the given head node.""" raise NotImplementedError() @abstractmethod - def edges_with_label(self, label: MetricflowGraphLabel) -> OrderedSet[EdgeT_co]: + def edges_with_label(self, label: MetricFlowGraphLabel) -> OrderedSet[EdgeT_co]: """Return the set of edges in a graph that have the given label.""" raise NotImplementedError() - def format(self, formatter: MetricflowGraphFormatter = PrettyFormatGraphFormatter()) -> str: + def format(self, formatter: MetricFlowGraphFormatter = PrettyFormatGraphFormatter()) -> str: """Return a representation of this graph using the given formatter.""" return formatter.format_graph(self) @abstractmethod - def successors(self, node: MetricflowGraphNode) -> OrderedSet[NodeT_co]: + def successors(self, node: MetricFlowGraphNode) -> OrderedSet[NodeT_co]: """Returns successors of the given node. Raises `UnknownNodeException` if the node does not exist in the graph. @@ -214,7 +214,7 @@ def successors(self, node: MetricflowGraphNode) -> OrderedSet[NodeT_co]: return FrozenOrderedSet(edge.head_node for edge in self.edges_with_tail_node(node)) @abstractmethod - def predecessors(self, node: MetricflowGraphNode) -> OrderedSet[NodeT_co]: + def predecessors(self, node: MetricFlowGraphNode) -> OrderedSet[NodeT_co]: """Returns predecessors of the given node. Raises `UnknownNodeException` if the node does not exist in the graph. @@ -233,7 +233,7 @@ def as_sorted(self) -> Self: """Return a copy of this graph with the nodes and edges sorted.""" raise NotImplementedError - def _intersect_edges(self, other: MetricflowGraph[NodeT_co, EdgeT_co]) -> OrderedSet[EdgeT_co]: + def _intersect_edges(self, other: MetricFlowGraph[NodeT_co, EdgeT_co]) -> OrderedSet[EdgeT_co]: return self.edges.intersection(other.edges) @abstractmethod @@ -267,7 +267,7 @@ def as_dot_graph(self, include_graphical_attributes: bool) -> DotGraphAttributeS @property @abstractmethod - def graph_id(self) -> MetricflowGraphId: + def graph_id(self) -> MetricFlowGraphId: """Return a graph ID. This ID will be used for caching cases. diff --git a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/mutable_graph.py b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/mutable_graph.py index f8b567885d..4630f4cc5c 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/mutable_graph.py +++ b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/mutable_graph.py @@ -8,12 +8,12 @@ from typing_extensions import override from metricflow_semantics.collection_helpers.syntactic_sugar import mf_flatten -from metricflow_semantics.experimental.mf_graph.graph_id import MetricflowGraphId, SequentialGraphId -from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricflowGraphLabel +from metricflow_semantics.experimental.mf_graph.graph_id import MetricFlowGraphId, SequentialGraphId +from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricFlowGraphLabel from metricflow_semantics.experimental.mf_graph.mf_graph import ( EdgeT, - MetricflowGraph, - MetricflowGraphNode, + MetricFlowGraph, + MetricFlowGraphNode, NodeT, ) from metricflow_semantics.experimental.ordered_set import FrozenOrderedSet, MutableOrderedSet, OrderedSet @@ -24,23 +24,23 @@ @dataclass -class MutableGraph(Generic[NodeT, EdgeT], MetricflowGraph[NodeT, EdgeT], ABC): +class MutableGraph(Generic[NodeT, EdgeT], MetricFlowGraph[NodeT, EdgeT], ABC): """Base class for mutable graphs. The graph ID is changed to a new value whenever this changes for easier cache management. """ - _graph_id: MetricflowGraphId + _graph_id: MetricFlowGraphId _nodes: MutableOrderedSet[NodeT] _edges: MutableOrderedSet[EdgeT] - _label_to_nodes: DefaultDict[MetricflowGraphLabel, MutableOrderedSet[NodeT]] - _tail_node_to_edges: DefaultDict[MetricflowGraphNode, MutableOrderedSet[EdgeT]] - _head_node_to_edges: DefaultDict[MetricflowGraphNode, MutableOrderedSet[EdgeT]] - _label_to_edges: DefaultDict[MetricflowGraphLabel, MutableOrderedSet[EdgeT]] + _label_to_nodes: DefaultDict[MetricFlowGraphLabel, MutableOrderedSet[NodeT]] + _tail_node_to_edges: DefaultDict[MetricFlowGraphNode, MutableOrderedSet[EdgeT]] + _head_node_to_edges: DefaultDict[MetricFlowGraphNode, MutableOrderedSet[EdgeT]] + _label_to_edges: DefaultDict[MetricFlowGraphLabel, MutableOrderedSet[EdgeT]] - _node_to_predecessor_nodes: DefaultDict[MetricflowGraphNode, MutableOrderedSet[NodeT]] - _node_to_successor_nodes: DefaultDict[MetricflowGraphNode, MutableOrderedSet[NodeT]] + _node_to_predecessor_nodes: DefaultDict[MetricFlowGraphNode, MutableOrderedSet[NodeT]] + _node_to_successor_nodes: DefaultDict[MetricFlowGraphNode, MutableOrderedSet[NodeT]] def add_node(self, node: NodeT) -> None: # noqa: D102 self.add_nodes((node,)) @@ -76,7 +76,7 @@ def add_edges(self, edges: Iterable[EdgeT]) -> None: # noqa: D102 self._edges.update(edges) self._graph_id = SequentialGraphId.create() - def update(self, other: MetricflowGraph[NodeT, EdgeT]) -> None: + def update(self, other: MetricFlowGraph[NodeT, EdgeT]) -> None: """Add the nodes and edges to this graph.""" self.add_nodes(other.nodes) self.add_edges(other.edges) @@ -88,7 +88,7 @@ def nodes(self) -> OrderedSet[NodeT]: # noqa: D102 return self._nodes @override - def nodes_with_labels(self, *graph_labels: MetricflowGraphLabel) -> OrderedSet[NodeT]: + def nodes_with_labels(self, *graph_labels: MetricFlowGraphLabel) -> OrderedSet[NodeT]: return FrozenOrderedSet(mf_flatten(self._label_to_nodes[label] for label in graph_labels)) @override @@ -97,26 +97,26 @@ def edges(self) -> OrderedSet[EdgeT]: return self._edges @override - def edges_with_tail_node(self, tail_node: MetricflowGraphNode) -> OrderedSet[EdgeT]: + def edges_with_tail_node(self, tail_node: MetricFlowGraphNode) -> OrderedSet[EdgeT]: return self._tail_node_to_edges[tail_node] @override - def edges_with_head_node(self, head_node: MetricflowGraphNode) -> OrderedSet[EdgeT]: + def edges_with_head_node(self, head_node: MetricFlowGraphNode) -> OrderedSet[EdgeT]: return self._head_node_to_edges[head_node] @override - def edges_with_label(self, label: MetricflowGraphLabel) -> OrderedSet[EdgeT]: + def edges_with_label(self, label: MetricFlowGraphLabel) -> OrderedSet[EdgeT]: return self._label_to_edges[label] @override - def successors(self, node: MetricflowGraphNode) -> OrderedSet[NodeT]: + def successors(self, node: MetricFlowGraphNode) -> OrderedSet[NodeT]: return self._node_to_successor_nodes[node] @override - def predecessors(self, node: MetricflowGraphNode) -> OrderedSet[NodeT]: + def predecessors(self, node: MetricFlowGraphNode) -> OrderedSet[NodeT]: return self._node_to_predecessor_nodes[node] @override @property - def graph_id(self) -> MetricflowGraphId: + def graph_id(self) -> MetricFlowGraphId: return self._graph_id diff --git a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/node_descriptor.py b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/node_descriptor.py index f98500f613..bb32b57dc3 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/node_descriptor.py +++ b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/node_descriptor.py @@ -9,7 +9,7 @@ @fast_frozen_dataclass() -class MetricflowGraphNodeDescriptor: +class MetricFlowGraphNodeDescriptor: """Descriptor for a node to allow for lookups by strings.""" node_name: str diff --git a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/path_finding/graph_path.py b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/path_finding/graph_path.py index 31921b1c45..c2060c1b51 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/path_finding/graph_path.py +++ b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/path_finding/graph_path.py @@ -9,7 +9,7 @@ from typing_extensions import Self, override from metricflow_semantics.experimental.mf_graph.comparable import Comparable, ComparisonKey -from metricflow_semantics.experimental.mf_graph.mf_graph import MetricflowGraphEdge, MetricflowGraphNode +from metricflow_semantics.experimental.mf_graph.mf_graph import MetricFlowGraphEdge, MetricFlowGraphNode from metricflow_semantics.mf_logging.pretty_formattable import MetricFlowPrettyFormattable from metricflow_semantics.mf_logging.pretty_formatter import PrettyFormatContext from metricflow_semantics.mf_logging.pretty_print import mf_pformat @@ -17,11 +17,11 @@ logger = logging.getLogger(__name__) -NodeT = TypeVar("NodeT", bound=MetricflowGraphNode) -EdgeT = TypeVar("EdgeT", bound=MetricflowGraphEdge) +NodeT = TypeVar("NodeT", bound=MetricFlowGraphNode) +EdgeT = TypeVar("EdgeT", bound=MetricFlowGraphEdge) -class MetricflowGraphPath(Generic[NodeT, EdgeT], Comparable, MetricFlowPrettyFormattable, Sized, ABC): +class MetricFlowGraphPath(Generic[NodeT, EdgeT], Comparable, MetricFlowPrettyFormattable, Sized, ABC): """A read-only interface that describes a path in a directed graph.""" @property @@ -77,7 +77,7 @@ def arrow_format(self) -> str: @dataclass -class MutableGraphPath(MetricflowGraphPath[NodeT, EdgeT], Generic[NodeT, EdgeT]): +class MutableGraphPath(MetricFlowGraphPath[NodeT, EdgeT], Generic[NodeT, EdgeT]): """A path that can be extended and also reverted back to the previous state before extension. * This is a mutable class as path-finding can traverse many edges, and using a single mutable object reduces diff --git a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/path_finding/pathfinder.py b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/path_finding/pathfinder.py index 9782e9c264..c3c22fd04d 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/path_finding/pathfinder.py +++ b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/path_finding/pathfinder.py @@ -9,10 +9,10 @@ from typing import Final, Generic, Iterator, Optional, Sequence, TypeVar from metricflow_semantics.collection_helpers.syntactic_sugar import mf_flatten -from metricflow_semantics.experimental.metricflow_exception import MetricflowInternalError -from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricflowGraphLabel +from metricflow_semantics.experimental.metricflow_exception import MetricFlowInternalError +from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricFlowGraphLabel from metricflow_semantics.experimental.mf_graph.mf_graph import ( - MetricflowGraph, + MetricFlowGraph, ) from metricflow_semantics.experimental.mf_graph.mutable_graph import EdgeT, NodeT from metricflow_semantics.experimental.mf_graph.path_finding.graph_path import MutablePathT @@ -34,7 +34,7 @@ EdgeWeightFunctionT = TypeVar("EdgeWeightFunctionT", bound="WeightFunction") -class MetricflowPathfinder(Generic[NodeT, EdgeT, MutablePathT], ABC): +class MetricFlowPathfinder(Generic[NodeT, EdgeT, MutablePathT], ABC): """Finds paths and related nodes (e.g. ancestors) via common graph algorithms. * This can be swapped out with another implementation. @@ -45,13 +45,13 @@ class MetricflowPathfinder(Generic[NodeT, EdgeT, MutablePathT], ABC): _MAX_BFS_ITERATION_COUNT: Final[int] = 100 def __init__(self) -> None: # noqa: D107 - self._local_state = _MetricflowPathfinderLocalState() + self._local_state = _MetricFlowPathfinderLocalState() self._lo = MutableGraphTraversalProfile() self._verbose_debug_logs = False def find_paths_dfs( self, - graph: MetricflowGraph[NodeT, EdgeT], + graph: MetricFlowGraph[NodeT, EdgeT], initial_path: MutablePathT, target_nodes: Set[NodeT], weight_function: WeightFunction[NodeT, EdgeT, MutablePathT], @@ -92,12 +92,12 @@ def find_paths_dfs( def find_descendants( self, - graph: MetricflowGraph[NodeT, EdgeT], + graph: MetricFlowGraph[NodeT, EdgeT], source_nodes: OrderedSet[NodeT], target_nodes: OrderedSet[NodeT], node_allow_set: Optional[Set[NodeT]] = None, downward_closed: bool = False, - deny_labels: Optional[Set[MetricflowGraphLabel]] = None, + deny_labels: Optional[Set[MetricFlowGraphLabel]] = None, max_iteration_count: int = _MAX_BFS_ITERATION_COUNT, ) -> FindDescendantsResult[NodeT]: """Find descendant nodes of the source nodes via BFS. @@ -132,7 +132,7 @@ def find_descendants( node_to_reachable_source_nodes[node].add(node) iteration_index = 0 - labels_collected_during_traversal: set[MetricflowGraphLabel] = set() + labels_collected_during_traversal: set[MetricFlowGraphLabel] = set() labels_collected_during_traversal.update(*(source_node.labels for source_node in source_nodes)) while iteration_index <= max_iteration_count: @@ -188,11 +188,11 @@ def find_descendants( def find_ancestors( self, - graph: MetricflowGraph[NodeT, EdgeT], + graph: MetricFlowGraph[NodeT, EdgeT], source_nodes: OrderedSet[NodeT], target_nodes: OrderedSet[NodeT], node_allow_set: Optional[Set[NodeT]] = None, - deny_labels: Optional[Set[MetricflowGraphLabel]] = None, + deny_labels: Optional[Set[MetricFlowGraphLabel]] = None, upwards_closed: bool = False, max_iteration_count: int = _MAX_BFS_ITERATION_COUNT, ) -> FindAncestorsResult[NodeT]: @@ -207,7 +207,7 @@ def find_ancestors( iteration_index = 0 - labels_collected_during_traversal: set[MetricflowGraphLabel] = set( + labels_collected_during_traversal: set[MetricFlowGraphLabel] = set( mf_flatten(target_node.labels for target_node in target_nodes) ) reachable_nodes: MutableOrderedSet[NodeT] = MutableOrderedSet(source_nodes) @@ -332,7 +332,7 @@ class _DfsTraversal(Generic[NodeT, EdgeT, MutablePathT]): def __init__( self, - graph: MetricflowGraph[NodeT, EdgeT], + graph: MetricFlowGraph[NodeT, EdgeT], initial_path: MutablePathT, target_nodes: Set[NodeT], weight_function: WeightFunction[NodeT, EdgeT, MutablePathT], @@ -345,7 +345,7 @@ def __init__( ) -> None: """See `find_paths_dfs` for description of the arguments.""" if initial_path.is_empty: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat( "The initial path must have at least one node. Otherwise, there's no way to extend it.", traversal_description=traversal_description, @@ -420,6 +420,6 @@ def _traverse_dfs(self, current_node: NodeT) -> Iterator[MutablePathT]: current_path.pop_end() -class _MetricflowPathfinderLocalState(threading.local): +class _MetricFlowPathfinderLocalState(threading.local): def __init__(self) -> None: # noqa: D107 self.traversal_profile = MutableGraphTraversalProfile() diff --git a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/path_finding/pathfinder_result.py b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/path_finding/pathfinder_result.py index 697a1ae240..bcbc63bf79 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/path_finding/pathfinder_result.py +++ b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/path_finding/pathfinder_result.py @@ -5,7 +5,7 @@ from dataclasses import dataclass from typing import Generic, Mapping -from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricflowGraphLabel +from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricFlowGraphLabel from metricflow_semantics.experimental.mf_graph.mutable_graph import NodeT from metricflow_semantics.experimental.mf_graph.path_finding.traversal_profile import GraphTraversalProfile from metricflow_semantics.experimental.ordered_set import OrderedSet @@ -29,7 +29,7 @@ class FindDescendantsResult(Generic[NodeT]): # The (sub)set of target nodes that were reachable from the source nodes. reachable_target_nodes: OrderedSet[NodeT] # The labels on edges / nodes that are on the path from any of the source nodes to any of the target nodes. - labels_collected_during_traversal: OrderedSet[MetricflowGraphLabel] + labels_collected_during_traversal: OrderedSet[MetricFlowGraphLabel] # The number of iterations that were done to reach the target nodes or hit the iteration limit. finish_iteration_index: int # Maps the target node to the set of source nodes that could be reached. @@ -47,6 +47,6 @@ class FindAncestorsResult(Generic[NodeT]): # Maps the source node to the target nodes that could be reached. source_node_to_reachable_target_nodes: Mapping[NodeT, OrderedSet[NodeT]] # The labels on edges / nodes that are on the path from any of the source nodes to any of the target nodes. - labels_collected_during_traversal: OrderedSet[MetricflowGraphLabel] + labels_collected_during_traversal: OrderedSet[MetricFlowGraphLabel] # The number of iterations that were done to reach the target nodes or hit the iteration limit. finish_iteration_index: int diff --git a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/path_finding/traversal_profile_differ.py b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/path_finding/traversal_profile_differ.py index 27e1a4ccbe..f1aa15f68c 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/mf_graph/path_finding/traversal_profile_differ.py +++ b/metricflow-semantics/metricflow_semantics/experimental/mf_graph/path_finding/traversal_profile_differ.py @@ -5,7 +5,7 @@ from typing import ContextManager, Optional, Type from metricflow_semantics.collection_helpers.mf_type_aliases import ExceptionTracebackAnyType -from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricflowPathfinder +from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricFlowPathfinder from metricflow_semantics.experimental.mf_graph.path_finding.traversal_profile import ( GraphTraversalProfile, MutableGraphTraversalProfile, @@ -20,7 +20,7 @@ class TraversalProfileDiffer(ContextManager["TraversalProfileDiffer"]): This and associated classes are a WIP and may be removed. """ - def __init__(self, path_finder: MetricflowPathfinder) -> None: # noqa: D107 + def __init__(self, path_finder: MetricFlowPathfinder) -> None: # noqa: D107 self._path_finder = path_finder self._local_state = _TraversalProfileDifferLocalState() diff --git a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/attribute_resolution/attribute_recipe.py b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/attribute_resolution/attribute_recipe.py index d817b85e01..70e106479f 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/attribute_resolution/attribute_recipe.py +++ b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/attribute_resolution/attribute_recipe.py @@ -9,7 +9,7 @@ from metricflow_semantics.collection_helpers.mf_type_aliases import AnyLengthTuple from metricflow_semantics.experimental.dataclass_helpers import fast_frozen_dataclass -from metricflow_semantics.experimental.metricflow_exception import MetricflowInternalError +from metricflow_semantics.experimental.metricflow_exception import MetricFlowInternalError from metricflow_semantics.experimental.ordered_set import FrozenOrderedSet, MutableOrderedSet, OrderedSet from metricflow_semantics.experimental.semantic_graph.attribute_resolution.attribute_recipe_step import ( AttributeRecipeStep, @@ -181,7 +181,7 @@ def resolve_complete_properties(self) -> OrderedSet[GroupByItemProperty]: ) ) else: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat("Reached unhandled case", model_id_count=model_id_count, recipe=self) ) diff --git a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/attribute_resolution/recipe_writer_path.py b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/attribute_resolution/recipe_writer_path.py index ab7b972333..e5e67d2a50 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/attribute_resolution/recipe_writer_path.py +++ b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/attribute_resolution/recipe_writer_path.py @@ -7,7 +7,7 @@ from typing_extensions import override from metricflow_semantics.experimental.mf_graph.path_finding.graph_path import MutableGraphPath -from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricflowPathfinder +from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricFlowPathfinder from metricflow_semantics.experimental.semantic_graph.attribute_resolution.attribute_recipe import ( AttributeRecipe, ) @@ -111,4 +111,4 @@ def copy(self) -> AttributeRecipeWriterPath: ) -RecipeWriterPathfinder = MetricflowPathfinder[SemanticGraphNode, SemanticGraphEdge, AttributeRecipeWriterPath] +RecipeWriterPathfinder = MetricFlowPathfinder[SemanticGraphNode, SemanticGraphEdge, AttributeRecipeWriterPath] diff --git a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/attribute_resolution/sg_linkable_spec_resolver.py b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/attribute_resolution/sg_linkable_spec_resolver.py index 2594d369e0..be1fb04c88 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/attribute_resolution/sg_linkable_spec_resolver.py +++ b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/attribute_resolution/sg_linkable_spec_resolver.py @@ -11,9 +11,9 @@ from metricflow_semantics.experimental.cache.mf_cache import ResultCache from metricflow_semantics.experimental.dataclass_helpers import fast_frozen_dataclass from metricflow_semantics.experimental.dsi.manifest_object_lookup import ManifestObjectLookup -from metricflow_semantics.experimental.metricflow_exception import MetricflowInternalError -from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricflowGraphLabel -from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricflowPathfinder +from metricflow_semantics.experimental.metricflow_exception import MetricFlowInternalError +from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricFlowGraphLabel +from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricFlowPathfinder from metricflow_semantics.experimental.ordered_set import FrozenOrderedSet, MutableOrderedSet from metricflow_semantics.experimental.semantic_graph.attribute_resolution.annotated_spec_linkable_element_set import ( GroupByItemSet, @@ -58,7 +58,7 @@ def __init__( # noqa: D107 self, semantic_graph: SemanticGraph, manifest_object_lookup: ManifestObjectLookup, - path_finder: MetricflowPathfinder[SemanticGraphNode, SemanticGraphEdge, AttributeRecipeWriterPath], + path_finder: MetricFlowPathfinder[SemanticGraphNode, SemanticGraphEdge, AttributeRecipeWriterPath], ) -> None: self._semantic_graph = semantic_graph self._pathfinder = path_finder @@ -139,7 +139,7 @@ def get_common_set( If `joins_disallowed` is set, then only group-by items that can be resolved using the semantic models where the simple metrics are defined will be returned. """ - label_to_references: defaultdict[MetricflowGraphLabel, set[ElementReference]] = defaultdict(set) + label_to_references: defaultdict[MetricFlowGraphLabel, set[ElementReference]] = defaultdict(set) for metric_reference in metric_references: label_to_references[MetricLabel.get_instance(metric_reference.element_name)].add(metric_reference) @@ -154,7 +154,7 @@ def get_common_set( if len(label_to_references) == 0: return GroupByItemSet() - node_labels: FrozenOrderedSet[MetricflowGraphLabel] = FrozenOrderedSet(sorted(label_to_references)) + node_labels: FrozenOrderedSet[MetricFlowGraphLabel] = FrozenOrderedSet(sorted(label_to_references)) cache_key = _CommonSetCacheKey( node_labels=node_labels, set_filter=set_filter, joins_disallowed=joins_disallowed ) @@ -167,7 +167,7 @@ def get_common_set( for label in node_labels: matching_nodes = self._semantic_graph.nodes_with_labels(label) if len(matching_nodes) != 1: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat( "Did not find exactly 1 node in the semantic graph for the given label", label=label, @@ -195,6 +195,6 @@ def get_common_set( @fast_frozen_dataclass() class _CommonSetCacheKey: - node_labels: FrozenOrderedSet[MetricflowGraphLabel] + node_labels: FrozenOrderedSet[MetricFlowGraphLabel] set_filter: Optional[GroupByItemSetFilter] joins_disallowed: bool diff --git a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/builder/metric_subgraph.py b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/builder/metric_subgraph.py index a3ee0d6d17..93b62bc27e 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/builder/metric_subgraph.py +++ b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/builder/metric_subgraph.py @@ -10,7 +10,7 @@ from metricflow_semantics.experimental.dsi.manifest_object_lookup import ManifestObjectLookup from metricflow_semantics.experimental.metricflow_exception import InvalidManifestException -from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricflowGraphLabel +from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricFlowGraphLabel from metricflow_semantics.experimental.ordered_set import FrozenOrderedSet from metricflow_semantics.experimental.semantic_graph.attribute_resolution.attribute_recipe_step import ( AttributeRecipeStep, @@ -63,7 +63,7 @@ def __init__(self, manifest_object_lookup: ManifestObjectLookup) -> None: # Maps the metric name to the corresponding metric node that was generated. self._metric_name_to_node: dict[str, MetricNode] = {} - self._empty_edge_labels: FrozenOrderedSet[MetricflowGraphLabel] = FrozenOrderedSet() + self._empty_edge_labels: FrozenOrderedSet[MetricFlowGraphLabel] = FrozenOrderedSet() self._empty_recipe_step = AttributeRecipeStep() common_cumulative_metric_labels = FrozenOrderedSet( @@ -105,7 +105,7 @@ def _add_edges_for_complex_metric( metric_type = complex_metric.type input_metric_name_to_labels_for_metric_to_input_metric_edge: dict[ - str, FrozenOrderedSet[MetricflowGraphLabel] + str, FrozenOrderedSet[MetricFlowGraphLabel] ] = {} recipe_step = self._empty_recipe_step diff --git a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/edges/edge_labels.py b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/edges/edge_labels.py index 66e3c7db80..41c1f4f733 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/edges/edge_labels.py +++ b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/edges/edge_labels.py @@ -3,14 +3,14 @@ import logging from metricflow_semantics.experimental.dataclass_helpers import fast_frozen_dataclass -from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricflowGraphLabel +from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricFlowGraphLabel from metricflow_semantics.experimental.singleton import Singleton logger = logging.getLogger(__name__) @fast_frozen_dataclass(order=False) -class CumulativeMetricLabel(MetricflowGraphLabel, Singleton): +class CumulativeMetricLabel(MetricFlowGraphLabel, Singleton): """Label for an edge from a cumulative-metric node to a simple-metric node. This label is helpful for addressing special cases with cumulative metrics (e.g. ability to query by date part). @@ -22,7 +22,7 @@ def get_instance(cls) -> CumulativeMetricLabel: # noqa: D102 @fast_frozen_dataclass(order=False) -class DenyDatePartLabel(MetricflowGraphLabel, Singleton): +class DenyDatePartLabel(MetricFlowGraphLabel, Singleton): """Label for edges that, when added to a path, should not allow querying of the date part.""" @classmethod @@ -31,7 +31,7 @@ def get_instance(cls) -> DenyDatePartLabel: # noqa: D102 @fast_frozen_dataclass(order=False) -class DenyEntityKeyQueryResolutionLabel(MetricflowGraphLabel, Singleton): +class DenyEntityKeyQueryResolutionLabel(MetricFlowGraphLabel, Singleton): """Label for edges that, when added to a path, should not allow querying of only the entity-key attributes. e.g. for time-offset metrics, the successor edges have this label as those metrics must be queried with @@ -44,7 +44,7 @@ def get_instance(cls) -> DenyEntityKeyQueryResolutionLabel: # noqa: D102 @fast_frozen_dataclass(order=False) -class ConversionMetricLabel(MetricflowGraphLabel, Singleton): +class ConversionMetricLabel(MetricFlowGraphLabel, Singleton): """Label for successor edges from a conversion metric to the input conversion metric node.""" @classmethod @@ -53,7 +53,7 @@ def get_instance(cls) -> ConversionMetricLabel: # noqa: D102 @fast_frozen_dataclass(order=False) -class DenyVisibleAttributesLabel(MetricflowGraphLabel, Singleton): +class DenyVisibleAttributesLabel(MetricFlowGraphLabel, Singleton): """Label for edges that, when added to a path, should not affect visibility of group-by items. e.g. for conversion metrics, the edge from the conversion-metric node to the conversion-measure node is given this diff --git a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/edges/sg_edges.py b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/edges/sg_edges.py index b677bb8dc2..6e0b367071 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/edges/sg_edges.py +++ b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/edges/sg_edges.py @@ -8,7 +8,7 @@ from metricflow_semantics.experimental.dataclass_helpers import fast_frozen_dataclass from metricflow_semantics.experimental.mf_graph.comparable import ComparisonKey -from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricflowGraphLabel +from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricFlowGraphLabel from metricflow_semantics.experimental.ordered_set import FrozenOrderedSet, OrderedSet from metricflow_semantics.experimental.semantic_graph.attribute_resolution.attribute_recipe_step import ( AttributeRecipeStep, @@ -58,7 +58,7 @@ def recipe_step_to_append(self) -> AttributeRecipeStep: return AttributeRecipeStep(add_model_join=self.right_model_id) -_EMPTY_LABEL_SET: FrozenOrderedSet[MetricflowGraphLabel] = FrozenOrderedSet() +_EMPTY_LABEL_SET: FrozenOrderedSet[MetricFlowGraphLabel] = FrozenOrderedSet() _EMPTY_RECIPE_STEP = AttributeRecipeStep() @@ -66,14 +66,14 @@ def recipe_step_to_append(self) -> AttributeRecipeStep: class MetricDefinitionEdge(SemanticGraphEdge): """An edge that points from a metric to the inputs for the metric.""" - additional_labels: FrozenOrderedSet[MetricflowGraphLabel] + additional_labels: FrozenOrderedSet[MetricFlowGraphLabel] _recipe_step: AttributeRecipeStep @staticmethod def create( # noqa: D102 tail_node: SemanticGraphNode, head_node: SemanticGraphNode, - additional_labels: Optional[FrozenOrderedSet[MetricflowGraphLabel]] = None, + additional_labels: Optional[FrozenOrderedSet[MetricFlowGraphLabel]] = None, recipe_step: Optional[AttributeRecipeStep] = None, ) -> MetricDefinitionEdge: return MetricDefinitionEdge( @@ -119,7 +119,7 @@ def pretty_format(self, format_context: PrettyFormatContext) -> Optional[str]: @cached_property @override - def labels(self) -> OrderedSet[MetricflowGraphLabel]: + def labels(self) -> OrderedSet[MetricFlowGraphLabel]: return FrozenOrderedSet(self.additional_labels) diff --git a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/nodes/attribute_nodes.py b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/nodes/attribute_nodes.py index d0516245a9..f7f6d960ed 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/nodes/attribute_nodes.py +++ b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/nodes/attribute_nodes.py @@ -12,8 +12,8 @@ DotColor, DotNodeAttributeSet, ) -from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricflowGraphLabel -from metricflow_semantics.experimental.mf_graph.node_descriptor import MetricflowGraphNodeDescriptor +from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricFlowGraphLabel +from metricflow_semantics.experimental.mf_graph.node_descriptor import MetricFlowGraphNodeDescriptor from metricflow_semantics.experimental.ordered_set import FrozenOrderedSet, OrderedSet from metricflow_semantics.experimental.semantic_graph.attribute_resolution.attribute_recipe_step import ( AttributeRecipeStep, @@ -46,8 +46,8 @@ def comparison_key(self) -> ComparisonKey: @cached_property @override - def node_descriptor(self) -> MetricflowGraphNodeDescriptor: - return MetricflowGraphNodeDescriptor( + def node_descriptor(self) -> MetricFlowGraphNodeDescriptor: + return MetricFlowGraphNodeDescriptor( node_name=f"{self.__class__.__name__}({self.attribute_name})", cluster_name=None, ) @@ -61,7 +61,7 @@ def as_dot_node(self, include_graphical_attributes: bool) -> DotNodeAttributeSet @cached_property @override - def labels(self) -> OrderedSet[MetricflowGraphLabel]: + def labels(self) -> OrderedSet[MetricFlowGraphLabel]: return FrozenOrderedSet((GroupByAttributeLabel.get_instance(),)) @cached_property @@ -107,15 +107,15 @@ def get_instance_for_expanded_time_grain( # noqa: D102 @cached_property @override - def node_descriptor(self) -> MetricflowGraphNodeDescriptor: - return MetricflowGraphNodeDescriptor( + def node_descriptor(self) -> MetricFlowGraphNodeDescriptor: + return MetricFlowGraphNodeDescriptor( node_name=f"TimeAttribute({self.attribute_name})", cluster_name=ClusterNameFactory.TIME, ) @cached_property @override - def labels(self) -> OrderedSet[MetricflowGraphLabel]: + def labels(self) -> OrderedSet[MetricFlowGraphLabel]: return super(TimeAttributeNode, self).labels.union((TimeClusterLabel.get_instance(),)) @cached_property @@ -150,8 +150,8 @@ def get_instance(cls, entity_name: str) -> KeyAttributeNode: # noqa: D102 @property @override - def node_descriptor(self) -> MetricflowGraphNodeDescriptor: - return MetricflowGraphNodeDescriptor( + def node_descriptor(self) -> MetricFlowGraphNodeDescriptor: + return MetricFlowGraphNodeDescriptor( node_name=f"KeyAttribute({self.attribute_name})", cluster_name=ClusterNameFactory.KEY, ) @@ -167,7 +167,7 @@ def recipe_step_to_append(self) -> AttributeRecipeStep: @cached_property @override - def labels(self) -> OrderedSet[MetricflowGraphLabel]: + def labels(self) -> OrderedSet[MetricFlowGraphLabel]: return super(KeyAttributeNode, self).labels.union((KeyAttributeLabel.get_instance(),)) @override @@ -185,8 +185,8 @@ def get_instance(cls, dimension_name: str) -> CategoricalDimensionAttributeNode: @property @override - def node_descriptor(self) -> MetricflowGraphNodeDescriptor: - return MetricflowGraphNodeDescriptor( + def node_descriptor(self) -> MetricFlowGraphNodeDescriptor: + return MetricFlowGraphNodeDescriptor( node_name=f"Dimension({self.attribute_name})", cluster_name=ClusterNameFactory.DIMENSION ) diff --git a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/nodes/entity_nodes.py b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/nodes/entity_nodes.py index c2693f5ff0..4399dda431 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/nodes/entity_nodes.py +++ b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/nodes/entity_nodes.py @@ -13,8 +13,8 @@ DotColor, DotNodeAttributeSet, ) -from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricflowGraphLabel -from metricflow_semantics.experimental.mf_graph.node_descriptor import MetricflowGraphNodeDescriptor +from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricFlowGraphLabel +from metricflow_semantics.experimental.mf_graph.node_descriptor import MetricFlowGraphNodeDescriptor from metricflow_semantics.experimental.ordered_set import FrozenOrderedSet, OrderedSet from metricflow_semantics.experimental.semantic_graph.attribute_resolution.attribute_recipe_step import ( AttributeRecipeStep, @@ -70,15 +70,15 @@ def as_dot_node(self, include_graphical_attributes: bool) -> DotNodeAttributeSet @cached_property @override - def node_descriptor(self) -> MetricflowGraphNodeDescriptor: - return MetricflowGraphNodeDescriptor( + def node_descriptor(self) -> MetricFlowGraphNodeDescriptor: + return MetricFlowGraphNodeDescriptor( node_name=f"{self.model_id}.{self.entity_name}", cluster_name=ClusterNameFactory.CONFIGURED_ENTITY, ) @cached_property @override - def labels(self) -> OrderedSet[MetricflowGraphLabel]: + def labels(self) -> OrderedSet[MetricFlowGraphLabel]: return FrozenOrderedSet((ConfiguredEntityLabel.get_instance(),)) @cached_property @@ -117,8 +117,8 @@ def get_instance(cls, model_id: SemanticModelId) -> JoinedModelNode: # noqa: D1 @cached_property @override - def node_descriptor(self) -> MetricflowGraphNodeDescriptor: - return MetricflowGraphNodeDescriptor( + def node_descriptor(self) -> MetricFlowGraphNodeDescriptor: + return MetricFlowGraphNodeDescriptor( node_name=f"JoinedModel({self.model_id})", cluster_name=ClusterNameFactory.get_name_for_model(self.model_id), ) @@ -130,7 +130,7 @@ def comparison_key(self) -> ComparisonKey: @cached_property @override - def labels(self) -> OrderedSet[MetricflowGraphLabel]: + def labels(self) -> OrderedSet[MetricFlowGraphLabel]: return FrozenOrderedSet((JoinedModelLabel.get_instance(),)) @override @@ -161,8 +161,8 @@ def get_instance(cls, model_id: SemanticModelId) -> LocalModelNode: # noqa: D10 @cached_property @override - def node_descriptor(self) -> MetricflowGraphNodeDescriptor: - return MetricflowGraphNodeDescriptor( + def node_descriptor(self) -> MetricFlowGraphNodeDescriptor: + return MetricFlowGraphNodeDescriptor( node_name=f"LocalModel({self.model_id})", cluster_name=ClusterNameFactory.get_name_for_model(self.model_id), ) @@ -174,7 +174,7 @@ def comparison_key(self) -> ComparisonKey: @cached_property @override - def labels(self) -> OrderedSet[MetricflowGraphLabel]: + def labels(self) -> OrderedSet[MetricFlowGraphLabel]: return FrozenOrderedSet((LocalModelLabel.get_instance(),)) @cached_property @@ -210,8 +210,8 @@ def get_instance(cls, dimension_name: str) -> TimeDimensionNode: # noqa: D102 @cached_property @override - def node_descriptor(self) -> MetricflowGraphNodeDescriptor: - return MetricflowGraphNodeDescriptor( + def node_descriptor(self) -> MetricFlowGraphNodeDescriptor: + return MetricFlowGraphNodeDescriptor( node_name=f"TimeDimension({self.dimension_name})", cluster_name=ClusterNameFactory.TIME_DIMENSION, ) @@ -238,7 +238,7 @@ def as_dot_node(self, include_graphical_attributes: bool) -> DotNodeAttributeSet @cached_property @override - def labels(self) -> OrderedSet[MetricflowGraphLabel]: + def labels(self) -> OrderedSet[MetricFlowGraphLabel]: return FrozenOrderedSet((TimeDimensionLabel.get_instance(),)) @override @@ -256,8 +256,8 @@ def get_instance(cls) -> MetricTimeNode: # noqa: D102 @cached_property @override - def node_descriptor(self) -> MetricflowGraphNodeDescriptor: - return MetricflowGraphNodeDescriptor( + def node_descriptor(self) -> MetricFlowGraphNodeDescriptor: + return MetricFlowGraphNodeDescriptor( node_name="MetricTime", cluster_name=ClusterNameFactory.TIME_DIMENSION, ) @@ -269,7 +269,7 @@ def comparison_key(self) -> ComparisonKey: @cached_property @override - def labels(self) -> OrderedSet[MetricflowGraphLabel]: + def labels(self) -> OrderedSet[MetricFlowGraphLabel]: return FrozenOrderedSet((MetricTimeLabel.get_instance(), TimeDimensionLabel.get_instance())) @cached_property @@ -306,8 +306,8 @@ def get_instance(cls) -> TimeNode: # noqa: D102 @cached_property @override - def node_descriptor(self) -> MetricflowGraphNodeDescriptor: - return MetricflowGraphNodeDescriptor( + def node_descriptor(self) -> MetricFlowGraphNodeDescriptor: + return MetricFlowGraphNodeDescriptor( node_name="TimeEntity", cluster_name=ClusterNameFactory.TIME, ) @@ -319,7 +319,7 @@ def comparison_key(self) -> ComparisonKey: @cached_property @override - def labels(self) -> OrderedSet[MetricflowGraphLabel]: + def labels(self) -> OrderedSet[MetricFlowGraphLabel]: return FrozenOrderedSet((TimeClusterLabel.get_instance(),)) @override @@ -340,7 +340,7 @@ def comparison_key(self) -> ComparisonKey: @cached_property @override - def labels(self) -> OrderedSet[MetricflowGraphLabel]: + def labels(self) -> OrderedSet[MetricFlowGraphLabel]: return FrozenOrderedSet((MetricLabel.get_instance(), MetricLabel.get_instance(self.metric_name))) @@ -354,14 +354,14 @@ def get_instance(cls, metric_name: str) -> SimpleMetricNode: # noqa: D102 @cached_property @override - def node_descriptor(self) -> MetricflowGraphNodeDescriptor: - return MetricflowGraphNodeDescriptor( + def node_descriptor(self) -> MetricFlowGraphNodeDescriptor: + return MetricFlowGraphNodeDescriptor( node_name=f"SimpleMetric({self.metric_name})", cluster_name=ClusterNameFactory.METRIC ) @cached_property @override - def labels(self) -> OrderedSet[MetricflowGraphLabel]: + def labels(self) -> OrderedSet[MetricFlowGraphLabel]: return super(SimpleMetricNode, self).labels.union((SimpleMetricLabel.get_instance(),)) @override @@ -383,14 +383,14 @@ def get_instance(cls, metric_name: str) -> ComplexMetricNode: # noqa: D102 @cached_property @override - def node_descriptor(self) -> MetricflowGraphNodeDescriptor: - return MetricflowGraphNodeDescriptor( + def node_descriptor(self) -> MetricFlowGraphNodeDescriptor: + return MetricFlowGraphNodeDescriptor( node_name=f"ComplexMetric({self.metric_name})", cluster_name=ClusterNameFactory.METRIC ) @cached_property @override - def labels(self) -> OrderedSet[MetricflowGraphLabel]: + def labels(self) -> OrderedSet[MetricFlowGraphLabel]: return super(ComplexMetricNode, self).labels.union((ComplexMetricLabel.get_instance(),)) @override diff --git a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/nodes/node_labels.py b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/nodes/node_labels.py index 1b8caafce3..858b378ca3 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/nodes/node_labels.py +++ b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/nodes/node_labels.py @@ -4,14 +4,14 @@ from typing import Optional from metricflow_semantics.experimental.dataclass_helpers import fast_frozen_dataclass -from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricflowGraphLabel +from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricFlowGraphLabel from metricflow_semantics.experimental.singleton import Singleton logger = logging.getLogger(__name__) @fast_frozen_dataclass(order=False) -class GroupByAttributeLabel(MetricflowGraphLabel, Singleton): +class GroupByAttributeLabel(MetricFlowGraphLabel, Singleton): """Label for any attribute node that can be used in the group-by argument of an MF query.""" @classmethod @@ -20,7 +20,7 @@ def get_instance(cls) -> GroupByAttributeLabel: # noqa: D102 @fast_frozen_dataclass(order=False) -class ConfiguredEntityLabel(MetricflowGraphLabel, Singleton): +class ConfiguredEntityLabel(MetricFlowGraphLabel, Singleton): """Label for nodes that correspond to entities configured in a semantic model.""" @classmethod @@ -29,7 +29,7 @@ def get_instance(cls) -> ConfiguredEntityLabel: # noqa: D102 @fast_frozen_dataclass(order=False) -class TimeDimensionLabel(MetricflowGraphLabel, Singleton): +class TimeDimensionLabel(MetricFlowGraphLabel, Singleton): """Label for time dimension nodes.""" @classmethod @@ -38,7 +38,7 @@ def get_instance(cls) -> TimeDimensionLabel: # noqa: D102 @fast_frozen_dataclass(order=False) -class TimeClusterLabel(MetricflowGraphLabel, Singleton): +class TimeClusterLabel(MetricFlowGraphLabel, Singleton): """Label for nodes that should be clustered together in the `time` section when visualizing the graph.""" @classmethod @@ -47,7 +47,7 @@ def get_instance(cls) -> TimeClusterLabel: # noqa: D102 @fast_frozen_dataclass(order=False) -class MetricTimeLabel(MetricflowGraphLabel, Singleton): +class MetricTimeLabel(MetricFlowGraphLabel, Singleton): """Label for the node that represents metric-time.""" @classmethod @@ -56,7 +56,7 @@ def get_instance(cls) -> MetricTimeLabel: # noqa: D102 @fast_frozen_dataclass(order=False) -class MetricLabel(MetricflowGraphLabel, Singleton): +class MetricLabel(MetricFlowGraphLabel, Singleton): """Label for the node that corresponds to a configured metric in the semantic manifest. `metric_name = None` is a label applied to all metric nodes. @@ -70,7 +70,7 @@ def get_instance(cls, metric_name: Optional[str] = None) -> MetricLabel: # noqa @fast_frozen_dataclass(order=False) -class SimpleMetricLabel(MetricflowGraphLabel, Singleton): +class SimpleMetricLabel(MetricFlowGraphLabel, Singleton): """Label for nodes that represent a simple metric.""" @classmethod @@ -79,7 +79,7 @@ def get_instance(cls) -> SimpleMetricLabel: # noqa: D102 @fast_frozen_dataclass(order=False) -class ComplexMetricLabel(MetricflowGraphLabel, Singleton): +class ComplexMetricLabel(MetricFlowGraphLabel, Singleton): """Label for nodes that represent a complex metric.""" @classmethod @@ -88,7 +88,7 @@ def get_instance(cls) -> ComplexMetricLabel: # noqa: D102 @fast_frozen_dataclass(order=False) -class JoinedModelLabel(MetricflowGraphLabel, Singleton): +class JoinedModelLabel(MetricFlowGraphLabel, Singleton): """Label for nodes that represent a joined semantic model. See `JoinedModelNode`. @@ -100,7 +100,7 @@ def get_instance(cls) -> JoinedModelLabel: # noqa: D102 @fast_frozen_dataclass(order=False) -class LocalModelLabel(MetricflowGraphLabel, Singleton): +class LocalModelLabel(MetricFlowGraphLabel, Singleton): """Label for nodes that represent a local semantic model. See `LocalModelNode`. @@ -112,7 +112,7 @@ def get_instance(cls) -> LocalModelLabel: # noqa: D102 @fast_frozen_dataclass(order=False) -class KeyAttributeLabel(MetricflowGraphLabel, Singleton): +class KeyAttributeLabel(MetricFlowGraphLabel, Singleton): """Label for nodes that correspond to the entity-key attribute nodes.""" @classmethod diff --git a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/sg_exceptions.py b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/sg_exceptions.py index 4ca21800c0..b9123e0e93 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/sg_exceptions.py +++ b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/sg_exceptions.py @@ -2,12 +2,12 @@ import logging -from metricflow_semantics.experimental.metricflow_exception import MetricflowInternalError +from metricflow_semantics.experimental.metricflow_exception import MetricFlowInternalError logger = logging.getLogger(__name__) -class SemanticGraphTraversalError(MetricflowInternalError): +class SemanticGraphTraversalError(MetricFlowInternalError): """Raised when an unexpected condition is encountered during semantic-graph traversal.""" pass diff --git a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/sg_interfaces.py b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/sg_interfaces.py index c46966a6b0..e89ac04fa9 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/sg_interfaces.py +++ b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/sg_interfaces.py @@ -11,11 +11,11 @@ from metricflow_semantics.dag.mf_dag import DisplayedProperty from metricflow_semantics.experimental.dataclass_helpers import fast_frozen_dataclass from metricflow_semantics.experimental.mf_graph.formatting.dot_attributes import DotGraphAttributeSet -from metricflow_semantics.experimental.mf_graph.graph_id import MetricflowGraphId, SequentialGraphId +from metricflow_semantics.experimental.mf_graph.graph_id import MetricFlowGraphId, SequentialGraphId from metricflow_semantics.experimental.mf_graph.mf_graph import ( - MetricflowGraph, - MetricflowGraphEdge, - MetricflowGraphNode, + MetricFlowGraph, + MetricFlowGraphEdge, + MetricFlowGraphNode, ) from metricflow_semantics.experimental.mf_graph.mutable_graph import MutableGraph from metricflow_semantics.experimental.ordered_set import MutableOrderedSet @@ -29,7 +29,7 @@ logger = logging.getLogger(__name__) -class SemanticGraphNode(MetricflowGraphNode, AttributeRecipeStepProvider, MetricFlowPrettyFormattable, ABC): +class SemanticGraphNode(MetricFlowGraphNode, AttributeRecipeStepProvider, MetricFlowPrettyFormattable, ABC): """A node in the semantic graph. At the top level, the semantic graph has two types of nodes: entity nodes and attribute nodes. Entity nodes have @@ -73,7 +73,7 @@ def add_to_typed_collection(self, typed_collection: SemanticGraphNodeTypedCollec @fast_frozen_dataclass(order=False) -class SemanticGraphEdge(MetricflowGraphEdge[SemanticGraphNode], AttributeRecipeStepProvider, ABC): +class SemanticGraphEdge(MetricFlowGraphEdge[SemanticGraphNode], AttributeRecipeStepProvider, ABC): """An edge in the semantic graph. Currently, the edges in the semantic graph represent entity relationships and also describe how a related attribute @@ -106,8 +106,8 @@ def displayed_properties(self) -> AnyLengthTuple[DisplayedProperty]: return tuple(properties) -class SemanticGraph(MetricflowGraph[SemanticGraphNode, SemanticGraphEdge], ABC): - """A read-only interface for a semantic graph based on `MetricflowGraph`. +class SemanticGraph(MetricFlowGraph[SemanticGraphNode, SemanticGraphEdge], ABC): + """A read-only interface for a semantic graph based on `MetricFlowGraph`. Also see `SemanticGraphNode` and `SemanticGraphEdge`. @@ -141,7 +141,7 @@ class MutableSemanticGraph(MutableGraph[SemanticGraphNode, SemanticGraphEdge], S """A mutable implementation of `SemanticGraph` for building graphs.""" @classmethod - def create(cls, graph_id: Optional[MetricflowGraphId] = None) -> MutableSemanticGraph: # noqa: D102 + def create(cls, graph_id: Optional[MetricFlowGraphId] = None) -> MutableSemanticGraph: # noqa: D102 return MutableSemanticGraph( _graph_id=graph_id or SequentialGraphId.create(), _nodes=MutableOrderedSet(), @@ -155,7 +155,7 @@ def create(cls, graph_id: Optional[MetricflowGraphId] = None) -> MutableSemantic ) @override - def intersection(self, other: MetricflowGraph[SemanticGraphNode, SemanticGraphEdge]) -> MutableSemanticGraph: + def intersection(self, other: MetricFlowGraph[SemanticGraphNode, SemanticGraphEdge]) -> MutableSemanticGraph: intersection_graph = MutableSemanticGraph.create(graph_id=self.graph_id) self.add_edges(self._intersect_edges(other)) return intersection_graph diff --git a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/trie_resolver/dunder_name_trie.py b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/trie_resolver/dunder_name_trie.py index 2e9e9c5672..1d4594c509 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/trie_resolver/dunder_name_trie.py +++ b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/trie_resolver/dunder_name_trie.py @@ -14,7 +14,7 @@ from metricflow_semantics.collection_helpers.dictionaries import mf_common_keys from metricflow_semantics.collection_helpers.mf_type_aliases import AnyLengthTuple -from metricflow_semantics.experimental.metricflow_exception import MetricflowInternalError +from metricflow_semantics.experimental.metricflow_exception import MetricFlowInternalError from metricflow_semantics.experimental.semantic_graph.attribute_resolution.attribute_recipe import IndexedDunderName from metricflow_semantics.experimental.semantic_graph.model_id import SemanticModelId from metricflow_semantics.experimental.semantic_graph.trie_resolver.dunder_name_descriptor import DunderNameDescriptor @@ -281,7 +281,7 @@ def add_name_items(self, items: Iterable[tuple[IndexedDunderName, DunderNameDesc for indexed_dunder_name, descriptor in items: name_element_count = len(indexed_dunder_name) if name_element_count == 0: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat( "There must at least be one name element.", name_element_list=indexed_dunder_name, diff --git a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/trie_resolver/dunder_name_trie_resolver.py b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/trie_resolver/dunder_name_trie_resolver.py index 5a4ed3dd67..7b86386c08 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/trie_resolver/dunder_name_trie_resolver.py +++ b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/trie_resolver/dunder_name_trie_resolver.py @@ -8,7 +8,7 @@ from metricflow_semantics.collection_helpers.mf_type_aliases import AnyLengthTuple from metricflow_semantics.experimental.dataclass_helpers import fast_frozen_dataclass from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import ( - MetricflowPathfinder, + MetricFlowPathfinder, ) from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder_result import GraphTraversalResult from metricflow_semantics.experimental.ordered_set import OrderedSet @@ -50,7 +50,7 @@ class DunderNameTrieResolver(ABC): def __init__( # noqa: D107 self, semantic_graph: SemanticGraph, - path_finder: MetricflowPathfinder[SemanticGraphNode, SemanticGraphEdge, AttributeRecipeWriterPath], + path_finder: MetricFlowPathfinder[SemanticGraphNode, SemanticGraphEdge, AttributeRecipeWriterPath], ) -> None: self._semantic_graph = semantic_graph self._path_finder = path_finder diff --git a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/trie_resolver/group_by_metric_resolver.py b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/trie_resolver/group_by_metric_resolver.py index 621fd3a280..b5c36c26bb 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/trie_resolver/group_by_metric_resolver.py +++ b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/trie_resolver/group_by_metric_resolver.py @@ -9,8 +9,8 @@ from typing_extensions import override -from metricflow_semantics.experimental.metricflow_exception import MetricflowInternalError -from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricflowPathfinder +from metricflow_semantics.experimental.metricflow_exception import MetricFlowInternalError +from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricFlowPathfinder from metricflow_semantics.experimental.mf_graph.path_finding.traversal_profile_differ import TraversalProfileDiffer from metricflow_semantics.experimental.ordered_set import FrozenOrderedSet, MutableOrderedSet, OrderedSet from metricflow_semantics.experimental.semantic_graph.attribute_resolution.attribute_recipe import IndexedDunderName @@ -67,7 +67,7 @@ class GroupByMetricTrieResolver(DunderNameTrieResolver): def __init__( # noqa: D107 self, semantic_graph: SemanticGraph, - path_finder: MetricflowPathfinder[SemanticGraphNode, SemanticGraphEdge, AttributeRecipeWriterPath], + path_finder: MetricFlowPathfinder[SemanticGraphNode, SemanticGraphEdge, AttributeRecipeWriterPath], ) -> None: super().__init__(semantic_graph=semantic_graph, path_finder=path_finder) self._local_model_nodes = semantic_graph.nodes_with_labels(self._local_model_label) @@ -162,7 +162,7 @@ def _resolve_trie( ) if len(reachable_local_model_nodes) == 0: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat( "No local-model nodes were found to be reachable from the given source nodes.", source_nodes=source_nodes, @@ -184,7 +184,7 @@ def _resolve_trie( for indexed_dunder_name, descriptor in entity_key_trie.name_items(max_length=1): if len(indexed_dunder_name) != 1: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat( "The indexed dunder name should have only contained 1 element.", indexed_dunder_name=indexed_dunder_name, @@ -257,7 +257,7 @@ class _MetricNameToEntityKeyTrieGenerator: def __init__( self, semantic_graph: SemanticGraph, - path_finder: MetricflowPathfinder[SemanticGraphNode, SemanticGraphEdge, AttributeRecipeWriterPath], + path_finder: MetricFlowPathfinder[SemanticGraphNode, SemanticGraphEdge, AttributeRecipeWriterPath], model_node_to_entity_key_trie: Mapping[SemanticGraphNode, DunderNameTrie], ) -> None: self._current_graph = semantic_graph diff --git a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/trie_resolver/simple_resolver.py b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/trie_resolver/simple_resolver.py index 127cfcf03c..ba8c3c6b20 100644 --- a/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/trie_resolver/simple_resolver.py +++ b/metricflow-semantics/metricflow_semantics/experimental/semantic_graph/trie_resolver/simple_resolver.py @@ -7,9 +7,9 @@ from typing_extensions import override from metricflow_semantics.experimental.cache.mf_cache import ResultCache -from metricflow_semantics.experimental.metricflow_exception import MetricflowInternalError -from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricflowGraphLabel -from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricflowPathfinder +from metricflow_semantics.experimental.metricflow_exception import MetricFlowInternalError +from metricflow_semantics.experimental.mf_graph.graph_labeling import MetricFlowGraphLabel +from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricFlowPathfinder from metricflow_semantics.experimental.mf_graph.path_finding.traversal_profile_differ import TraversalProfileDiffer from metricflow_semantics.experimental.ordered_set import OrderedSet from metricflow_semantics.experimental.semantic_graph.attribute_resolution.attribute_recipe import AttributeRecipe @@ -52,7 +52,7 @@ class SimpleTrieResolver(DunderNameTrieResolver): def __init__( self, semantic_graph: SemanticGraph, - path_finder: MetricflowPathfinder[SemanticGraphNode, SemanticGraphEdge, AttributeRecipeWriterPath], + path_finder: MetricFlowPathfinder[SemanticGraphNode, SemanticGraphEdge, AttributeRecipeWriterPath], max_path_model_count: Optional[int] = None, ) -> None: """Initializer. @@ -133,7 +133,7 @@ def _resolve_trie_for_source_nodes( ) if len(result_intersection_source_nodes) == 0: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat("No applicable descendant nodes were found for intersection.", source_nodes=source_nodes) ) @@ -180,7 +180,7 @@ def _resolve_trie_from_node( metric_time_edge = edge if local_model_edge is None or metric_time_edge is None or len(successors) != 2: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat( "A measure node should have exactly 2 successors: a local-model node and a metric-time node" "\nbut it does not.", @@ -216,7 +216,7 @@ def _resolve_trie_from_node( return MutableDunderNameTrie.union_exclude_common((result_from_local_model_node, result_from_metric_time)) else: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat( "The given node is not a supported source node for resolving attribute names", source_node=source_node, @@ -262,7 +262,7 @@ def _resolve_trie_from_initial_path( if self._verbose_debug_logs: logger.debug(LazyFormat("Found path to target node", path_nodes=found_path.nodes, recipe=recipe)) if recipe is None: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat( "A path from a source node to a target node does not have a recipe. This indicates an error in " "traversal." @@ -296,7 +296,7 @@ def _resolve_trie_from_initial_path( return self._result_cache.set_and_get(cache_key, result_trie) def _should_exclude_date_part( - self, source_nodes: Set[SemanticGraphNode], collected_labels: OrderedSet[MetricflowGraphLabel] + self, source_nodes: Set[SemanticGraphNode], collected_labels: OrderedSet[MetricFlowGraphLabel] ) -> bool: """To handle a bug, check if we should exclude date part from the query. diff --git a/metricflow-semantics/metricflow_semantics/model/semantic_manifest_lookup.py b/metricflow-semantics/metricflow_semantics/model/semantic_manifest_lookup.py index 2021a290f5..a86831646c 100644 --- a/metricflow-semantics/metricflow_semantics/model/semantic_manifest_lookup.py +++ b/metricflow-semantics/metricflow_semantics/model/semantic_manifest_lookup.py @@ -6,7 +6,7 @@ from dbt_semantic_interfaces.protocols.semantic_manifest import SemanticManifest from metricflow_semantics.experimental.dsi.manifest_object_lookup import ManifestObjectLookup -from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricflowPathfinder +from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricFlowPathfinder from metricflow_semantics.experimental.semantic_graph.attribute_resolution.recipe_writer_path import ( AttributeRecipeWriterPath, ) @@ -38,7 +38,7 @@ def __init__(self, semantic_manifest: SemanticManifest) -> None: semantic_manifest=semantic_manifest, custom_granularities=self.custom_granularities ) - pathfinder = MetricflowPathfinder[SemanticGraphNode, SemanticGraphEdge, AttributeRecipeWriterPath]() + pathfinder = MetricFlowPathfinder[SemanticGraphNode, SemanticGraphEdge, AttributeRecipeWriterPath]() self._manifest_object_lookup = ManifestObjectLookup(semantic_manifest) graph_builder = SemanticGraphBuilder(manifest_object_lookup=self._manifest_object_lookup) semantic_graph = graph_builder.build() diff --git a/metricflow-semantics/metricflow_semantics/model/semantics/metric_lookup.py b/metricflow-semantics/metricflow_semantics/model/semantics/metric_lookup.py index bd99af9fed..5e6be7df28 100644 --- a/metricflow-semantics/metricflow_semantics/model/semantics/metric_lookup.py +++ b/metricflow-semantics/metricflow_semantics/model/semantics/metric_lookup.py @@ -19,7 +19,7 @@ ) from metricflow_semantics.experimental.cache.mf_cache import ResultCache from metricflow_semantics.experimental.dsi.manifest_object_lookup import ManifestObjectLookup -from metricflow_semantics.experimental.metricflow_exception import InvalidManifestException, MetricflowInternalError +from metricflow_semantics.experimental.metricflow_exception import InvalidManifestException, MetricFlowInternalError from metricflow_semantics.experimental.ordered_set import FrozenOrderedSet, MutableOrderedSet, OrderedSet from metricflow_semantics.experimental.semantic_graph.attribute_resolution.annotated_spec_linkable_element_set import ( GroupByItemSet, @@ -105,7 +105,7 @@ def get_derived_from_semantic_models(self, metric_reference: MetricReference) -> if len(metric_inputs) == 0: metric_aggregation_params = metric.type_params.metric_aggregation_params if metric_aggregation_params is None: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat("Expected `metric_aggregation_params` to be set", metric=metric) ) model_references.add(SemanticModelReference(metric_aggregation_params.semantic_model)) @@ -177,7 +177,7 @@ def metric_inputs(metric: Metric, include_conversion_metric_input: bool) -> Sequ elif metric_type is MetricType.CUMULATIVE: cumulative_type_params = metric.type_params.cumulative_type_params if cumulative_type_params is None: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat( "Expected `cumulative_type_params` to be set for a cumulative metric", complex_metric=metric, @@ -186,7 +186,7 @@ def metric_inputs(metric: Metric, include_conversion_metric_input: bool) -> Sequ input_metric_for_cumulative_metric = cumulative_type_params.metric if input_metric_for_cumulative_metric is None: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat( "Expected `metric` to be set for a cumulative metric", complex_metric=metric, @@ -197,7 +197,7 @@ def metric_inputs(metric: Metric, include_conversion_metric_input: bool) -> Sequ elif metric_type is MetricType.RATIO: numerator = metric.type_params.numerator if numerator is None: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat( "Expected `numerator` to be set for a ratio metric", complex_metric=metric, @@ -207,7 +207,7 @@ def metric_inputs(metric: Metric, include_conversion_metric_input: bool) -> Sequ denominator = metric.type_params.denominator if denominator is None: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat( "Expected `denominator` to be set for a ratio metric", complex_metric=metric, @@ -217,7 +217,7 @@ def metric_inputs(metric: Metric, include_conversion_metric_input: bool) -> Sequ elif metric_type is MetricType.CONVERSION: conversion_type_params = metric.type_params.conversion_type_params if conversion_type_params is None: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat( "Expected `conversion_type_params` to be set for a conversion metric", complex_metric=metric, @@ -225,7 +225,7 @@ def metric_inputs(metric: Metric, include_conversion_metric_input: bool) -> Sequ ) base_metric = conversion_type_params.base_metric if base_metric is None: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat("Expected `base_metric` to be set for a conversion metric", complex_metric=metric) ) metric_inputs.append(base_metric) @@ -233,7 +233,7 @@ def metric_inputs(metric: Metric, include_conversion_metric_input: bool) -> Sequ if include_conversion_metric_input: conversion_metric = conversion_type_params.conversion_metric if conversion_metric is None: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat( "Expected `conversion_metric` to be set for a conversion metric", complex_metric=metric ) @@ -243,7 +243,7 @@ def metric_inputs(metric: Metric, include_conversion_metric_input: bool) -> Sequ elif metric_type is MetricType.DERIVED: metrics = metric.type_params.metrics if not metrics: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat("Expected `metrics` to be set for a derived metric", derived_metric=metric) ) metric_inputs.extend(metrics) diff --git a/metricflow-semantics/tests_metricflow_semantics/experimental/graph_helpers.py b/metricflow-semantics/tests_metricflow_semantics/experimental/graph_helpers.py index 35e8ef2346..491738b111 100644 --- a/metricflow-semantics/tests_metricflow_semantics/experimental/graph_helpers.py +++ b/metricflow-semantics/tests_metricflow_semantics/experimental/graph_helpers.py @@ -4,7 +4,7 @@ from typing import Callable, Optional from _pytest.fixtures import FixtureRequest -from metricflow_semantics.experimental.mf_graph.mf_graph import MetricflowGraph +from metricflow_semantics.experimental.mf_graph.mf_graph import MetricFlowGraph from metricflow_semantics.mf_logging.pretty_print import mf_pformat_dict from metricflow_semantics.test_helpers.snapshot_helpers import ( SnapshotConfiguration, @@ -19,7 +19,7 @@ def assert_graph_snapshot_equal( request: FixtureRequest, snapshot_configuration: SnapshotConfiguration, - graph: MetricflowGraph, + graph: MetricFlowGraph, snapshot_id: str = "result", expectation_description: Optional[str] = None, incomparable_strings_replacement_function: Optional[Callable[[str], str]] = None, diff --git a/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/flow_graph.py b/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/flow_graph.py index 48b32d046c..ba1227fe2c 100644 --- a/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/flow_graph.py +++ b/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/flow_graph.py @@ -14,14 +14,14 @@ from metricflow_semantics.experimental.mf_graph.comparable import ComparisonKey from metricflow_semantics.experimental.mf_graph.graph_id import SequentialGraphId from metricflow_semantics.experimental.mf_graph.mf_graph import ( - MetricflowGraph, - MetricflowGraphEdge, - MetricflowGraphNode, + MetricFlowGraph, + MetricFlowGraphEdge, + MetricFlowGraphNode, ) from metricflow_semantics.experimental.mf_graph.mutable_graph import MutableGraph -from metricflow_semantics.experimental.mf_graph.node_descriptor import MetricflowGraphNodeDescriptor +from metricflow_semantics.experimental.mf_graph.node_descriptor import MetricFlowGraphNodeDescriptor from metricflow_semantics.experimental.mf_graph.path_finding.graph_path import MutableGraphPath -from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricflowPathfinder +from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricFlowPathfinder from metricflow_semantics.experimental.ordered_set import MutableOrderedSet from metricflow_semantics.experimental.singleton import Singleton from metricflow_semantics.mf_logging.pretty_formattable import MetricFlowPrettyFormattable @@ -31,7 +31,7 @@ @fast_frozen_dataclass(order=False) -class FlowNode(MetricflowGraphNode, ABC): +class FlowNode(MetricFlowGraphNode, ABC): """Example graph node.""" node_name: str @@ -43,8 +43,8 @@ def comparison_key(self) -> ComparisonKey: @override @property - def node_descriptor(self) -> MetricflowGraphNodeDescriptor: - return MetricflowGraphNodeDescriptor(node_name=self.node_name, cluster_name=None) + def node_descriptor(self) -> MetricFlowGraphNodeDescriptor: + return MetricFlowGraphNodeDescriptor(node_name=self.node_name, cluster_name=None) @fast_frozen_dataclass(order=False) @@ -69,12 +69,12 @@ def get_instance(cls, node_name: str) -> IntermediateNode: # noqa: D102 @override @property - def node_descriptor(self) -> MetricflowGraphNodeDescriptor: - return MetricflowGraphNodeDescriptor(node_name=self.node_name, cluster_name="intermediate_nodes") + def node_descriptor(self) -> MetricFlowGraphNodeDescriptor: + return MetricFlowGraphNodeDescriptor(node_name=self.node_name, cluster_name="intermediate_nodes") @fast_frozen_dataclass(order=False) -class FlowEdge(MetricflowGraphEdge): +class FlowEdge(MetricFlowGraphEdge): """Example graph edge.""" weight: int @@ -123,7 +123,7 @@ def create(cls, nodes: Iterable[FlowNode] = (), edges: Iterable[FlowEdge] = ()) return graph @override - def intersection(self, other: MetricflowGraph[FlowNode, FlowEdge]) -> FlowGraph: + def intersection(self, other: MetricFlowGraph[FlowNode, FlowEdge]) -> FlowGraph: intersection_graph = FlowGraph.create() self.add_edges(self._intersect_edges(other)) return intersection_graph @@ -147,4 +147,4 @@ def as_sorted(self) -> FlowGraph: FlowGraphPath = MutableGraphPath[FlowNode, FlowEdge] -FlowGraphPathFinder = MetricflowPathfinder[FlowNode, FlowEdge, FlowGraphPath] +FlowGraphPathFinder = MetricFlowPathfinder[FlowNode, FlowEdge, FlowGraphPath] diff --git a/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/formatting/dot_formatter.py b/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/formatting/dot_formatter.py index c82aee0cdb..dcf37bfe8a 100644 --- a/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/formatting/dot_formatter.py +++ b/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/formatting/dot_formatter.py @@ -1,24 +1,24 @@ from __future__ import annotations from metricflow_semantics.experimental.mf_graph.formatting.graph_formatter import ( - MetricflowGraphFormatter, + MetricFlowGraphFormatter, ) -from metricflow_semantics.experimental.mf_graph.mf_graph import MetricflowGraph +from metricflow_semantics.experimental.mf_graph.mf_graph import MetricFlowGraph from typing_extensions import override from tests_metricflow_semantics.experimental.mf_graph.formatting.mf_to_dot import ( - MetricflowGraphToDotConverter, + MetricFlowGraphToDotConverter, ) -class DotNotationFormatter(MetricflowGraphFormatter): +class DotNotationFormatter(MetricFlowGraphFormatter): """Formats a graph to DOT notation (see https://graphviz.org/doc/info/lang.html).""" def __init__(self) -> None: # noqa: D107 super().__init__() - self._mf_to_dot_graph_converter = MetricflowGraphToDotConverter() + self._mf_to_dot_graph_converter = MetricFlowGraphToDotConverter() @override - def format_graph(self, graph: MetricflowGraph) -> str: + def format_graph(self, graph: MetricFlowGraph) -> str: result = self._mf_to_dot_graph_converter.convert_graph(graph) return result.dot_graph.source diff --git a/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/formatting/mf_to_dot.py b/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/formatting/mf_to_dot.py index a7558eed23..fbf80f38c3 100644 --- a/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/formatting/mf_to_dot.py +++ b/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/formatting/mf_to_dot.py @@ -20,12 +20,12 @@ DotNodeAttributeSet, DotRankKey, ) -from metricflow_semantics.experimental.mf_graph.graph_converter import MetricflowGraphConverter +from metricflow_semantics.experimental.mf_graph.graph_converter import MetricFlowGraphConverter from typing_extensions import override if typing.TYPE_CHECKING: from metricflow_semantics.experimental.mf_graph.mf_graph import ( - MetricflowGraph, + MetricFlowGraph, ) logger = logging.getLogger(__name__) @@ -70,7 +70,7 @@ def create( # noqa: D102 ) -class MetricflowGraphToDotConverter(MetricflowGraphConverter[DotGraphConversionResult]): +class MetricFlowGraphToDotConverter(MetricFlowGraphConverter[DotGraphConversionResult]): """Convert an MF graph to a DOT graph.""" def __init__( # noqa: D107 @@ -81,7 +81,7 @@ def __init__( # noqa: D107 def _create_dot_attributes( self, - graph: MetricflowGraph, + graph: MetricFlowGraph, ) -> DotAttributeSet: cluster_name_to_dot_nodes: dict[Optional[str], AnyLengthTuple[DotNodeAttributeSet]] = {} @@ -138,7 +138,7 @@ def create_dot_graph( with subgraph_context as subgraph: if cluster_name is not None: subgraph.attr(label=cluster_name, **converter_arguments.cluster_attributes) - added_nodes = MetricflowGraphToDotConverter._add_nodes_with_rank( + added_nodes = MetricFlowGraphToDotConverter._add_nodes_with_rank( converter_arguments=converter_arguments, dot_graph=subgraph, dot_nodes=dot_nodes ) all_dot_nodes.extend(added_nodes) @@ -190,9 +190,9 @@ def _add_nodes_with_rank( return added_dot_nodes @override - def convert_graph(self, graph: MetricflowGraph) -> DotGraphConversionResult: + def convert_graph(self, graph: MetricFlowGraph) -> DotGraphConversionResult: dot_elements = self._create_dot_attributes(graph) - return MetricflowGraphToDotConverter.create_dot_graph(self._arguments, dot_elements) + return MetricFlowGraphToDotConverter.create_dot_graph(self._arguments, dot_elements) @dataclass diff --git a/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/formatting/mf_to_graphical_dot.py b/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/formatting/mf_to_graphical_dot.py index 8b5e274630..a7a05759cb 100644 --- a/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/formatting/mf_to_graphical_dot.py +++ b/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/formatting/mf_to_graphical_dot.py @@ -19,11 +19,11 @@ DotNodeShape, DotRankKey, ) -from metricflow_semantics.experimental.mf_graph.graph_converter import MetricflowGraphConverter +from metricflow_semantics.experimental.mf_graph.graph_converter import MetricFlowGraphConverter from metricflow_semantics.experimental.mf_graph.mf_graph import ( - MetricflowGraph, - MetricflowGraphEdge, - MetricflowGraphNode, + MetricFlowGraph, + MetricFlowGraphEdge, + MetricFlowGraphNode, ) from metricflow_semantics.helpers.string_helpers import mf_indent from metricflow_semantics.mf_logging.format_option import PrettyFormatOption @@ -42,7 +42,7 @@ DotAttributeSet, DotConversionArgumentSet, DotGraphConversionResult, - MetricflowGraphToDotConverter, + MetricFlowGraphToDotConverter, ) logger = logging.getLogger(__name__) @@ -145,7 +145,7 @@ def create( # noqa: D102 ) -class MetricflowGraphToGraphicalDotConverter(MetricflowGraphConverter[DotGraphConversionResult]): +class MetricFlowGraphToGraphicalDotConverter(MetricFlowGraphConverter[DotGraphConversionResult]): """Converts an MF graph to a DOT graph with graphical attributes for rendering to an image. TODO: Needs to allow highlighting of nodes / edges for path visualization. @@ -159,19 +159,19 @@ def __init__( # noqa: D107 self._verbose_debug_logs = False @override - def convert_graph(self, graph: MetricflowGraph) -> DotGraphConversionResult: + def convert_graph(self, graph: MetricFlowGraph) -> DotGraphConversionResult: dot_elements = self._create_dot_element_set(graph) - return MetricflowGraphToDotConverter.create_dot_graph(self._arguments, dot_elements) + return MetricFlowGraphToDotConverter.create_dot_graph(self._arguments, dot_elements) - def _create_dot_element_set(self, graph: MetricflowGraph) -> DotAttributeSet: + def _create_dot_element_set(self, graph: MetricFlowGraph) -> DotAttributeSet: # Convert nodes to DOT. cluster_name_to_dot_nodes: DefaultDict[Optional[str], list[DotNodeAttributeSet]] = defaultdict(list) - cluster_name_to_nodes: dict[str, list[MetricflowGraphNode]] = defaultdict(list) + cluster_name_to_nodes: dict[str, list[MetricFlowGraphNode]] = defaultdict(list) for mf_node in graph.nodes: cluster_name_to_nodes[mf_node.node_descriptor.cluster_name].append(mf_node) - mf_node_to_dot_node: dict[MetricflowGraphNode, DotNodeAttributeSet] = {} + mf_node_to_dot_node: dict[MetricFlowGraphNode, DotNodeAttributeSet] = {} for cluster_name, mf_nodes in cluster_name_to_nodes.items(): sorted_mf_nodes = sorted(mf_nodes) for mf_node in sorted_mf_nodes: @@ -186,7 +186,7 @@ def _create_dot_element_set(self, graph: MetricflowGraph) -> DotAttributeSet: cluster_name_to_dot_nodes[cluster_name].append(dot_node) # Map the original edge to the replacement intermediate DOT node. - edge_to_edge_as_dot_node_mapping: dict[MetricflowGraphEdge, DotNodeAttributeSet] = {} + edge_to_edge_as_dot_node_mapping: dict[MetricFlowGraphEdge, DotNodeAttributeSet] = {} # Use to generate unique names for the intermediate nodes. edge_as_node_index = 0 @@ -263,7 +263,7 @@ def _make_node_label(self, dot_node: DotNodeAttributeSet, displayed_properties: """Return a `graphviz` / DOT label to render this node. Currently, this return a `graphviz` HTML table where the first row is a single column with the ID of - the node, and subsequent row show the properties returned by `MetricflowGraphNode.displayed_properties`. + the node, and subsequent row show the properties returned by `MetricFlowGraphNode.displayed_properties`. """ table_builder = GraphvizHtmlTableBuilder(table_border=0) diff --git a/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/formatting/svg_formatter.py b/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/formatting/svg_formatter.py index fc5bfc1dfe..08d43148aa 100644 --- a/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/formatting/svg_formatter.py +++ b/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/formatting/svg_formatter.py @@ -5,31 +5,31 @@ from typing import Optional from metricflow_semantics.experimental.metricflow_exception import GraphvizException -from metricflow_semantics.experimental.mf_graph.formatting.graph_formatter import MetricflowGraphFormatter +from metricflow_semantics.experimental.mf_graph.formatting.graph_formatter import MetricFlowGraphFormatter from metricflow_semantics.mf_logging.lazy_formattable import LazyFormat from typing_extensions import override from tests_metricflow_semantics.experimental.mf_graph.formatting.mf_to_graphical_dot import ( - MetricflowGraphToGraphicalDotConverter, + MetricFlowGraphToGraphicalDotConverter, ) if typing.TYPE_CHECKING: from metricflow_semantics.experimental.mf_graph.mf_graph import ( - MetricflowGraph, + MetricFlowGraph, ) logger = logging.getLogger(__name__) -class SvgFormatter(MetricflowGraphFormatter): +class SvgFormatter(MetricFlowGraphFormatter): """Format a graph as an SVG that can be displayed in a browser.""" - def __init__(self, converter: Optional[MetricflowGraphToGraphicalDotConverter] = None) -> None: # noqa: D107 - self._mf_to_dot_graph_converter = converter or MetricflowGraphToGraphicalDotConverter() + def __init__(self, converter: Optional[MetricFlowGraphToGraphicalDotConverter] = None) -> None: # noqa: D107 + self._mf_to_dot_graph_converter = converter or MetricFlowGraphToGraphicalDotConverter() self._verbose_debug_logs = False @override - def format_graph(self, graph: MetricflowGraph) -> str: + def format_graph(self, graph: MetricFlowGraph) -> str: """Format the graph to the SVG image format using `graphviz`.""" result = self._mf_to_dot_graph_converter.convert_graph(graph) if self._verbose_debug_logs: diff --git a/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/path_finding/test_path_finder.py b/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/path_finding/test_path_finder.py index a5e7a85d4f..1ea823df91 100644 --- a/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/path_finding/test_path_finder.py +++ b/metricflow-semantics/tests_metricflow_semantics/experimental/mf_graph/path_finding/test_path_finder.py @@ -6,7 +6,7 @@ from _pytest.fixtures import FixtureRequest from metricflow_semantics.experimental.dataclass_helpers import fast_frozen_dataclass from metricflow_semantics.experimental.mf_graph.path_finding.graph_path import MutableGraphPath -from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricflowPathfinder +from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricFlowPathfinder from metricflow_semantics.experimental.mf_graph.path_finding.weight_function import EdgeCountWeightFunction from metricflow_semantics.experimental.ordered_set import FrozenOrderedSet from metricflow_semantics.test_helpers.config_helpers import MetricFlowTestConfiguration @@ -47,7 +47,7 @@ def pathfinder_fixture( # noqa: D103 request=request, snapshot_configuration=mf_test_configuration, graph=flow_graph, - pathfinder=MetricflowPathfinder(), + pathfinder=MetricFlowPathfinder(), path=MutableGraphPath.create(), ) diff --git a/metricflow-semantics/tests_metricflow_semantics/experimental/semantic_graph/attribute_resolution/test_recipe_writer.py b/metricflow-semantics/tests_metricflow_semantics/experimental/semantic_graph/attribute_resolution/test_recipe_writer.py index 915c21fa5b..342bc6c5cc 100644 --- a/metricflow-semantics/tests_metricflow_semantics/experimental/semantic_graph/attribute_resolution/test_recipe_writer.py +++ b/metricflow-semantics/tests_metricflow_semantics/experimental/semantic_graph/attribute_resolution/test_recipe_writer.py @@ -8,7 +8,7 @@ from dbt_semantic_interfaces.protocols import SemanticManifest from metricflow_semantics.collection_helpers.mf_type_aliases import AnyLengthTuple from metricflow_semantics.experimental.dsi.manifest_object_lookup import ManifestObjectLookup -from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricflowPathfinder +from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricFlowPathfinder from metricflow_semantics.experimental.semantic_graph.attribute_resolution.recipe_writer_path import ( AttributeRecipeWriterPath, RecipeWriterPathfinder, @@ -37,7 +37,7 @@ def test_recipe_writer_path( ) -> None: """Test generating recipes by traversing the semantic graph.""" semantic_graph = SemanticGraphBuilder(ManifestObjectLookup(sg_02_single_join_manifest)).build() - path_finder: RecipeWriterPathfinder = MetricflowPathfinder() + path_finder: RecipeWriterPathfinder = MetricFlowPathfinder() # Find all valid paths from the `bookings` simple metric to any group-by attribute node. source_node = semantic_graph.node_with_label(MetricLabel.get_instance("bookings")) diff --git a/metricflow-semantics/tests_metricflow_semantics/experimental/semantic_graph/sg_fixtures.py b/metricflow-semantics/tests_metricflow_semantics/experimental/semantic_graph/sg_fixtures.py index 9b42bb2a04..f1c658039a 100644 --- a/metricflow-semantics/tests_metricflow_semantics/experimental/semantic_graph/sg_fixtures.py +++ b/metricflow-semantics/tests_metricflow_semantics/experimental/semantic_graph/sg_fixtures.py @@ -7,7 +7,7 @@ from dbt_semantic_interfaces.protocols import SemanticManifest from metricflow_semantics.experimental.dataclass_helpers import fast_frozen_dataclass from metricflow_semantics.experimental.dsi.manifest_object_lookup import ManifestObjectLookup -from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricflowPathfinder +from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricFlowPathfinder from metricflow_semantics.experimental.semantic_graph.attribute_resolution.recipe_writer_path import ( RecipeWriterPathfinder, ) @@ -53,4 +53,4 @@ def sg_resolver(self) -> SemanticGraphGroupByItemSetResolver: # noqa: D102 @cached_property def pathfinder(self) -> RecipeWriterPathfinder: # noqa: D102 - return MetricflowPathfinder() + return MetricFlowPathfinder() diff --git a/metricflow-semantics/tests_metricflow_semantics/experimental/semantic_graph/trie_resolver/test_group_by_metric_trie_resolver.py b/metricflow-semantics/tests_metricflow_semantics/experimental/semantic_graph/trie_resolver/test_group_by_metric_trie_resolver.py index 76211d00e8..070ad9ff49 100644 --- a/metricflow-semantics/tests_metricflow_semantics/experimental/semantic_graph/trie_resolver/test_group_by_metric_trie_resolver.py +++ b/metricflow-semantics/tests_metricflow_semantics/experimental/semantic_graph/trie_resolver/test_group_by_metric_trie_resolver.py @@ -5,7 +5,7 @@ from _pytest.fixtures import FixtureRequest from dbt_semantic_interfaces.protocols import SemanticManifest from metricflow_semantics.experimental.dsi.manifest_object_lookup import ManifestObjectLookup -from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricflowPathfinder +from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricFlowPathfinder from metricflow_semantics.experimental.ordered_set import FrozenOrderedSet from metricflow_semantics.experimental.semantic_graph.attribute_resolution.annotated_spec_linkable_element_set import ( GroupByItemSet, @@ -30,7 +30,7 @@ def test_simple_metric( # noqa: D103 sg_05_derived_metric_manifest: SemanticManifest, ) -> None: semantic_graph = SemanticGraphBuilder(ManifestObjectLookup(sg_05_derived_metric_manifest)).build() - pathfinder: RecipeWriterPathfinder = MetricflowPathfinder() + pathfinder: RecipeWriterPathfinder = MetricFlowPathfinder() resolver = GroupByMetricTrieResolver(semantic_graph=semantic_graph, path_finder=pathfinder) simple_metric_node = semantic_graph.node_with_label(MetricLabel.get_instance("bookings")) result = resolver.resolve_trie(source_nodes=FrozenOrderedSet((simple_metric_node,)), element_filter=None) diff --git a/metricflow-semantics/tests_metricflow_semantics/experimental/semantic_graph/trie_resolver/test_simple_trie_resolver.py b/metricflow-semantics/tests_metricflow_semantics/experimental/semantic_graph/trie_resolver/test_simple_trie_resolver.py index 1e1961540f..3988e849e0 100644 --- a/metricflow-semantics/tests_metricflow_semantics/experimental/semantic_graph/trie_resolver/test_simple_trie_resolver.py +++ b/metricflow-semantics/tests_metricflow_semantics/experimental/semantic_graph/trie_resolver/test_simple_trie_resolver.py @@ -5,7 +5,7 @@ from _pytest.fixtures import FixtureRequest from dbt_semantic_interfaces.protocols import SemanticManifest from metricflow_semantics.experimental.dsi.manifest_object_lookup import ManifestObjectLookup -from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricflowPathfinder +from metricflow_semantics.experimental.mf_graph.path_finding.pathfinder import MetricFlowPathfinder from metricflow_semantics.experimental.ordered_set import FrozenOrderedSet from metricflow_semantics.experimental.semantic_graph.attribute_resolution.recipe_writer_path import ( RecipeWriterPathfinder, @@ -25,7 +25,7 @@ def test_simple_metric( # noqa: D103 sg_02_single_join_manifest: SemanticManifest, ) -> None: semantic_graph = SemanticGraphBuilder(ManifestObjectLookup(sg_02_single_join_manifest)).build() - pathfinder: RecipeWriterPathfinder = MetricflowPathfinder() + pathfinder: RecipeWriterPathfinder = MetricFlowPathfinder() resolver = SimpleTrieResolver(semantic_graph=semantic_graph, path_finder=pathfinder) simple_metric_node = semantic_graph.node_with_label(MetricLabel.get_instance("bookings")) result = resolver.resolve_trie(source_nodes=FrozenOrderedSet((simple_metric_node,)), element_filter=None) @@ -43,7 +43,7 @@ def test_metrics( # noqa: D103 sg_05_derived_metric_manifest: SemanticManifest, ) -> None: semantic_graph = SemanticGraphBuilder(ManifestObjectLookup(sg_05_derived_metric_manifest)).build() - pathfinder: RecipeWriterPathfinder = MetricflowPathfinder() + pathfinder: RecipeWriterPathfinder = MetricFlowPathfinder() resolver = SimpleTrieResolver(semantic_graph=semantic_graph, path_finder=pathfinder) resolver._verbose_debug_logs = True diff --git a/metricflow/engine/metricflow_engine.py b/metricflow/engine/metricflow_engine.py index cac44e3e5f..10ca2ec96a 100644 --- a/metricflow/engine/metricflow_engine.py +++ b/metricflow/engine/metricflow_engine.py @@ -21,7 +21,7 @@ from metricflow_semantics.collection_helpers.syntactic_sugar import mf_first_item from metricflow_semantics.dag.sequential_id import SequentialIdGenerator from metricflow_semantics.errors.error_classes import ExecutionException, InvalidQueryException, UnknownMetricError -from metricflow_semantics.experimental.metricflow_exception import MetricflowInternalError +from metricflow_semantics.experimental.metricflow_exception import MetricFlowInternalError from metricflow_semantics.filters.time_constraint import TimeRangeConstraint from metricflow_semantics.mf_logging.lazy_formattable import LazyFormat from metricflow_semantics.mf_logging.runtime import log_block_runtime @@ -700,7 +700,7 @@ def _create_dimension_from_spec(self, annotated_spec: AnnotatedSpec) -> Sequence origin_semantic_model_reference ) if semantic_model is None: - raise MetricflowInternalError( + raise MetricFlowInternalError( LazyFormat( "Unable to find the semantic model associated with a spec", spec=annotated_spec.spec, From f698193e9c8dd55b2e1e78b05b90a5a35d06ac3d Mon Sep 17 00:00:00 2001 From: Paul Yang Date: Mon, 13 Oct 2025 14:09:29 -0700 Subject: [PATCH 2/2] Add changelog entry --- .changes/unreleased/Under the Hood-20251013-140929.yaml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changes/unreleased/Under the Hood-20251013-140929.yaml diff --git a/.changes/unreleased/Under the Hood-20251013-140929.yaml b/.changes/unreleased/Under the Hood-20251013-140929.yaml new file mode 100644 index 0000000000..34c0111638 --- /dev/null +++ b/.changes/unreleased/Under the Hood-20251013-140929.yaml @@ -0,0 +1,6 @@ +kind: Under the Hood +body: Rename `Metricflow*` -> `MetricFlow*` +time: 2025-10-13T14:09:29.326515-07:00 +custom: + Author: plypaul + Issue: "1904"