Skip to content

Instantly share code, notes, and snippets.

@dbtsai
Created August 6, 2019 21:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dbtsai/555047510475153fe26a42832cfbecdf to your computer and use it in GitHub Desktop.
Save dbtsai/555047510475153fe26a42832cfbecdf to your computer and use it in GitHub Desktop.
package org.apache.spark.sql.sources.v2
import org.apache.spark.annotation.Experimental
import org.apache.spark.sql.catalog.v2.expressions.NamedReference
/**
* A filter that evaluates to `true` iff the field evaluates to a value
* equal to `value`.
*
* @since 3.0.0
*/
@Experimental
case class EqualTo(field: NamedReference, value: Any) extends Filter {
override def references: Array[NamedReference] = Array(field) ++ findReferences(value)
}
/**
* Performs equality comparison, similar to [[EqualTo]]. However, this differs from [[EqualTo]]
* in that it returns `true` (rather than NULL) if both inputs are NULL, and `false`
* (rather than NULL) if one of the input is NULL and the other is not NULL.
*
* @since 3.0.0
*/
@Experimental
case class EqualNullSafe(field: NamedReference, value: Any) extends Filter {
override def references: Array[NamedReference] = Array(field) ++ findReferences(value)
}
/**
* A filter that evaluates to `true` iff the field evaluates to a value
* greater than `value`.
*
* @since 3.0.0
*/
@Experimental
case class GreaterThan(field: NamedReference, value: Any) extends Filter {
override def references: Array[NamedReference] = Array(field) ++ findReferences(value)
}
/**
* A filter that evaluates to `true` iff the field evaluates to a value
* greater than or equal to `value`.
*
* @since 3.0.0
*/
@Experimental
case class GreaterThanOrEqual(field: NamedReference, value: Any) extends Filter {
override def references: Array[NamedReference] = Array(field) ++ findReferences(value)
}
/**
* A filter that evaluates to `true` iff the field evaluates to a value
* less than `value`.
*
* @since 3.0.0
*/
@Experimental
case class LessThan(field: NamedReference, value: Any) extends Filter {
override def references: Array[NamedReference] = Array(field) ++ findReferences(value)
}
/**
* A filter that evaluates to `true` iff the field evaluates to a value
* less than or equal to `value`.
*
* @since 3.0.0
*/
@Experimental
case class LessThanOrEqual(field: NamedReference, value: Any) extends Filter {
override def references: Array[NamedReference] = Array(field) ++ findReferences(value)
}
/**
* A filter that evaluates to `true` iff the field evaluates to one of the values in the array.
*
* @since 3.0.0
*/
@Experimental
case class In(field: NamedReference, values: Array[Any]) extends Filter {
override def hashCode(): Int = {
var h = field.hashCode
values.foreach { v =>
h *= 41
h += v.hashCode()
}
h
}
override def equals(o: Any): Boolean = o match {
case In(a, vs) =>
a == field && vs.length == values.length && vs.zip(values).forall(x => x._1 == x._2)
case _ => false
}
override def toString: String = {
s"In($field, [${values.mkString(",")}])"
}
override def references: Array[NamedReference] = Array(field) ++ values.flatMap(findReferences)
}
/**
* A filter that evaluates to `true` iff the field evaluates to null.
*
* @since 3.0.0
*/
@Experimental
case class IsNull(field: NamedReference) extends Filter {
override def references: Array[NamedReference] = Array(field)
}
/**
* A filter that evaluates to `true` iff the field evaluates to a non-null value.
*
* @since 3.0.0
*/
@Experimental
case class IsNotNull(field: NamedReference) extends Filter {
override def references: Array[NamedReference] = Array(field)
}
/**
* A filter that evaluates to `true` iff both `left` or `right` evaluate to `true`.
*
* @since 3.0.0
*/
@Experimental
case class And(left: Filter, right: Filter) extends Filter {
override def references: Array[NamedReference] = left.references ++ right.references
}
/**
* A filter that evaluates to `true` iff at least one of `left` or `right` evaluates to `true`.
*
* @since 3.0.0
*/
@Experimental
case class Or(left: Filter, right: Filter) extends Filter {
override def references: Array[NamedReference] = left.references ++ right.references
}
/**
* A filter that evaluates to `true` iff `child` is evaluated to `false`.
*
* @since 3.0.0
*/
@Experimental
case class Not(child: Filter) extends Filter {
override def references: Array[NamedReference] = child.references()
}
/**
* A filter that evaluates to `true` iff the field evaluates to
* a string that starts with `value`.
*
* @since 3.0.0
*/
@Experimental
case class StringStartsWith(field: NamedReference, value: String) extends Filter {
override def references: Array[NamedReference] = Array(field)
}
/**
* A filter that evaluates to `true` iff the field evaluates to
* a string that ends with `value`.
*
* @since 3.0.0
*/
@Experimental
case class StringEndsWith(field: NamedReference, value: String) extends Filter {
override def references: Array[NamedReference] = Array(field)
}
/**
* A filter that evaluates to `true` iff the field evaluates to
* a string that contains the string `value`.
*
* @since 3.0.0
*/
@Experimental
case class StringContains(field: NamedReference, value: String) extends Filter {
override def references: Array[NamedReference] = Array(field)
}
/**
* A filter that always evaluates to `true`.
*/
@Experimental
case class AlwaysTrue() extends Filter {
override def references: Array[NamedReference] = Array.empty
}
@Experimental
object AlwaysTrue extends AlwaysTrue {
}
/**
* A filter that always evaluates to `false`.
*/
@Experimental
case class AlwaysFalse() extends Filter {
override def references: Array[NamedReference] = Array.empty
}
@Experimental
object AlwaysFalse extends AlwaysFalse {
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment