code: def enable_cache_on_expression_tree(
      context: "OptimizerContext", expr_tree: AbstractExpression
  ):
      func_exprs = list(expr_tree.find_all(FunctionExpression))
      func_exprs = list(
          filter(
              lambda expr: check_expr_validity_for_cache(expr),
              func_exprs,
          )
      )
      for expr in func_exprs:
          cache = enable_cache_init(context, expr)
          expr.enable_cache(cache)
  
imports: import typing
  from typing import List, Tuple
  from evadb.catalog.catalog_utils import get_table_primary_columns
  from evadb.catalog.models.column_catalog import ColumnCatalogEntry
  from evadb.catalog.models.function_io_catalog import FunctionIOCatalogEntry
  from evadb.catalog.models.function_metadata_catalog import FunctionMetadataCatalogEntry
  from evadb.constants import CACHEABLE_FUNCTIONS, DEFAULT_FUNCTION_EXPRESSION_COST
  from evadb.expression.abstract_expression import AbstractExpression, ExpressionType
  from evadb.expression.constant_value_expression import ConstantValueExpression
  from evadb.expression.expression_utils import conjunction_list_to_expression_tree, contains_single_column, get_columns_in_predicate, is_simple_predicate, to_conjunction_list
  from evadb.expression.function_expression import FunctionExpression, FunctionExpressionCache
  from evadb.expression.tuple_value_expression import TupleValueExpression
  from evadb.parser.alias import Alias
  from evadb.parser.create_statement import ColumnDefinition
  from evadb.utils.kv_cache import DiskKVCache
label_desc: Use image node_id 11 for calling a global function with example usage: enable_cache_on_expression_tree(context, expr_tree) without return types