aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReynold Xin <rxin@databricks.com>2015-11-05 13:34:36 -0800
committerReynold Xin <rxin@databricks.com>2015-11-05 13:34:36 -0800
commit8a5314efd19fb8f8a194a373fd994b954cc1fd47 (patch)
tree789df0d7752c02613f6685c811672131132bc59b
parent14ee0f5726f96e2c4c28ac328d43fd85a0630b48 (diff)
downloadspark-8a5314efd19fb8f8a194a373fd994b954cc1fd47.tar.gz
spark-8a5314efd19fb8f8a194a373fd994b954cc1fd47.tar.bz2
spark-8a5314efd19fb8f8a194a373fd994b954cc1fd47.zip
[SPARK-11532][SQL] Remove implicit conversion from Expression to Column
Author: Reynold Xin <rxin@databricks.com> Closes #9500 from rxin/SPARK-11532.
-rw-r--r--sql/core/src/main/scala/org/apache/spark/sql/Column.scala118
1 files changed, 66 insertions, 52 deletions
diff --git a/sql/core/src/main/scala/org/apache/spark/sql/Column.scala b/sql/core/src/main/scala/org/apache/spark/sql/Column.scala
index c73f696962..c32c93897c 100644
--- a/sql/core/src/main/scala/org/apache/spark/sql/Column.scala
+++ b/sql/core/src/main/scala/org/apache/spark/sql/Column.scala
@@ -68,7 +68,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
})
/** Creates a column based on the given expression. */
- implicit private def exprToColumn(newExpr: Expression): Column = new Column(newExpr)
+ private def withExpr(newExpr: Expression): Column = new Column(newExpr)
override def toString: String = expr.prettyString
@@ -99,7 +99,9 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.4.0
*/
- def apply(extraction: Any): Column = UnresolvedExtractValue(expr, lit(extraction).expr)
+ def apply(extraction: Any): Column = withExpr {
+ UnresolvedExtractValue(expr, lit(extraction).expr)
+ }
/**
* Unary minus, i.e. negate the expression.
@@ -115,7 +117,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def unary_- : Column = UnaryMinus(expr)
+ def unary_- : Column = withExpr { UnaryMinus(expr) }
/**
* Inversion of boolean expression, i.e. NOT.
@@ -131,7 +133,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def unary_! : Column = Not(expr)
+ def unary_! : Column = withExpr { Not(expr) }
/**
* Equality test.
@@ -147,7 +149,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def === (other: Any): Column = {
+ def === (other: Any): Column = withExpr {
val right = lit(other).expr
if (this.expr == right) {
logWarning(
@@ -188,7 +190,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def !== (other: Any): Column = Not(EqualTo(expr, lit(other).expr))
+ def !== (other: Any): Column = withExpr{ Not(EqualTo(expr, lit(other).expr)) }
/**
* Inequality test.
@@ -205,7 +207,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group java_expr_ops
* @since 1.3.0
*/
- def notEqual(other: Any): Column = Not(EqualTo(expr, lit(other).expr))
+ def notEqual(other: Any): Column = withExpr { Not(EqualTo(expr, lit(other).expr)) }
/**
* Greater than.
@@ -221,7 +223,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def > (other: Any): Column = GreaterThan(expr, lit(other).expr)
+ def > (other: Any): Column = withExpr { GreaterThan(expr, lit(other).expr) }
/**
* Greater than.
@@ -252,7 +254,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def < (other: Any): Column = LessThan(expr, lit(other).expr)
+ def < (other: Any): Column = withExpr { LessThan(expr, lit(other).expr) }
/**
* Less than.
@@ -282,7 +284,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def <= (other: Any): Column = LessThanOrEqual(expr, lit(other).expr)
+ def <= (other: Any): Column = withExpr { LessThanOrEqual(expr, lit(other).expr) }
/**
* Less than or equal to.
@@ -312,7 +314,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def >= (other: Any): Column = GreaterThanOrEqual(expr, lit(other).expr)
+ def >= (other: Any): Column = withExpr { GreaterThanOrEqual(expr, lit(other).expr) }
/**
* Greater than or equal to an expression.
@@ -335,7 +337,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def <=> (other: Any): Column = EqualNullSafe(expr, lit(other).expr)
+ def <=> (other: Any): Column = withExpr { EqualNullSafe(expr, lit(other).expr) }
/**
* Equality test that is safe for null values.
@@ -368,7 +370,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
*/
def when(condition: Column, value: Any): Column = this.expr match {
case CaseWhen(branches: Seq[Expression]) =>
- CaseWhen(branches ++ Seq(lit(condition).expr, lit(value).expr))
+ withExpr { CaseWhen(branches ++ Seq(lit(condition).expr, lit(value).expr)) }
case _ =>
throw new IllegalArgumentException(
"when() can only be applied on a Column previously generated by when() function")
@@ -398,7 +400,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
def otherwise(value: Any): Column = this.expr match {
case CaseWhen(branches: Seq[Expression]) =>
if (branches.size % 2 == 0) {
- CaseWhen(branches :+ lit(value).expr)
+ withExpr { CaseWhen(branches :+ lit(value).expr) }
} else {
throw new IllegalArgumentException(
"otherwise() can only be applied once on a Column previously generated by when()")
@@ -424,7 +426,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.5.0
*/
- def isNaN: Column = IsNaN(expr)
+ def isNaN: Column = withExpr { IsNaN(expr) }
/**
* True if the current expression is null.
@@ -432,7 +434,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def isNull: Column = IsNull(expr)
+ def isNull: Column = withExpr { IsNull(expr) }
/**
* True if the current expression is NOT null.
@@ -440,7 +442,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def isNotNull: Column = IsNotNull(expr)
+ def isNotNull: Column = withExpr { IsNotNull(expr) }
/**
* Boolean OR.
@@ -455,7 +457,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def || (other: Any): Column = Or(expr, lit(other).expr)
+ def || (other: Any): Column = withExpr { Or(expr, lit(other).expr) }
/**
* Boolean OR.
@@ -485,7 +487,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def && (other: Any): Column = And(expr, lit(other).expr)
+ def && (other: Any): Column = withExpr { And(expr, lit(other).expr) }
/**
* Boolean AND.
@@ -515,7 +517,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def + (other: Any): Column = Add(expr, lit(other).expr)
+ def + (other: Any): Column = withExpr { Add(expr, lit(other).expr) }
/**
* Sum of this expression and another expression.
@@ -545,7 +547,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def - (other: Any): Column = Subtract(expr, lit(other).expr)
+ def - (other: Any): Column = withExpr { Subtract(expr, lit(other).expr) }
/**
* Subtraction. Subtract the other expression from this expression.
@@ -575,7 +577,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def * (other: Any): Column = Multiply(expr, lit(other).expr)
+ def * (other: Any): Column = withExpr { Multiply(expr, lit(other).expr) }
/**
* Multiplication of this expression and another expression.
@@ -605,7 +607,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def / (other: Any): Column = Divide(expr, lit(other).expr)
+ def / (other: Any): Column = withExpr { Divide(expr, lit(other).expr) }
/**
* Division this expression by another expression.
@@ -628,7 +630,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def % (other: Any): Column = Remainder(expr, lit(other).expr)
+ def % (other: Any): Column = withExpr { Remainder(expr, lit(other).expr) }
/**
* Modulo (a.k.a. remainder) expression.
@@ -657,7 +659,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @since 1.5.0
*/
@scala.annotation.varargs
- def isin(list: Any*): Column = In(expr, list.map(lit(_).expr))
+ def isin(list: Any*): Column = withExpr { In(expr, list.map(lit(_).expr)) }
/**
* SQL like expression.
@@ -665,7 +667,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def like(literal: String): Column = Like(expr, lit(literal).expr)
+ def like(literal: String): Column = withExpr { Like(expr, lit(literal).expr) }
/**
* SQL RLIKE expression (LIKE with Regex).
@@ -673,7 +675,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def rlike(literal: String): Column = RLike(expr, lit(literal).expr)
+ def rlike(literal: String): Column = withExpr { RLike(expr, lit(literal).expr) }
/**
* An expression that gets an item at position `ordinal` out of an array,
@@ -682,7 +684,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def getItem(key: Any): Column = UnresolvedExtractValue(expr, Literal(key))
+ def getItem(key: Any): Column = withExpr { UnresolvedExtractValue(expr, Literal(key)) }
/**
* An expression that gets a field by name in a [[StructType]].
@@ -690,7 +692,9 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def getField(fieldName: String): Column = UnresolvedExtractValue(expr, Literal(fieldName))
+ def getField(fieldName: String): Column = withExpr {
+ UnresolvedExtractValue(expr, Literal(fieldName))
+ }
/**
* An expression that returns a substring.
@@ -700,7 +704,9 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def substr(startPos: Column, len: Column): Column = Substring(expr, startPos.expr, len.expr)
+ def substr(startPos: Column, len: Column): Column = withExpr {
+ Substring(expr, startPos.expr, len.expr)
+ }
/**
* An expression that returns a substring.
@@ -710,7 +716,9 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def substr(startPos: Int, len: Int): Column = Substring(expr, lit(startPos).expr, lit(len).expr)
+ def substr(startPos: Int, len: Int): Column = withExpr {
+ Substring(expr, lit(startPos).expr, lit(len).expr)
+ }
/**
* Contains the other element.
@@ -718,7 +726,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def contains(other: Any): Column = Contains(expr, lit(other).expr)
+ def contains(other: Any): Column = withExpr { Contains(expr, lit(other).expr) }
/**
* String starts with.
@@ -726,7 +734,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def startsWith(other: Column): Column = StartsWith(expr, lit(other).expr)
+ def startsWith(other: Column): Column = withExpr { StartsWith(expr, lit(other).expr) }
/**
* String starts with another string literal.
@@ -742,7 +750,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def endsWith(other: Column): Column = EndsWith(expr, lit(other).expr)
+ def endsWith(other: Column): Column = withExpr { EndsWith(expr, lit(other).expr) }
/**
* String ends with another string literal.
@@ -777,9 +785,11 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def as(alias: String): Column = expr match {
- case ne: NamedExpression => Alias(expr, alias)(explicitMetadata = Some(ne.metadata))
- case other => Alias(other, alias)()
+ def as(alias: String): Column = withExpr {
+ expr match {
+ case ne: NamedExpression => Alias(expr, alias)(explicitMetadata = Some(ne.metadata))
+ case other => Alias(other, alias)()
+ }
}
/**
@@ -792,7 +802,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.4.0
*/
- def as(aliases: Seq[String]): Column = MultiAlias(expr, aliases)
+ def as(aliases: Seq[String]): Column = withExpr { MultiAlias(expr, aliases) }
/**
* Assigns the given aliases to the results of a table generating function.
@@ -804,7 +814,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.4.0
*/
- def as(aliases: Array[String]): Column = MultiAlias(expr, aliases)
+ def as(aliases: Array[String]): Column = withExpr { MultiAlias(expr, aliases) }
/**
* Gives the column an alias.
@@ -819,9 +829,11 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def as(alias: Symbol): Column = expr match {
- case ne: NamedExpression => Alias(expr, alias.name)(explicitMetadata = Some(ne.metadata))
- case other => Alias(other, alias.name)()
+ def as(alias: Symbol): Column = withExpr {
+ expr match {
+ case ne: NamedExpression => Alias(expr, alias.name)(explicitMetadata = Some(ne.metadata))
+ case other => Alias(other, alias.name)()
+ }
}
/**
@@ -834,7 +846,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def as(alias: String, metadata: Metadata): Column = {
+ def as(alias: String, metadata: Metadata): Column = withExpr {
Alias(expr, alias)(explicitMetadata = Some(metadata))
}
@@ -852,10 +864,12 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def cast(to: DataType): Column = expr match {
- // keeps the name of expression if possible when do cast.
- case ne: NamedExpression => UnresolvedAlias(Cast(expr, to))
- case _ => Cast(expr, to)
+ def cast(to: DataType): Column = withExpr {
+ expr match {
+ // keeps the name of expression if possible when do cast.
+ case ne: NamedExpression => UnresolvedAlias(Cast(expr, to))
+ case _ => Cast(expr, to)
+ }
}
/**
@@ -885,7 +899,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def desc: Column = SortOrder(expr, Descending)
+ def desc: Column = withExpr { SortOrder(expr, Descending) }
/**
* Returns an ordering used in sorting.
@@ -900,7 +914,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.3.0
*/
- def asc: Column = SortOrder(expr, Ascending)
+ def asc: Column = withExpr { SortOrder(expr, Ascending) }
/**
* Prints the expression to the console for debugging purpose.
@@ -927,7 +941,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.4.0
*/
- def bitwiseOR(other: Any): Column = BitwiseOr(expr, lit(other).expr)
+ def bitwiseOR(other: Any): Column = withExpr { BitwiseOr(expr, lit(other).expr) }
/**
* Compute bitwise AND of this expression with another expression.
@@ -938,7 +952,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.4.0
*/
- def bitwiseAND(other: Any): Column = BitwiseAnd(expr, lit(other).expr)
+ def bitwiseAND(other: Any): Column = withExpr { BitwiseAnd(expr, lit(other).expr) }
/**
* Compute bitwise XOR of this expression with another expression.
@@ -949,7 +963,7 @@ class Column(protected[sql] val expr: Expression) extends Logging {
* @group expr_ops
* @since 1.4.0
*/
- def bitwiseXOR(other: Any): Column = BitwiseXor(expr, lit(other).expr)
+ def bitwiseXOR(other: Any): Column = withExpr { BitwiseXor(expr, lit(other).expr) }
/**
* Define a windowing column.