class_docstr: Helps to evaluate if linkable instances can be obtained using the given node, with joins if necessary.
  
  For example, consider a "start_node" containing the "bookings" measure, "is_instant" dimension, and "listing_id"
  entity with nodes_available_for_joins including a node with the "listing_id" entity, and the "country"
  dimension.
  
  We want to know if we can get "bookings", "is_instant", "listing_id__country" using the start_node. The result
  should be that we know: "is_instant" is available locally (i.e. in the same node), and if we join another node
  containing "listing_id" and "country" by "listing_id", we can get "listing_id__country".
  
  Since it's used on the left side of the join, the items in the "start_node" are sometimes labeled "left".
class_docstr_tok: ["Helps","to","evaluate","if","linkable","instances","can","be","obtained","using","the","given","node",",","with","joins","if","necessary",".","For","example",",","consider","a","``","start_node","''","containing","the","``","bookings","''","measure",",","``","is_instant","''","dimension",",","and","``","listing_id","''","entity","with","nodes_available_for_joins","including","a","node","with","the","``","listing_id","''","entity",",","and","the","``","country","''","dimension",".","We","want","to","know","if","we","can","get","``","bookings","''",",","``","is_instant","''",",","``","listing_id__country","''","using","the","start_node",".","The","result","should","be","that","we","know",":","``","is_instant","''","is","available","locally","(","i.e",".","in","the","same","node",")",",","and","if","we","join","another","node","containing","``","listing_id","''","and","``","country","''","by","``","listing_id","''",",","we","can","get","``","listing_id__country","''",".","Since","it","'s","used","on","the","left","side","of","the","join",",","the","items","in","the","``","start_node","''","are","sometimes","labeled","``","left","''","."]
docstr: Constructor.
  
  Args:
      semantic_model_lookup: Needed to resolve partition dimensions.
      nodes_available_for_joins: Nodes that contain linkable instances and may be joined with the "start_node"
      (e.g. the node containing a desired measure) to retrieve the needed linkable instances.
      node_data_set_resolver: Figures out what data set is output by a node.
docstr_tok: ["Constructor",".","Args",":","semantic_model_lookup",":","Needed","to","resolve","partition","dimensions",".","nodes_available_for_joins",":","Nodes","that","contain","linkable","instances","and","may","be","joined","with","the","``","start_node","''","(","e.g",".","the","node","containing","a","desired","measure",")","to","retrieve","the","needed","linkable","instances",".","node_data_set_resolver",":","Figures","out","what","data","set","is","output","by","a","node","."]
code: def __init__(
      self,
      semantic_model_lookup: SemanticModelAccessor,
      nodes_available_for_joins: Sequence[BaseOutput],
      node_data_set_resolver: DataflowPlanNodeOutputDataSetResolver,
  ) -> None:
      """Constructor.
  
      Args:
          semantic_model_lookup: Needed to resolve partition dimensions.
          nodes_available_for_joins: Nodes that contain linkable instances and may be joined with the "start_node"
          (e.g. the node containing a desired measure) to retrieve the needed linkable instances.
          node_data_set_resolver: Figures out what data set is output by a node.
      """
      self._semantic_model_lookup = semantic_model_lookup
      self._nodes_available_for_joins = nodes_available_for_joins
      self._node_data_set_resolver = node_data_set_resolver
      self._partition_resolver = PartitionJoinResolver(
          self._semantic_model_lookup
      )
      self._join_evaluator = SemanticModelJoinEvaluator(
          self._semantic_model_lookup
      )
  
imports: from __future__ import annotations
  import itertools
  import logging
  from dataclasses import dataclass
  from typing import List, Optional, Sequence, Tuple
  from dbt_semantic_interfaces.pretty_print import pformat_big_objects
  from metricflow.dataflow.builder.node_data_set import DataflowPlanNodeOutputDataSetResolver
  from metricflow.dataflow.builder.partitions import PartitionJoinResolver
  from metricflow.dataflow.dataflow_plan import BaseOutput, FilterElementsNode, JoinDescription, PartitionDimensionJoinDescription, PartitionTimeDimensionJoinDescription, ValidityWindowJoinDescription
  from metricflow.dataset.sql_dataset import SqlDataSet
  from metricflow.instances import InstanceSet
  from metricflow.model.semantics.semantic_model_join_evaluator import SemanticModelJoinEvaluator
  from metricflow.plan_conversion.instance_converters import CreateValidityWindowJoinDescription
  from metricflow.protocols.semantics import SemanticModelAccessor
  from metricflow.specs.specs import InstanceSpecSet, LinkableInstanceSpec, LinklessEntitySpec
  from metricflow.sql.sql_plan import SqlJoinType
label_desc: Use image node_id 1 to create a new NodeEvaluatorForLinkableInstances object  with example: obj = NodeEvaluatorForLinkableInstances(semantic_model_lookup, nodes_available_for_joins, node_data_set_resolver)