sig
  type join_kind = NestedLoopJoin | HashJoin | SortJoin
  val get_join_kind : Algebra_type.algop_expr -> Code_util_join.join_kind
  val build_sort_cond :
    Code_selection_context.code_selection_function ->
    Code_selection_context.code_selection_context ->
    Algebra_type.algop_expr -> Code_util_predicates.predicate_functions
  val build_hash_cond :
    Code_selection_context.code_selection_function ->
    Code_selection_context.code_selection_context ->
    Algebra_type.algop_expr -> Code_util_predicates.predicate_functions
  type outer_kind = StandardJoin | OuterJoin of Xquery_common_ast.crname
  type null_functions =
      bool * (unit -> unit) * (unit -> unit) * Physical_value.dom_value array
  val get_null_functions :
    Code_selection_context.code_selection_context ->
    Code_util_join.outer_kind ->
    Xquery_common_ast.crname array -> Code_util_join.null_functions
  val select_physical_op :
    Code_util_join.outer_kind ->
    Algebra_type.algop_expr -> Xquery_physical_algebra_ast.physop_expr_name
end