class_docstr: Helper class for constructing various join components in a SqlQueryPlan.
docstr: Make a join description for joining base-to-conversion data sets.
  
  A successful conversion is when a conversion event occurs after a corresponding base event
  under the condition of being within the time range and other conditions (such as constant properties).
  This builds the join description to satisfy all those conditions.
docstr_tok: ["Make","a","join","description","for","joining","base-to-conversion","data","sets",".","A","successful","conversion","is","when","a","conversion","event","occurs","after","a","corresponding","base","event","under","the","condition","of","being","within","the","time","range","and","other","conditions","(","such","as","constant","properties",")",".","This","builds","the","join","description","to","satisfy","all","those","conditions","."]
code: def make_join_conversion_join_description(
      node: JoinConversionEventsNode,
      base_data_set: AnnotatedSqlDataSet,
      conversion_data_set: AnnotatedSqlDataSet,
      column_equality_descriptions: Sequence[ColumnEqualityDescription],
  ) -> SqlJoinDescription:
      """Make a join description for joining base-to-conversion data sets.
  
      A successful conversion is when a conversion event occurs after a corresponding base event
      under the condition of being within the time range and other conditions (such as constant properties).
      This builds the join description to satisfy all those conditions.
      """
      window_condition = SqlQueryPlanJoinBuilder._make_time_range_window_join_condition(
          base_data_set=base_data_set,
          time_comparison_dataset=conversion_data_set,
          window=node.window,
      )
      return SqlQueryPlanJoinBuilder.make_column_equality_sql_join_description(
          right_source_node=conversion_data_set.data_set.sql_select_node,
          left_source_alias=base_data_set.alias,
          right_source_alias=conversion_data_set.alias,
          column_equality_descriptions=column_equality_descriptions,
          join_type=SqlJoinType.INNER,
          additional_on_conditions=(window_condition,),
      )
  
imports: from __future__ import annotations
  from dataclasses import dataclass
  from typing import List, Optional, Sequence, Tuple
  from dbt_semantic_interfaces.protocols.metric import MetricTimeWindow
  from dbt_semantic_interfaces.type_enums.time_granularity import TimeGranularity
  from metricflow.assert_one_arg import assert_exactly_one_arg_set
  from metricflow.dataflow.dataflow_plan import JoinConversionEventsNode, JoinDescription, JoinOverTimeRangeNode, JoinToTimeSpineNode
  from metricflow.dataset.sql_dataset import SqlDataSet
  from metricflow.plan_conversion.sql_expression_builders import make_coalesced_expr
  from metricflow.sql.sql_exprs import SqlColumnReference, SqlColumnReferenceExpression, SqlComparison, SqlComparisonExpression, SqlDateTruncExpression, SqlIsNullExpression, SqlLogicalExpression, SqlLogicalOperator, SqlSubtractTimeIntervalExpression
  from metricflow.sql.sql_plan import SqlExpressionNode, SqlJoinDescription, SqlJoinType, SqlSelectStatementNode
label_desc: Use image node_id 8 for calling the SqlQueryPlanJoinBuilder obj's underlying member method code with example usage: obj.make_join_conversion_join_description(node, base_data_set, conversion_data_set, column_equality_descriptions) and returns: SqlQueryPlanJoinBuilder