Skip to content
Snippets Groups Projects
Commit b14fc391 authored by Reynold Xin's avatar Reynold Xin
Browse files

[SPARK-18869][SQL] Add TreeNode.p that returns BaseType


## What changes were proposed in this pull request?
After the bug fix in SPARK-18854, TreeNode.apply now returns TreeNode[_] rather than a more specific type. It would be easier for interactive debugging to introduce a function that returns the BaseType.

## How was this patch tested?
N/A - this is a developer only feature used for interactive debugging. As long as it compiles, it should be good to go. I tested this in spark-shell.

Author: Reynold Xin <rxin@databricks.com>

Closes #16288 from rxin/SPARK-18869.

(cherry picked from commit 5d510c69)
Signed-off-by: default avatarReynold Xin <rxin@databricks.com>
parent cb2c8428
No related branches found
No related tags found
No related merge requests found
...@@ -24,15 +24,6 @@ import org.apache.spark.sql.types.{DataType, StructType} ...@@ -24,15 +24,6 @@ import org.apache.spark.sql.types.{DataType, StructType}
abstract class QueryPlan[PlanType <: QueryPlan[PlanType]] extends TreeNode[PlanType] { abstract class QueryPlan[PlanType <: QueryPlan[PlanType]] extends TreeNode[PlanType] {
self: PlanType => self: PlanType =>
/**
* Override [[TreeNode.apply]] to so we can return a more narrow type.
*
* Note that this cannot return BaseType because logical plan's plan node might return
* physical plan for innerChildren, e.g. in-memory relation logical plan node has a reference
* to the physical plan node it is referencing.
*/
override def apply(number: Int): QueryPlan[_] = super.apply(number).asInstanceOf[QueryPlan[_]]
def output: Seq[Attribute] def output: Seq[Attribute]
/** /**
......
...@@ -498,7 +498,7 @@ abstract class TreeNode[BaseType <: TreeNode[BaseType]] extends Product { ...@@ -498,7 +498,7 @@ abstract class TreeNode[BaseType <: TreeNode[BaseType]] extends Product {
treeString.split("\n").zipWithIndex.map { case (line, i) => f"$i%02d $line" }.mkString("\n") treeString.split("\n").zipWithIndex.map { case (line, i) => f"$i%02d $line" }.mkString("\n")
/** /**
* Returns the tree node at the specified number. * Returns the tree node at the specified number, used primarily for interactive debugging.
* Numbers for each node can be found in the [[numberedTreeString]]. * Numbers for each node can be found in the [[numberedTreeString]].
* *
* Note that this cannot return BaseType because logical plan's plan node might return * Note that this cannot return BaseType because logical plan's plan node might return
...@@ -507,6 +507,14 @@ abstract class TreeNode[BaseType <: TreeNode[BaseType]] extends Product { ...@@ -507,6 +507,14 @@ abstract class TreeNode[BaseType <: TreeNode[BaseType]] extends Product {
*/ */
def apply(number: Int): TreeNode[_] = getNodeNumbered(new MutableInt(number)).orNull def apply(number: Int): TreeNode[_] = getNodeNumbered(new MutableInt(number)).orNull
/**
* Returns the tree node at the specified number, used primarily for interactive debugging.
* Numbers for each node can be found in the [[numberedTreeString]].
*
* This is a variant of [[apply]] that returns the node as BaseType (if the type matches).
*/
def p(number: Int): BaseType = apply(number).asInstanceOf[BaseType]
private def getNodeNumbered(number: MutableInt): Option[TreeNode[_]] = { private def getNodeNumbered(number: MutableInt): Option[TreeNode[_]] = {
if (number.i < 0) { if (number.i < 0) {
None None
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment