From 30297e290db9bb0c970ccd4e247b1f1540d3af7b Mon Sep 17 00:00:00 2001 From: minhthai Date: Sun, 1 Jul 2018 08:41:20 +0800 Subject: [PATCH] Add column method 'unary_!' --- .../src/main/scala/frameless/TypedColumn.scala | 12 ++++++++++++ .../src/test/scala/frameless/ColumnTests.scala | 17 +++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/dataset/src/main/scala/frameless/TypedColumn.scala b/dataset/src/main/scala/frameless/TypedColumn.scala index d07af3160..2fd78050d 100644 --- a/dataset/src/main/scala/frameless/TypedColumn.scala +++ b/dataset/src/main/scala/frameless/TypedColumn.scala @@ -189,6 +189,18 @@ abstract class AbstractTypedColumn[T, U] def +(u: U)(implicit n: CatalystNumeric[U]): ThisType[T, U] = typed(self.untyped.plus(u)) + /** + * Inversion of boolean expression, i.e. NOT. + * {{{ + * // Select rows that are not active (isActive === false) + * df.filter( !df('isActive) ) + * }}} + * + * apache/spark + */ + def unary_!(implicit i0: U <:< Boolean): ThisType[T, Boolean] = + typed(!untyped) + /** Unary minus, i.e. negate the expression. * {{{ * // Select the amount column and negates all values. diff --git a/dataset/src/test/scala/frameless/ColumnTests.scala b/dataset/src/test/scala/frameless/ColumnTests.scala index 4f01bffe3..9854e508b 100644 --- a/dataset/src/test/scala/frameless/ColumnTests.scala +++ b/dataset/src/test/scala/frameless/ColumnTests.scala @@ -4,6 +4,7 @@ import java.time.Instant import org.scalacheck.Prop._ import org.scalacheck.{Arbitrary, Gen, Prop} +import org.scalatest.Matchers._ import shapeless.test.illTyped import scala.math.Ordering.Implicits._ @@ -357,4 +358,20 @@ class ColumnTests extends TypedDatasetSuite { check(forAll(prop[Vector[Vector[String]], Vector[Vector[BigDecimal]]] _)) } + test("unary_!") { + val ds = TypedDataset.create((true, false) :: Nil) + + val rs = ds.select(!ds('_1), !ds('_2)).collect().run().head + val expected = (false, true) + + rs shouldEqual expected + } + + test("unary_! with non-boolean columns should not compile") { + val ds = TypedDataset.create((1, "a", 2.0) :: Nil) + + "ds.select(!ds('_1))" shouldNot typeCheck + "ds.select(!ds('_2))" shouldNot typeCheck + "ds.select(!ds('_3))" shouldNot typeCheck + } }