in integration/spark/src/main/scala/org/apache/spark/sql/optimizer/CarbonFilters.scala [75:166]
protected[sql] def translateExpression(
relation: CarbonDatasourceHadoopRelation,
predicate: SparkExpression,
columnTypes: Map[String, SparkDataType],
isOr: Boolean = false): Option[Expression] = {
predicate match {
case u: ScalaUDF =>
translateUDF(u.children, u.function, relation)
case Or(left, right) =>
translateOr(left, right, relation, columnTypes)
case And(left, right) =>
translateAnd(left, right, relation, columnTypes, isOr)
case EqualTo(a: Attribute, Literal(v, _)) =>
translateEqualTo(a.name, v, columnTypes)
case EqualTo(Literal(v, _), a: Attribute) =>
translateEqualTo(a.name, v, columnTypes)
case c@EqualTo(Cast(_: Attribute, _, _), _: Literal) =>
CastExpressionOptimization.checkIfCastCanBeRemove(c)
case c@EqualTo(_: Literal, Cast(_: Attribute, _, _)) =>
CastExpressionOptimization.checkIfCastCanBeRemove(c)
case Not(EqualTo(a: Attribute, Literal(v, _))) =>
translateNotEqualTo(a.name, v, columnTypes)
case Not(EqualTo(Literal(v, _), a: Attribute)) =>
translateNotEqualTo(a.name, v, columnTypes)
case c@Not(EqualTo(Cast(_: Attribute, _, _), _: Literal)) =>
CastExpressionOptimization.checkIfCastCanBeRemove(c)
case c@Not(EqualTo(_: Literal, Cast(_: Attribute, _, _))) =>
CastExpressionOptimization.checkIfCastCanBeRemove(c)
case IsNotNull(a: Attribute) =>
translateNotEqualTo(a.name, null, columnTypes, true)
case IsNull(a: Attribute) =>
translateEqualTo(a.name, null, columnTypes, true)
case Not(In(a: Attribute, list)) if list.forall(_.isInstanceOf[Literal]) =>
translateNotIn(a.name, list.map(e => e.eval(EmptyRow)), columnTypes)
case In(a: Attribute, list) if list.forall(_.isInstanceOf[Literal]) =>
translateIn(a.name, list.map(e => e.eval(EmptyRow)), columnTypes)
case c@Not(In(Cast(_: Attribute, _, _), list)) if list.forall(_.isInstanceOf[Literal]) =>
Some(transformExpression(c))
case c@In(Cast(_: Attribute, _, _), list) if list.forall(_.isInstanceOf[Literal]) =>
Some(transformExpression(c))
case InSet(a: Attribute, set) =>
translateIn(a.name, set.toSeq, columnTypes)
case Not(InSet(a: Attribute, set)) =>
translateNotIn(a.name, set.toSeq, columnTypes)
case GreaterThan(a: Attribute, Literal(v, _)) =>
translateGreaterThan(a.name, v, columnTypes)
case GreaterThan(Literal(v, _), a: Attribute) =>
translateLessThan(a.name, v, columnTypes)
case c@GreaterThan(Cast(_: Attribute, _, _), _: Literal) =>
CastExpressionOptimization.checkIfCastCanBeRemove(c)
case c@GreaterThan(_: Literal, Cast(_: Attribute, _, _)) =>
CastExpressionOptimization.checkIfCastCanBeRemove(c)
case LessThan(a: Attribute, Literal(v, _)) =>
translateLessThan(a.name, v, columnTypes)
case LessThan(Literal(v, _), a: Attribute) =>
translateGreaterThan(a.name, v, columnTypes)
case c@LessThan(Cast(_: Attribute, _, _), _: Literal) =>
CastExpressionOptimization.checkIfCastCanBeRemove(c)
case c@LessThan(_: Literal, Cast(_: Attribute, _, _)) =>
CastExpressionOptimization.checkIfCastCanBeRemove(c)
case GreaterThanOrEqual(a: Attribute, Literal(v, _)) =>
translateGreaterThanEqual(a.name, v, columnTypes)
case GreaterThanOrEqual(Literal(v, _), a: Attribute) =>
translateLessThanEqual(a.name, v, columnTypes)
case c@GreaterThanOrEqual(Cast(_: Attribute, _, _), _: Literal) =>
CastExpressionOptimization.checkIfCastCanBeRemove(c)
case c@GreaterThanOrEqual(_: Literal, Cast(_: Attribute, _, _)) =>
CastExpressionOptimization.checkIfCastCanBeRemove(c)
case LessThanOrEqual(a: Attribute, Literal(v, _)) =>
translateLessThanEqual(a.name, v, columnTypes)
case LessThanOrEqual(Literal(v, _), a: Attribute) =>
translateGreaterThanEqual(a.name, v, columnTypes)
case c@LessThanOrEqual(Cast(_: Attribute, _, _), Literal(v, t)) =>
CastExpressionOptimization.checkIfCastCanBeRemove(c)
case c@LessThanOrEqual(_: Literal, Cast(_: Attribute, _, _)) =>
CastExpressionOptimization.checkIfCastCanBeRemove(c)
case StartsWith(a: Attribute, Literal(v, _)) if v.toString.nonEmpty =>
translateStartsWith(a.name, v, columnTypes)
case c@EndsWith(_: Attribute, _: Literal) =>
Some(getSparkUnknownExpression(c, ExpressionType.ENDSWITH))
case c@Contains(_: Attribute, _: Literal) =>
Some(getSparkUnknownExpression(c, ExpressionType.CONTAINSWITH))
case Literal(v, _) if v == null =>
Some(new FalseExpression(null))
case ArrayContains(a: Attribute, Literal(v, _)) =>
translateArrayContains(a, v, columnTypes)
case ac@ArrayContains(Cast(_: Attribute, _, _), _: Literal) =>
CastExpressionOptimization.checkIfCastCanBeRemove(EqualTo(ac.left, ac.right))
case _ => None
}
}