Skip to content

Commit 260facd

Browse files
krzysztof-kwittcpcloud
authored andcommitted
fix(snowflake): bring back bitwise operations
1 parent f65a908 commit 260facd

File tree

3 files changed

+104
-110
lines changed

3 files changed

+104
-110
lines changed

ibis/backends/snowflake/registry.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -187,13 +187,6 @@ def _extract_url_query(t, op):
187187
ops.NotExistsSubquery,
188188
# ibis.expr.operations.maps
189189
ops.MapKeys,
190-
# ibis.expr.operations.numeric
191-
ops.BitwiseAnd,
192-
ops.BitwiseLeftShift,
193-
ops.BitwiseNot,
194-
ops.BitwiseOr,
195-
ops.BitwiseRightShift,
196-
ops.BitwiseXor,
197190
# ibis.expr.operations.reductions
198191
ops.All,
199192
ops.Any,

ibis/backends/tests/test_generic.py

Lines changed: 1 addition & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import decimal
22
import io
33
from contextlib import redirect_stdout
4-
from operator import and_, invert, lshift, neg, or_, rshift, xor
4+
from operator import invert, neg
55

66
import numpy as np
77
import pandas as pd
@@ -699,108 +699,6 @@ def test_select_filter_select(backend, alltypes, df):
699699
backend.assert_series_equal(result, expected)
700700

701701

702-
pyspark_no_bitshift = pytest.mark.notyet(
703-
["pyspark"], reason="pyspark doesn't implement bitshit operators"
704-
)
705-
706-
707-
@pytest.mark.parametrize("op", [and_, or_, xor])
708-
@pytest.mark.parametrize(
709-
("left_fn", "right_fn"),
710-
[
711-
param(lambda t: t.int_col, lambda t: t.int_col, id="col_col"),
712-
param(lambda _: 3, lambda t: t.int_col, id="scalar_col"),
713-
param(lambda t: t.int_col, lambda _: 3, id="col_scalar"),
714-
],
715-
)
716-
@pytest.mark.notimpl(["bigquery", "dask", "datafusion", "pandas", "snowflake"])
717-
def test_bitwise_columns(backend, con, alltypes, df, op, left_fn, right_fn):
718-
expr = op(left_fn(alltypes), right_fn(alltypes)).name("tmp")
719-
result = con.execute(expr)
720-
721-
expected = op(left_fn(df), right_fn(df)).rename("tmp")
722-
backend.assert_series_equal(result, expected)
723-
724-
725-
@pytest.mark.parametrize(
726-
("op", "left_fn", "right_fn"),
727-
[
728-
param(
729-
lshift,
730-
lambda t: t.int_col,
731-
lambda t: t.int_col,
732-
id="lshift_col_col",
733-
),
734-
param(
735-
lshift,
736-
lambda _: 3,
737-
lambda t: t.int_col,
738-
marks=pytest.mark.broken(
739-
["impala"],
740-
reason="impala's behavior differs from every other backend",
741-
),
742-
id="lshift_scalar_col",
743-
),
744-
param(lshift, lambda t: t.int_col, lambda _: 3, id="lshift_col_scalar"),
745-
param(rshift, lambda t: t.int_col, lambda t: t.int_col, id="rshift_col_col"),
746-
param(rshift, lambda _: 3, lambda t: t.int_col, id="rshift_scalar_col"),
747-
param(rshift, lambda t: t.int_col, lambda _: 3, id="rshift_col_scalar"),
748-
],
749-
)
750-
@pytest.mark.notimpl(["bigquery", "dask", "datafusion", "pandas"])
751-
@pyspark_no_bitshift
752-
def test_bitwise_shift(backend, alltypes, df, op, left_fn, right_fn):
753-
expr = op(left_fn(alltypes), right_fn(alltypes)).name("tmp")
754-
result = expr.execute()
755-
756-
pandas_left = getattr(left := left_fn(df), "values", left)
757-
pandas_right = getattr(right := right_fn(df), "values", right)
758-
expected = pd.Series(
759-
op(pandas_left, pandas_right),
760-
name="tmp",
761-
dtype="int64",
762-
)
763-
backend.assert_series_equal(result, expected)
764-
765-
766-
@pytest.mark.parametrize(
767-
"op",
768-
[
769-
param(and_, marks=[pytest.mark.notimpl(["snowflake"])]),
770-
param(or_, marks=[pytest.mark.notimpl(["snowflake"])]),
771-
param(xor, marks=[pytest.mark.notimpl(["snowflake"])]),
772-
param(lshift, marks=pyspark_no_bitshift),
773-
param(rshift, marks=pyspark_no_bitshift),
774-
],
775-
)
776-
@pytest.mark.parametrize(
777-
("left", "right"),
778-
[param(4, L(2), id="int_col"), param(L(4), 2, id="col_int")],
779-
)
780-
@pytest.mark.notimpl(["bigquery", "dask", "datafusion", "pandas"])
781-
def test_bitwise_scalars(con, op, left, right):
782-
expr = op(left, right)
783-
result = con.execute(expr)
784-
expected = op(4, 2)
785-
assert result == expected
786-
787-
788-
@pytest.mark.notimpl(["bigquery", "dask", "datafusion", "pandas", "snowflake"])
789-
def test_bitwise_not_scalar(con):
790-
expr = ~L(2)
791-
result = con.execute(expr)
792-
expected = -3
793-
assert result == expected
794-
795-
796-
@pytest.mark.notimpl(["bigquery", "dask", "datafusion", "pandas", "snowflake"])
797-
def test_bitwise_not_col(backend, alltypes, df):
798-
expr = (~alltypes.int_col).name("tmp")
799-
result = expr.execute()
800-
expected = ~df.int_col
801-
backend.assert_series_equal(result, expected.rename("tmp"))
802-
803-
804702
@pytest.mark.notimpl(
805703
["snowflake"], reason="snowflake doesn't implement timestamp subtraction"
806704
)

ibis/backends/tests/test_numeric.py

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import decimal
22
import math
33
import operator
4+
from operator import and_, lshift, or_, rshift, xor
45

56
import numpy as np
67
import pandas as pd
@@ -598,3 +599,105 @@ def test_constants(con, const):
598599
expr = getattr(ibis, const)
599600
result = con.execute(expr)
600601
assert pytest.approx(result) == getattr(math, const)
602+
603+
604+
pyspark_no_bitshift = pytest.mark.notyet(
605+
["pyspark"], reason="pyspark doesn't implement bitshit operators"
606+
)
607+
608+
609+
@pytest.mark.parametrize("op", [and_, or_, xor])
610+
@pytest.mark.parametrize(
611+
("left_fn", "right_fn"),
612+
[
613+
param(lambda t: t.int_col, lambda t: t.int_col, id="col_col"),
614+
param(lambda _: 3, lambda t: t.int_col, id="scalar_col"),
615+
param(lambda t: t.int_col, lambda _: 3, id="col_scalar"),
616+
],
617+
)
618+
@pytest.mark.notimpl(["bigquery", "dask", "datafusion", "pandas", "snowflake"])
619+
def test_bitwise_columns(backend, con, alltypes, df, op, left_fn, right_fn):
620+
expr = op(left_fn(alltypes), right_fn(alltypes)).name("tmp")
621+
result = con.execute(expr)
622+
623+
expected = op(left_fn(df), right_fn(df)).rename("tmp")
624+
backend.assert_series_equal(result, expected)
625+
626+
627+
@pytest.mark.parametrize(
628+
("op", "left_fn", "right_fn"),
629+
[
630+
param(
631+
lshift,
632+
lambda t: t.int_col,
633+
lambda t: t.int_col,
634+
id="lshift_col_col",
635+
),
636+
param(
637+
lshift,
638+
lambda _: 3,
639+
lambda t: t.int_col,
640+
marks=pytest.mark.broken(
641+
["impala"],
642+
reason="impala's behavior differs from every other backend",
643+
),
644+
id="lshift_scalar_col",
645+
),
646+
param(lshift, lambda t: t.int_col, lambda _: 3, id="lshift_col_scalar"),
647+
param(rshift, lambda t: t.int_col, lambda t: t.int_col, id="rshift_col_col"),
648+
param(rshift, lambda _: 3, lambda t: t.int_col, id="rshift_scalar_col"),
649+
param(rshift, lambda t: t.int_col, lambda _: 3, id="rshift_col_scalar"),
650+
],
651+
)
652+
@pytest.mark.notimpl(["bigquery", "dask", "datafusion", "pandas"])
653+
@pyspark_no_bitshift
654+
def test_bitwise_shift(backend, alltypes, df, op, left_fn, right_fn):
655+
expr = op(left_fn(alltypes), right_fn(alltypes)).name("tmp")
656+
result = expr.execute()
657+
658+
pandas_left = getattr(left := left_fn(df), "values", left)
659+
pandas_right = getattr(right := right_fn(df), "values", right)
660+
expected = pd.Series(
661+
op(pandas_left, pandas_right),
662+
name="tmp",
663+
dtype="int64",
664+
)
665+
backend.assert_series_equal(result, expected)
666+
667+
668+
@pytest.mark.parametrize(
669+
"op",
670+
[
671+
param(and_, marks=[pytest.mark.notimpl(["snowflake"])]),
672+
param(or_, marks=[pytest.mark.notimpl(["snowflake"])]),
673+
param(xor, marks=[pytest.mark.notimpl(["snowflake"])]),
674+
param(lshift, marks=pyspark_no_bitshift),
675+
param(rshift, marks=pyspark_no_bitshift),
676+
],
677+
)
678+
@pytest.mark.parametrize(
679+
("left", "right"),
680+
[param(4, L(2), id="int_col"), param(L(4), 2, id="col_int")],
681+
)
682+
@pytest.mark.notimpl(["bigquery", "dask", "datafusion", "pandas"])
683+
def test_bitwise_scalars(con, op, left, right):
684+
expr = op(left, right)
685+
result = con.execute(expr)
686+
expected = op(4, 2)
687+
assert result == expected
688+
689+
690+
@pytest.mark.notimpl(["bigquery", "dask", "datafusion", "pandas", "snowflake"])
691+
def test_bitwise_not_scalar(con):
692+
expr = ~L(2)
693+
result = con.execute(expr)
694+
expected = -3
695+
assert result == expected
696+
697+
698+
@pytest.mark.notimpl(["bigquery", "dask", "datafusion", "pandas", "snowflake"])
699+
def test_bitwise_not_col(backend, alltypes, df):
700+
expr = (~alltypes.int_col).name("tmp")
701+
result = expr.execute()
702+
expected = ~df.int_col
703+
backend.assert_series_equal(result, expected.rename("tmp"))

0 commit comments

Comments
 (0)