class_docstr: Visits the SQL query plan to simplify sub-queries. On each visit, return a simplified node.
  
  Unlike SqlSubQueryReducerVisitor, this will re-write expressions to realize more reductions.
docstr: Returns true if the node is simple.
  
  Simple is defined as having no JOINs, WHERE, GROUP BYs, ORDER BYs, LIMIT, AGG functions, and there are no strings in the column
  select. Strings are avoided so that the child node doesn't use the string expression in a group by or cause
  aliasing issues when used in the child query. Aggregate functions are avoided due to the nature of applying on grouped rows which
  is essentially the effect as group bys and should be treated in here as such.
  
  e.g.
  
  Reducing
  
  SELECT
    a.col AS a_col
    , b.col AS b_col
  FROM (
     SELECT
       col AS col -- "col" is a string expression, not a column reference expression.
       , src0.join_key AS join_key
     FROM foo src0
  ) a
  JOIN b
  ON a.join_key = b.join_key
  
  to
  
  SELECT
    col AS a_col
    , b.col AS b_col
  FROM foo src0
  JOIN b
  ON a.join_key = b.join_key
  
  will throw an ambiguous column error on "col".
code: def _is_simple_source(node: SqlSelectStatementNode) -> bool:
      """Returns true if the node is simple.
  
      Simple is defined as having no JOINs, WHERE, GROUP BYs, ORDER BYs, LIMIT, AGG functions, and there are no strings in the column
      select. Strings are avoided so that the child node doesn't use the string expression in a group by or cause
      aliasing issues when used in the child query. Aggregate functions are avoided due to the nature of applying on grouped rows which
      is essentially the effect as group bys and should be treated in here as such.
  
      e.g.
  
      Reducing
  
      SELECT
        a.col AS a_col
        , b.col AS b_col
      FROM (
         SELECT
           col AS col -- "col" is a string expression, not a column reference expression.
           , src0.join_key AS join_key
         FROM foo src0
      ) a
      JOIN b
      ON a.join_key = b.join_key
  
      to
  
      SELECT
        col AS a_col
        , b.col AS b_col
      FROM foo src0
      JOIN b
      ON a.join_key = b.join_key
  
      will throw an ambiguous column error on "col".
      """
      for select_column in node.select_columns:
          if select_column.expr.lineage.contains_string_exprs:
              return False
          if select_column.expr.lineage.contains_column_alias_exprs:
              return False
          if select_column.expr.lineage.contains_aggregate_exprs:
              return False
      return (
          len(node.parent_nodes) <= 1
          and len(node.group_bys) == 0
          and len(node.order_bys) == 0
          and not node.limit
          and not node.where
      )
  
imports: from __future__ import annotations
  import logging
  from dataclasses import dataclass
  from typing import List, Optional, Sequence, Tuple
  from metricflow.sql.optimizer.sql_query_plan_optimizer import SqlQueryPlanOptimizer
  from metricflow.sql.sql_exprs import SqlColumnAliasReferenceExpression, SqlColumnReference, SqlColumnReplacements, SqlExpressionNode, SqlExpressionTreeLineage, SqlLogicalExpression, SqlLogicalOperator
  from metricflow.sql.sql_plan import SqlJoinDescription, SqlOrderByDescription, SqlQueryPlanNode, SqlQueryPlanNodeVisitor, SqlSelectColumn, SqlSelectQueryFromClauseNode, SqlSelectStatementNode, SqlTableFromClauseNode
label_desc: Use image node_id 6 for calling the SqlRewritingSubQueryReducerVisitor obj's underlying member method code with example usage: obj._is_simple_source(node) and returns: unknown, False, False, False