class_docstr: Builds a dataflow plan to satisfy a given query.
class_docstr_tok: ["Builds","a","dataflow","plan","to","satisfy","a","given","query","."]
docstr: Get the required and extraneous linkable specs for this query.
  
  Extraneous linkable specs are specs that are used in this phase that should not show up in the final result
  unless it was already a requested spec in the query (e.g., linkable spec used in where constraint)
docstr_tok: ["Get","the","required","and","extraneous","linkable","specs","for","this","query",".","Extraneous","linkable","specs","are","specs","that","are","used","in","this","phase","that","should","not","show","up","in","the","final","result","unless","it","was","already","a","requested","spec","in","the","query","(","e.g.",",","linkable","spec","used","in","where","constraint",")"]
code: def __get_required_and_extraneous_linkable_specs(
      self,
      queried_linkable_specs: LinkableSpecSet,
      filter_specs: Sequence[WhereFilterSpec],
      non_additive_dimension_spec: Optional[
          NonAdditiveDimensionSpec
      ] = None,
  ) -> Tuple[LinkableSpecSet, LinkableSpecSet]:
      """Get the required and extraneous linkable specs for this query.
  
      Extraneous linkable specs are specs that are used in this phase that should not show up in the final result
      unless it was already a requested spec in the query (e.g., linkable spec used in where constraint)
      """
      linkable_spec_sets_to_merge: List[LinkableSpecSet] = []
      for filter_spec in filter_specs:
          linkable_spec_sets_to_merge.append(
              filter_spec.linkable_spec_set
          )
      if non_additive_dimension_spec:
          linkable_spec_sets_to_merge.append(
              non_additive_dimension_spec.linkable_specs
          )
  
      extraneous_linkable_specs = LinkableSpecSet.merge_iterable(
          linkable_spec_sets_to_merge
      ).dedupe()
      required_linkable_specs = queried_linkable_specs.merge(
          extraneous_linkable_specs
      ).dedupe()
  
      return required_linkable_specs, extraneous_linkable_specs
  
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 26 for calling the DataflowPlanBuilder obj's underlying member method code with example usage: obj.__get_required_and_extraneous_linkable_specs(queried_linkable_specs, filter_specs, non_additive_dimension_spec) and returns: required_linkable_specs,  extraneous_linkable_specs