From 46d7e43fca0c2503c02c23b2493354dbda43bced Mon Sep 17 00:00:00 2001 From: Wes McKinney Date: Wed, 7 Oct 2015 20:52:23 -0700 Subject: [PATCH] ENH: add coalesce instance method as convenience. Close #664 --- ibis/expr/api.py | 1 + ibis/expr/tests/test_sql_builtins.py | 24 +++++++++++++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/ibis/expr/api.py b/ibis/expr/api.py index 7f5cd6191659..06c4b2229d13 100644 --- a/ibis/expr/api.py +++ b/ibis/expr/api.py @@ -670,6 +670,7 @@ def notin(arg, values): _generic_value_methods = dict( hash=hash, cast=cast, + coalesce=coalesce, typeof=typeof, fillna=fillna, nullif=nullif, diff --git a/ibis/expr/tests/test_sql_builtins.py b/ibis/expr/tests/test_sql_builtins.py index 6c59c79be7ee..0dc547f69240 100644 --- a/ibis/expr/tests/test_sql_builtins.py +++ b/ibis/expr/tests/test_sql_builtins.py @@ -14,9 +14,10 @@ from ibis.expr.tests.mocks import MockConnection from ibis.compat import unittest -import ibis.expr.api as api +from ibis.tests.util import assert_equal import ibis.expr.operations as ops import ibis.expr.types as ir +import ibis class TestBuiltins(unittest.TestCase): @@ -83,8 +84,8 @@ def test_ceil_floor(self): assert type(cresult.op()) == ops.Ceil assert type(fresult.op()) == ops.Floor - cresult = api.literal(1.2345).ceil() - fresult = api.literal(1.2345).floor() + cresult = ibis.literal(1.2345).ceil() + fresult = ibis.literal(1.2345).floor() assert isinstance(cresult, ir.Int64Scalar) assert isinstance(fresult, ir.Int64Scalar) @@ -102,7 +103,7 @@ def test_sign(self): assert isinstance(result, ir.FloatArray) assert type(result.op()) == ops.Sign - result = api.literal(1.2345).sign() + result = ibis.literal(1.2345).sign() assert isinstance(result, ir.FloatScalar) dec_col = self.lineitem.l_extendedprice @@ -130,7 +131,7 @@ def test_round(self): result = dec.round(2) assert isinstance(result, ir.DecimalArray) - result = api.literal(1.2345).round() + result = ibis.literal(1.2345).round() assert isinstance(result, ir.Int64Scalar) def _check_unary_op(self, expr, fname, ex_op, ex_type): @@ -142,7 +143,7 @@ def _check_unary_op(self, expr, fname, ex_op, ex_type): class TestCoalesceLikeFunctions(unittest.TestCase): def setUp(self): - self.table = api.table([ + self.table = ibis.table([ ('v1', 'decimal(12, 2)'), ('v2', 'decimal(10, 4)'), ('v3', 'int32'), @@ -153,7 +154,16 @@ def setUp(self): ('v8', 'boolean') ], 'testing') - self.functions = [api.coalesce, api.greatest, api.least] + self.functions = [ibis.coalesce, ibis.greatest, ibis.least] + + def test_coalesce_instance_method(self): + v7 = self.table.v7 + v5 = self.table.v5.cast('string') + v8 = self.table.v8.cast('string') + + result = v7.coalesce(v5, v8, 'foo') + expected = ibis.coalesce(v7, v5, v8, 'foo') + assert_equal(result, expected) def test_integer_promotions(self): t = self.table