Skip to content

Commit 911b2fd

Browse files
gforsythcpcloud
authored andcommitted
feat: add ops.Cast to translator and decompiler
1 parent 98e039c commit 911b2fd

File tree

4 files changed

+42
-1
lines changed

4 files changed

+42
-1
lines changed

ibis_substrait/compiler/decompile.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -765,6 +765,15 @@ def decompile_singular_or_list(
765765
) -> ir.ValueExpr:
766766
return decompile(singular_or_list, children, offsets, decompiler)
767767

768+
@staticmethod
769+
def decompile_cast(
770+
cast: stalg.Expression.Cast,
771+
children: Sequence[ir.TableExpr],
772+
offsets: Sequence[int],
773+
decompiler: SubstraitDecompiler,
774+
) -> ir.ValueExpr:
775+
return decompile(cast, children, offsets, decompiler)
776+
768777

769778
@decompile.register
770779
def _decompile_expression(
@@ -874,6 +883,17 @@ def _decompile_expression_singular_or_list(
874883
)
875884

876885

886+
@decompile.register
887+
def _decompile_expression_cast(
888+
msg: stalg.Expression.Cast,
889+
children: Sequence[ir.TableExpr],
890+
field_offsets: Sequence[int],
891+
decompiler: SubstraitDecompiler,
892+
) -> ir.ValueExpr:
893+
column = decompile(msg.input, children, field_offsets, decompiler)
894+
return column.cast(_decompile_type(msg.type))
895+
896+
877897
class LiteralDecompiler:
878898
@staticmethod
879899
def decompile_boolean(value: bool) -> tuple[bool, dt.Boolean]:

ibis_substrait/compiler/mapping.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
"And": "and",
44
"Any": "any",
55
"Between": "between",
6-
"Cast": "cast",
76
"Count": "count",
87
"CountDistinct": "countdistinct",
98
"Divide": "/", # wrong but using for duckdb compatibility right now

ibis_substrait/compiler/translate.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -943,3 +943,17 @@ def _contains(
943943
options=[translate(value, compiler, **kwargs) for value in op.options],
944944
)
945945
)
946+
947+
948+
@translate.register(ops.Cast)
949+
def _cast(
950+
op: ops.Cast,
951+
expr: ir.TableExpr,
952+
compiler: SubstraitCompiler,
953+
**kwargs: Any,
954+
) -> stalg.Expression:
955+
return stalg.Expression(
956+
cast=stalg.Expression.Cast(
957+
type=translate(op.to), input=translate(op.arg, compiler, **kwargs)
958+
)
959+
)

ibis_substrait/tests/compiler/test_decompiler.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,3 +238,11 @@ def test_singular_or_list(compiler):
238238
plan = compiler.compile(expr)
239239
(result,) = decompile(plan)
240240
assert result.equals(expr)
241+
242+
243+
def test_cast(compiler):
244+
t = ibis.table([("bork32", dt.float32)], name="t")
245+
expr = t[t.bork32.cast("float64").name("bork64")]
246+
plan = compiler.compile(expr)
247+
(result,) = decompile(plan)
248+
assert result.equals(expr)

0 commit comments

Comments
 (0)