spark-reviews mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From wzhfy <...@git.apache.org>
Subject [GitHub] spark pull request #12646: [SPARK-14878][SQL] Trim characters string functio...
Date Fri, 26 May 2017 07:50:04 GMT
Github user wzhfy commented on a diff in the pull request:

    https://github.com/apache/spark/pull/12646#discussion_r118629439
  
    --- Diff: sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringExpressions.scala
---
    @@ -461,68 +462,269 @@ case class FindInSet(left: Expression, right: Expression) extends
BinaryExpressi
     }
     
     /**
    - * A function that trim the spaces from both ends for the specified string.
    - */
    + * A function that takes a character string, removes the leading and/or trailing characters
matching with the characters
    + * in the trim string, returns the new string. If LEADING/TRAILING/BOTH and trimStr keywords
are not specified, it
    + * defaults to remove space character from both ends.
    + * trimStr: A character string to be trimmed from the source string, if it has multiple
characters, the function
    + * searches for each character in the source string, removes the characters from the
source string until it
    + * encounters the first non-match character.
    + * LEADING: removes any characters from the left end of the source string that matches
characters in the trim string.
    + * TRAILING: removes any characters from the right end of the source string that matches
characters in the trim string.
    + * BOTH: removes any characters from both ends of the source string that matches characters
in the trim string.
    +  */
     @ExpressionDescription(
    -  usage = "_FUNC_(str) - Removes the leading and trailing space characters from `str`.",
    +  usage = """
    +    _FUNC_(str) - Removes the leading and trailing space characters from `str`.
    +    _FUNC_(BOTH trimStr FROM str) - Remove the leading and trailing trimString from `str`
    +    _FUNC_(LEADING trimStr FROM str) - Remove the leading trimString from `str`
    +    _FUNC_(TRAILING trimStr FROM str) - Remove the trailing trimString from `str`
    +  """,
       extended = """
    +    Arguments:
    +      str - a string expression
    +      trimString - the trim string
    +      BOTH, FROM - these are keyword to specify for trim string from both ends of the
string
    +      LEADING, FROM - these are keyword to specify for trim string from left end of the
string
    +      TRAILING, FROM - these are keyword to specify for trim string from right end of
the string
         Examples:
           > SELECT _FUNC_('    SparkSQL   ');
            SparkSQL
    +      > SELECT _FUNC_(BOTH 'SL' FROM 'SSparkSQLS');
    +       parkSQ
    +      > SELECT _FUNC_(LEADING 'paS' FROM 'SSparkSQLS');
    +       rkSQLS
    +      > SELECT _FUNC_(TRAILING 'SLQ' FROM 'SSparkSQLS');
    +       SSparkS
       """)
    -case class StringTrim(child: Expression)
    -  extends UnaryExpression with String2StringExpression {
    +case class StringTrim(children: Seq[Expression])
    +  extends Expression with ImplicitCastInputTypes {
    +
    +  require(children.size <= 2 && children.nonEmpty,
    +    s"$prettyName requires at least one argument and no more than two.")
    +
    +  override def dataType: DataType = StringType
    +  override def inputTypes: Seq[AbstractDataType] = Seq.fill(children.size)(StringType)
     
    -  def convert(v: UTF8String): UTF8String = v.trim()
    +  override def nullable: Boolean = children.exists(_.nullable)
    +  override def foldable: Boolean = children.forall(_.foldable)
     
       override def prettyName: String = "trim"
     
    +  // trim function can take one or two arguments.
    +  // For one argument(children size is 1), it is the trim space function.
    +  // For two arguments(children size is 2), it is the trim function with one of these
options: BOTH/LEADING/TRAILING.
    +  override def eval(input: InternalRow): Any = {
    +    val inputs = children.map(_.eval(input).asInstanceOf[UTF8String])
    +    if (inputs(0) != null) {
    +      if (children.size == 1) {
    +        return inputs(0).trim()
    +      } else if (inputs(1) != null) {
    +        return inputs(1).trim(inputs(0))
    +      }
    +    }
    +    null
    +  }
    +
       override def doGenCode(ctx: CodegenContext, ev: ExprCode): ExprCode = {
    -    defineCodeGen(ctx, ev, c => s"($c).trim()")
    +    if (children.size == 2 && !children(0).isInstanceOf[Literal]) {
    +      throw new AnalysisException(s"The trimming parameter should be Literal.")}
    +
    +    val evals = children.map(_.genCode(ctx))
    +    val inputs = evals.map { eval =>
    +      s"${eval.isNull} ? null : ${eval.value}"
    +    }
    +    val getTrimFunction = if (children.size == 1) {
    +      s"UTF8String ${ev.value} = ${inputs(0)}.trim();"
    +    } else {
    +      s"UTF8String ${ev.value} = ${inputs(1)}.trim(${inputs(0)});".stripMargin
    +    }
    +    ev.copy(evals.map(_.code).mkString("\n") + s"""
    +      boolean ${ev.isNull} = false;
    +      ${getTrimFunction};
    +      if (${ev.value} == null) {
    +        ${ev.isNull} = true;
    +      }
    +    """)
    +    }
    --- End diff --
    
    wrong indent


---
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 infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

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


Mime
View raw message