gengliangwang commented on a change in pull request #32060:
URL: https://github.com/apache/spark/pull/32060#discussion_r608359329



##########
File path: 
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/predicates.scala
##########
@@ -26,6 +26,7 @@ import 
org.apache.spark.sql.catalyst.expressions.BindReferences.bindReference
 import org.apache.spark.sql.catalyst.expressions.codegen._
 import org.apache.spark.sql.catalyst.expressions.codegen.Block._
 import org.apache.spark.sql.catalyst.plans.logical.{Aggregate, LeafNode, 
LogicalPlan, Project}
+import org.apache.spark.sql.catalyst.trees.TreePattern._

Review comment:
       Nit:  
   `import org.apache.spark.sql.catalyst.trees.TreePattern.IN`
   
   As per https://github.com/databricks/scala-style-guide#imports, we should 
avoid using wildcard imports

##########
File path: 
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/trees/TreeNode.scala
##########
@@ -90,6 +139,66 @@ abstract class TreeNode[BaseType <: TreeNode[BaseType]] 
extends Product {
    */
   private val tags: mutable.Map[TreeNodeTag[_], Any] = mutable.Map.empty
 
+  /**
+   * A bit set of tree patterns for this TreeNode and its subtree. If this 
TreeNode node and its
+   * subtree contains a pattern `P`, the corresponding bit for `P.id` is set 
in this BitSet.
+   */
+  override lazy val treePatternBits: BitSet = {
+    val bits: BitSet = new BitSet(TreePattern.maxId)
+    // Propagate node pattern bits
+    val nodePatternIterator = nodePatterns.iterator
+    while (nodePatternIterator.hasNext) {
+      bits.set(nodePatternIterator.next().id)
+    }
+    // Propagate children's pattern bits
+    val childIterator = children.iterator

Review comment:
       ditto

##########
File path: 
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/QueryPlan.scala
##########
@@ -48,6 +52,27 @@ abstract class QueryPlan[PlanType <: QueryPlan[PlanType]]
   @transient
   lazy val outputSet: AttributeSet = AttributeSet(output)
 
+  // Override `treePatternBits` to propagate bits for its expressions.
+  override lazy val treePatternBits: BitSet = {
+    val bits: BitSet = new BitSet(TreePattern.maxId)
+    // Propagate node pattern bits
+    val nodeTypeIterator = nodePatterns.iterator

Review comment:
       nit: This is the same as 
   ```
   nodePatterns.foreach {...}
   ```

##########
File path: 
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/trees/TreeNode.scala
##########
@@ -77,8 +80,54 @@ object CurrentOrigin {
 // A tag of a `TreeNode`, which defines name and type
 case class TreeNodeTag[T](name: String)
 
+// A wrapper of Bitset for pattern enums.
+trait TreePatternBits {
+  val treePatternBits: BitSet
+
+  /**
+   * @param t, the tree pattern enum to be tested.
+   * @return true if the bit for `t` is set; false otherwise.
+   */
+  @inline final def containsPattern(t: TreePattern): Boolean = {
+    treePatternBits.get(t.id)
+  }
+
+  /**
+   * @param patterns, a sequence of tree pattern enums to be tested.
+   * @return true if every bit for `patterns` is set; false otherwise.
+   */
+  final def containsAllPatterns(patterns: TreePattern*): Boolean = {
+    val iterator = patterns.iterator

Review comment:
       ditto

##########
File path: 
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/QueryPlan.scala
##########
@@ -48,6 +52,27 @@ abstract class QueryPlan[PlanType <: QueryPlan[PlanType]]
   @transient
   lazy val outputSet: AttributeSet = AttributeSet(output)
 
+  // Override `treePatternBits` to propagate bits for its expressions.
+  override lazy val treePatternBits: BitSet = {
+    val bits: BitSet = new BitSet(TreePattern.maxId)
+    // Propagate node pattern bits
+    val nodeTypeIterator = nodePatterns.iterator
+    while (nodeTypeIterator.hasNext) {
+      bits.set(nodeTypeIterator.next().id)
+    }
+    // Propagate children's pattern bits
+    val childIterator = children.iterator

Review comment:
       ditto

##########
File path: 
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/trees/TreeNode.scala
##########
@@ -90,6 +139,66 @@ abstract class TreeNode[BaseType <: TreeNode[BaseType]] 
extends Product {
    */
   private val tags: mutable.Map[TreeNodeTag[_], Any] = mutable.Map.empty
 
+  /**
+   * A bit set of tree patterns for this TreeNode and its subtree. If this 
TreeNode node and its
+   * subtree contains a pattern `P`, the corresponding bit for `P.id` is set 
in this BitSet.
+   */
+  override lazy val treePatternBits: BitSet = {
+    val bits: BitSet = new BitSet(TreePattern.maxId)
+    // Propagate node pattern bits
+    val nodePatternIterator = nodePatterns.iterator

Review comment:
       ditto

##########
File path: 
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/QueryPlan.scala
##########
@@ -48,6 +52,27 @@ abstract class QueryPlan[PlanType <: QueryPlan[PlanType]]
   @transient
   lazy val outputSet: AttributeSet = AttributeSet(output)
 
+  // Override `treePatternBits` to propagate bits for its expressions.
+  override lazy val treePatternBits: BitSet = {
+    val bits: BitSet = new BitSet(TreePattern.maxId)
+    // Propagate node pattern bits
+    val nodeTypeIterator = nodePatterns.iterator
+    while (nodeTypeIterator.hasNext) {
+      bits.set(nodeTypeIterator.next().id)
+    }
+    // Propagate children's pattern bits
+    val childIterator = children.iterator
+    while (childIterator.hasNext) {
+      bits.union(childIterator.next().treePatternBits)
+    }
+    // Propagate expressions' pattern bits
+    val exprIterator = expressions.iterator

Review comment:
       ditto




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to