code: def test_node_evaluator_with_multi_hop_through_scd(
      consistent_id_object_repository: ConsistentIdObjectRepository,
      scd_semantic_manifest_lookup: SemanticManifestLookup,
  ) -> None:
      """Tests the case where the joined node is reached via an SCD.
  
      The validity window should NOT have any entity links, as the validity window join is not mediated by an
      intervening node and therefore the column name does not use the link prefix.
      """
      linkable_specs = [
          DimensionSpec.from_name("listing__user__home_state_latest")
      ]
      node_evaluator = make_multihop_node_evaluator(
          model_source_nodes=consistent_id_object_repository.scd_model_source_nodes,
          semantic_manifest_lookup_with_multihop_links=scd_semantic_manifest_lookup,
          desired_linkable_specs=linkable_specs,
      )
  
      evaluation = node_evaluator.evaluate_node(
          required_linkable_specs=linkable_specs,
          start_node=consistent_id_object_repository.scd_model_read_nodes[
              "bookings_source"
          ],
          default_join_type=SqlJoinType.LEFT_OUTER,
      )
  
      assert evaluation == LinkableInstanceSatisfiabilityEvaluation(
          local_linkable_specs=(),
          joinable_linkable_specs=(
              DimensionSpec(
                  element_name="home_state_latest",
                  entity_links=(
                      EntityReference(element_name="listing"),
                      EntityReference(element_name="user"),
                  ),
              ),
          ),
          join_recipes=(
              JoinLinkableInstancesRecipe(
                  node_to_join=evaluation.join_recipes[0].node_to_join,
                  join_on_entity=LinklessEntitySpec.from_element_name(
                      "listing"
                  ),
                  satisfiable_linkable_specs=[
                      DimensionSpec(
                          element_name="home_state_latest",
                          entity_links=(
                              EntityReference(element_name="listing"),
                              EntityReference(element_name="user"),
                          ),
                      ),
                  ],
                  join_on_partition_dimensions=(),
                  join_on_partition_time_dimensions=(),
                  validity_window=ValidityWindowJoinDescription(
                      window_start_dimension=TimeDimensionSpec(
                          element_name="window_start", entity_links=()
                      ),
                      window_end_dimension=TimeDimensionSpec(
                          element_name="window_end", entity_links=()
                      ),
                  ),
                  join_type=SqlJoinType.LEFT_OUTER,
              ),
          ),
          unjoinable_linkable_specs=(),
      )
  
imports: from __future__ import annotations
  import logging
  from typing import Sequence
  import pytest
  from dbt_semantic_interfaces.type_enums.time_granularity import TimeGranularity
  from metricflow.dataflow.builder.dataflow_plan_builder import DataflowPlanBuilder
  from metricflow.dataflow.builder.node_data_set import DataflowPlanNodeOutputDataSetResolver
  from metricflow.dataflow.builder.node_evaluator import JoinLinkableInstancesRecipe, LinkableInstanceSatisfiabilityEvaluation, NodeEvaluatorForLinkableInstances
  from metricflow.dataflow.builder.partitions import PartitionTimeDimensionJoinDescription
  from metricflow.dataflow.dataflow_plan import BaseOutput, ValidityWindowJoinDescription
  from metricflow.dataset.dataset import DataSet
  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.specs.specs import DimensionSpec, EntityReference, EntitySpec, LinkableInstanceSpec, LinklessEntitySpec, TimeDimensionSpec
  from metricflow.sql.sql_plan import SqlJoinType
  from metricflow.test.fixtures.model_fixtures import ConsistentIdObjectRepository
label_desc: Use image node_id 14 for calling a global function with example usage: test_node_evaluator_with_multi_hop_through_scd(consistent_id_object_repository, scd_semantic_manifest_lookup) without return types