class_docstr: Builds a dataflow plan to satisfy a given query.
class_docstr_tok: ["Builds","a","dataflow","plan","to","satisfy","a","given","query","."]
docstr: Builds a node that computes all requested metrics.
  
  Args:
      metric_specs: Specs for metrics to compute. Contains modifications to the metric defined in the model to
      include offsets and filters.
      queried_linkable_specs: Dimensions/entities that were queried.
      filter_spec_factory: Constructs WhereFilterSpecs with the resolved ambiguous group-by-items in the filter.
      time_range_constraint: Time range constraint used to compute the metric.
docstr_tok: ["Builds","a","node","that","computes","all","requested","metrics",".","Args",":","metric_specs",":","Specs","for","metrics","to","compute",".","Contains","modifications","to","the","metric","defined","in","the","model","to","include","offsets","and","filters",".","queried_linkable_specs",":","Dimensions\/entities","that","were","queried",".","filter_spec_factory",":","Constructs","WhereFilterSpecs","with","the","resolved","ambiguous","group-by-items","in","the","filter",".","time_range_constraint",":","Time","range","constraint","used","to","compute","the","metric","."]
code: def _build_metrics_output_node(
      self,
      metric_specs: Sequence[MetricSpec],
      queried_linkable_specs: LinkableSpecSet,
      filter_spec_factory: WhereSpecFactory,
      time_range_constraint: Optional[TimeRangeConstraint] = None,
  ) -> BaseOutput:
      """Builds a node that computes all requested metrics.
  
      Args:
          metric_specs: Specs for metrics to compute. Contains modifications to the metric defined in the model to
          include offsets and filters.
          queried_linkable_specs: Dimensions/entities that were queried.
          filter_spec_factory: Constructs WhereFilterSpecs with the resolved ambiguous group-by-items in the filter.
          time_range_constraint: Time range constraint used to compute the metric.
      """
      output_nodes: List[BaseOutput] = []
  
      for metric_spec in metric_specs:
          logger.info(
              f"Generating compute metrics node for {metric_spec}"
          )
          self._metric_lookup.get_metric(metric_spec.reference)
  
          output_nodes.append(
              self._build_any_metric_output_node(
                  metric_spec=metric_spec,
                  queried_linkable_specs=queried_linkable_specs,
                  filter_spec_factory=filter_spec_factory,
                  time_range_constraint=time_range_constraint,
              )
          )
  
      assert (
          len(output_nodes) > 0
      ), "ComputeMetricsNode was not properly constructed"
  
      if len(output_nodes) == 1:
          return output_nodes[0]
  
      return CombineAggregatedOutputsNode(parent_nodes=output_nodes)
  
imports: from __future__ import annotations
  import logging
  import time
  from dataclasses import dataclass
  from typing import Dict, List, Optional, Sequence, Set, Tuple, Union
  from dbt_semantic_interfaces.enum_extension import assert_values_exhausted
  from dbt_semantic_interfaces.implementations.metric import PydanticMetricTimeWindow
  from dbt_semantic_interfaces.pretty_print import pformat_big_objects
  from dbt_semantic_interfaces.protocols.metric import ConstantPropertyInput, ConversionTypeParams, MetricInputMeasure, MetricTimeWindow, MetricType
  from dbt_semantic_interfaces.references import MeasureReference, MetricReference, TimeDimensionReference
  from dbt_semantic_interfaces.type_enums.time_granularity import TimeGranularity
  from dbt_semantic_interfaces.validations.unique_valid_name import MetricFlowReservedKeywords
  from metricflow.dag.id_generation import DATAFLOW_PLAN_PREFIX, IdGeneratorRegistry
  from metricflow.dataflow.builder.node_data_set import DataflowPlanNodeOutputDataSetResolver
  from metricflow.dataflow.builder.node_evaluator import JoinLinkableInstancesRecipe, LinkableInstanceSatisfiabilityEvaluation, NodeEvaluatorForLinkableInstances
  from metricflow.dataflow.dataflow_plan import AddGeneratedUuidColumnNode, AggregateMeasuresNode, BaseOutput, CombineAggregatedOutputsNode, ComputeMetricsNode, ConstrainTimeRangeNode, DataflowPlan, FilterElementsNode, JoinConversionEventsNode, JoinDescription, JoinOverTimeRangeNode, JoinToBaseOutputNode, JoinToTimeSpineNode, MinMaxNode, OrderByLimitNode, ReadSqlSourceNode, SemiAdditiveJoinNode, SinkOutput, WhereConstraintNode, WriteToResultDataframeNode, WriteToResultTableNode
  from metricflow.dataflow.dataflow_plan_to_text import dataflow_dag_as_text
  from metricflow.dataflow.optimizer.dataflow_plan_optimizer import DataflowPlanOptimizer
  from metricflow.dataflow.sql_table import SqlTable
  from metricflow.dataset.dataset import DataSet
  from metricflow.errors.errors import UnableToSatisfyQueryError
  from metricflow.filters.time_constraint import TimeRangeConstraint
  from metricflow.mf_logging.pretty_print import mf_pformat
  from metricflow.mf_logging.runtime import log_runtime
  from metricflow.model.semantic_manifest_lookup import SemanticManifestLookup
  from metricflow.plan_conversion.column_resolver import DunderColumnAssociationResolver
  from metricflow.plan_conversion.node_processor import PreJoinNodeProcessor
  from metricflow.query.group_by_item.filter_spec_resolution.filter_location import WhereFilterLocation
  from metricflow.query.group_by_item.filter_spec_resolution.filter_spec_lookup import FilterSpecResolutionLookUp
  from metricflow.specs.column_assoc import ColumnAssociationResolver
  from metricflow.specs.specs import ConstantPropertySpec, CumulativeMeasureDescription, EntitySpec, InstanceSpecSet, JoinToTimeSpineDescription, LinkableInstanceSpec, LinkableSpecSet, LinklessEntitySpec, MeasureSpec, MetadataSpec, MetricFlowQuerySpec, MetricInputMeasureSpec, MetricSpec, NonAdditiveDimensionSpec, OrderBySpec, TimeDimensionSpec, WhereFilterSpec
  from metricflow.specs.where_filter_transform import WhereSpecFactory
  from metricflow.sql.sql_plan import SqlJoinType
label_desc: Use image node_id 9 for calling the DataflowPlanBuilder obj's underlying member method code with example usage: obj._build_metrics_output_node(metric_specs, queried_linkable_specs, filter_spec_factory, time_range_constraint) and returns: CombineAggregatedOutputsNode, output_nodes