Github user dilipbiswal commented on a diff in the pull request:

    https://github.com/apache/spark/pull/16954#discussion_r105778315
  
    --- Diff: 
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/subquery.scala
 ---
    @@ -40,19 +43,189 @@ abstract class PlanExpression[T <: QueryPlan[_]] 
extends Expression {
     /**
      * A base interface for expressions that contain a [[LogicalPlan]].
      */
    -abstract class SubqueryExpression extends PlanExpression[LogicalPlan] {
    +abstract class SubqueryExpression(
    +    plan: LogicalPlan,
    +    children: Seq[Expression],
    +    exprId: ExprId) extends PlanExpression[LogicalPlan] {
    +
    +  override lazy val resolved: Boolean = childrenResolved && plan.resolved
    +  override lazy val references: AttributeSet =
    +    if (plan.resolved) super.references -- plan.outputSet else 
super.references
       override def withNewPlan(plan: LogicalPlan): SubqueryExpression
    +  override def semanticEquals(o: Expression): Boolean = o match {
    +    case p: SubqueryExpression =>
    +      this.getClass.getName.equals(p.getClass.getName) && 
plan.sameResult(p.plan) &&
    +        children.length == p.children.length &&
    +        children.zip(p.children).forall(p => p._1.semanticEquals(p._2))
    +    case _ => false
    +  }
     }
     
     object SubqueryExpression {
    +  /**
    +   * Returns true when an expression contains an IN or EXISTS subquery and 
false otherwise.
    +   */
    +  def hasInOrExistsSubquery(e: Expression): Boolean = {
    +    e.find {
    +      case _: ListQuery | _: Exists => true
    +      case _ => false
    +    }.isDefined
    +  }
    +
    +  /**
    +   * Returns true when an expression contains a subquery that has outer 
reference(s). The outer
    +   * reference attributes are kept as children of subquery expression by
    +   * [[org.apache.spark.sql.catalyst.analysis.Analyzer.ResolveSubquery]]
    +   */
       def hasCorrelatedSubquery(e: Expression): Boolean = {
         e.find {
    -      case e: SubqueryExpression if e.children.nonEmpty => true
    +      case s: SubqueryExpression => s.children.nonEmpty
           case _ => false
         }.isDefined
       }
     }
     
    +object SubExprUtils extends PredicateHelper {
    --- End diff --
    
    @hvanhovell Actually @nsyca and i had discussed a bit about this. 
SubqueryExpression object has methods that operates strictly in the context of 
SubqueryExpression where as the utils has methods that mostly deals with 
OuterReferences.. So they can operate on the subquery plans referred to from 
SubqueryExpression or may be in the future if we support  queries of the form.
    ```
    select * from t1 left outer join (select * from t2 where t2.c1 = t1.c1) on 
…
    ```
    If you think we should merge this two then let me know and i will do it 
:-). 


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastruct...@apache.org or file a JIRA ticket
with INFRA.
---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org
For additional commands, e-mail: reviews-h...@spark.apache.org

Reply via email to