1414
1515from __future__ import annotations
1616
17+ import functools
1718import typing
1819
1920import pandas as pd
@@ -292,6 +293,18 @@ def _(op: ops.base_ops.UnaryOp, expr: TypedExpr) -> sge.Expression:
292293 return sge .Extract (this = sge .Identifier (this = "DAYOFYEAR" ), expression = expr .expr )
293294
294295
296+ @UNARY_OP_REGISTRATION .register (ops .EndsWithOp )
297+ def _ (op : ops .EndsWithOp , expr : TypedExpr ) -> sge .Expression :
298+ if not op .pat :
299+ return sge .false ()
300+
301+ def to_endswith (pat : str ) -> sge .Expression :
302+ return sge .func ("ENDS_WITH" , expr .expr , sge .convert (pat ))
303+
304+ conditions = [to_endswith (pat ) for pat in op .pat ]
305+ return functools .reduce (lambda x , y : sge .Or (this = x , expression = y ), conditions )
306+
307+
295308@UNARY_OP_REGISTRATION .register (ops .exp_op )
296309def _ (op : ops .base_ops .UnaryOp , expr : TypedExpr ) -> sge .Expression :
297310 return sge .Case (
@@ -344,6 +357,27 @@ def _(op: ops.base_ops.UnaryOp, expr: TypedExpr) -> sge.Expression:
344357 return sge .func ("ST_BOUNDARY" , expr .expr )
345358
346359
360+ @UNARY_OP_REGISTRATION .register (ops .GeoStBufferOp )
361+ def _ (op : ops .GeoStBufferOp , expr : TypedExpr ) -> sge .Expression :
362+ return sge .func (
363+ "ST_BUFFER" ,
364+ expr .expr ,
365+ sge .convert (op .buffer_radius ),
366+ sge .convert (op .num_seg_quarter_circle ),
367+ sge .convert (op .use_spheroid ),
368+ )
369+
370+
371+ @UNARY_OP_REGISTRATION .register (ops .geo_st_centroid_op )
372+ def _ (op : ops .base_ops .UnaryOp , expr : TypedExpr ) -> sge .Expression :
373+ return sge .func ("ST_CENTROID" , expr .expr )
374+
375+
376+ @UNARY_OP_REGISTRATION .register (ops .geo_st_convexhull_op )
377+ def _ (op : ops .base_ops .UnaryOp , expr : TypedExpr ) -> sge .Expression :
378+ return sge .func ("ST_CONVEXHULL" , expr .expr )
379+
380+
347381@UNARY_OP_REGISTRATION .register (ops .geo_st_geogfromtext_op )
348382def _ (op : ops .base_ops .UnaryOp , expr : TypedExpr ) -> sge .Expression :
349383 return sge .func ("SAFE.ST_GEOGFROMTEXT" , expr .expr )
@@ -516,6 +550,17 @@ def _(op: ops.base_ops.UnaryOp, expr: TypedExpr) -> sge.Expression:
516550 return sge .Lower (this = expr .expr )
517551
518552
553+ @UNARY_OP_REGISTRATION .register (ops .MapOp )
554+ def _ (op : ops .MapOp , expr : TypedExpr ) -> sge .Expression :
555+ return sge .Case (
556+ this = expr .expr ,
557+ ifs = [
558+ sge .If (this = sge .convert (key ), true = sge .convert (value ))
559+ for key , value in op .mappings
560+ ],
561+ )
562+
563+
519564@UNARY_OP_REGISTRATION .register (ops .minute_op )
520565def _ (op : ops .base_ops .UnaryOp , expr : TypedExpr ) -> sge .Expression :
521566 return sge .Extract (this = sge .Identifier (this = "MINUTE" ), expression = expr .expr )
@@ -601,6 +646,18 @@ def _(op: ops.base_ops.UnaryOp, expr: TypedExpr) -> sge.Expression:
601646 )
602647
603648
649+ @UNARY_OP_REGISTRATION .register (ops .StartsWithOp )
650+ def _ (op : ops .StartsWithOp , expr : TypedExpr ) -> sge .Expression :
651+ if not op .pat :
652+ return sge .false ()
653+
654+ def to_startswith (pat : str ) -> sge .Expression :
655+ return sge .func ("STARTS_WITH" , expr .expr , sge .convert (pat ))
656+
657+ conditions = [to_startswith (pat ) for pat in op .pat ]
658+ return functools .reduce (lambda x , y : sge .Or (this = x , expression = y ), conditions )
659+
660+
604661@UNARY_OP_REGISTRATION .register (ops .StrStripOp )
605662def _ (op : ops .StrStripOp , expr : TypedExpr ) -> sge .Expression :
606663 return sge .Trim (this = sge .convert (op .to_strip ), expression = expr .expr )
@@ -624,6 +681,11 @@ def _(op: ops.base_ops.UnaryOp, expr: TypedExpr) -> sge.Expression:
624681 )
625682
626683
684+ @UNARY_OP_REGISTRATION .register (ops .StringSplitOp )
685+ def _ (op : ops .StringSplitOp , expr : TypedExpr ) -> sge .Expression :
686+ return sge .Split (this = expr .expr , expression = sge .convert (op .pat ))
687+
688+
627689@UNARY_OP_REGISTRATION .register (ops .StrGetOp )
628690def _ (op : ops .StrGetOp , expr : TypedExpr ) -> sge .Expression :
629691 return sge .Substring (
@@ -776,3 +838,31 @@ def _(op: ops.base_ops.UnaryOp, expr: TypedExpr) -> sge.Expression:
776838@UNARY_OP_REGISTRATION .register (ops .year_op )
777839def _ (op : ops .base_ops .UnaryOp , expr : TypedExpr ) -> sge .Expression :
778840 return sge .Extract (this = sge .Identifier (this = "YEAR" ), expression = expr .expr )
841+
842+
843+ @UNARY_OP_REGISTRATION .register (ops .ZfillOp )
844+ def _ (op : ops .ZfillOp , expr : TypedExpr ) -> sge .Expression :
845+ return sge .Case (
846+ ifs = [
847+ sge .If (
848+ this = sge .EQ (
849+ this = sge .Substring (
850+ this = expr .expr , start = sge .convert (1 ), length = sge .convert (1 )
851+ ),
852+ expression = sge .convert ("-" ),
853+ ),
854+ true = sge .Concat (
855+ expressions = [
856+ sge .convert ("-" ),
857+ sge .func (
858+ "LPAD" ,
859+ sge .Substring (this = expr .expr , start = sge .convert (1 )),
860+ sge .convert (op .width - 1 ),
861+ sge .convert ("0" ),
862+ ),
863+ ]
864+ ),
865+ )
866+ ],
867+ default = sge .func ("LPAD" , expr .expr , sge .convert (op .width ), sge .convert ("0" )),
868+ )
0 commit comments