@@ -177,6 +177,11 @@ def _(op: ops.base_ops.UnaryOp, expr: TypedExpr) -> sge.Expression:
177
177
)
178
178
179
179
180
+ @UNARY_OP_REGISTRATION .register (ops .StrContainsOp )
181
+ def _ (op : ops .StrContainsOp , expr : TypedExpr ) -> sge .Expression :
182
+ return sge .Like (this = expr .expr , expression = sge .convert (f"%{ op .pat } %" ))
183
+
184
+
180
185
@UNARY_OP_REGISTRATION .register (ops .StrContainsRegexOp )
181
186
def _ (op : ops .StrContainsRegexOp , expr : TypedExpr ) -> sge .Expression :
182
187
return sge .RegexpLike (this = expr .expr , expression = sge .convert (op .pat ))
@@ -213,15 +218,57 @@ def _(op: ops.StrFindOp, expr: TypedExpr) -> sge.Expression:
213
218
) - sge .convert (1 )
214
219
215
220
216
- @UNARY_OP_REGISTRATION .register (ops .StrContainsOp )
217
- def _ (op : ops .StrContainsOp , expr : TypedExpr ) -> sge .Expression :
218
- return sge .Like (this = expr .expr , expression = sge .convert (f"%{ op .pat } %" ))
221
+ @UNARY_OP_REGISTRATION .register (ops .StrLstripOp )
222
+ def _ (op : ops .StrLstripOp , expr : TypedExpr ) -> sge .Expression :
223
+ return sge .Trim (this = expr .expr , expression = sge .convert (op .to_strip ), side = "LEFT" )
224
+
225
+
226
+ @UNARY_OP_REGISTRATION .register (ops .StrPadOp )
227
+ def _ (op : ops .StrPadOp , expr : TypedExpr ) -> sge .Expression :
228
+ pad_length = sge .func (
229
+ "GREATEST" , sge .Length (this = expr .expr ), sge .convert (op .length )
230
+ )
231
+ if op .side == "left" :
232
+ return sge .func (
233
+ "LPAD" ,
234
+ expr .expr ,
235
+ pad_length ,
236
+ sge .convert (op .fillchar ),
237
+ )
238
+ elif op .side == "right" :
239
+ return sge .func (
240
+ "RPAD" ,
241
+ expr .expr ,
242
+ pad_length ,
243
+ sge .convert (op .fillchar ),
244
+ )
245
+ else : # side == both
246
+ lpad_amount = sge .Cast (
247
+ this = sge .func (
248
+ "SAFE_DIVIDE" ,
249
+ sge .Sub (this = pad_length , expression = sge .Length (this = expr .expr )),
250
+ sge .convert (2 ),
251
+ ),
252
+ to = "INT64" ,
253
+ ) + sge .Length (this = expr .expr )
254
+ return sge .func (
255
+ "RPAD" ,
256
+ sge .func (
257
+ "LPAD" ,
258
+ expr .expr ,
259
+ lpad_amount ,
260
+ sge .convert (op .fillchar ),
261
+ ),
262
+ pad_length ,
263
+ sge .convert (op .fillchar ),
264
+ )
219
265
220
266
221
267
@UNARY_OP_REGISTRATION .register (ops .StrRepeatOp )
222
268
def _ (op : ops .StrRepeatOp , expr : TypedExpr ) -> sge .Expression :
223
269
return sge .Repeat (this = expr .expr , times = sge .convert (op .repeats ))
224
270
271
+
225
272
@UNARY_OP_REGISTRATION .register (ops .date_op )
226
273
def _ (op : ops .base_ops .UnaryOp , expr : TypedExpr ) -> sge .Expression :
227
274
return sge .Date (this = expr .expr )
@@ -479,52 +526,6 @@ def _(op: ops.base_ops.UnaryOp, expr: TypedExpr) -> sge.Expression:
479
526
return sge .Extract (this = sge .Identifier (this = "MONTH" ), expression = expr .expr )
480
527
481
528
482
- @UNARY_OP_REGISTRATION .register (ops .StrLstripOp )
483
- def _ (op : ops .StrLstripOp , expr : TypedExpr ) -> sge .Expression :
484
- return sge .Trim (this = expr .expr , expression = sge .convert (op .to_strip ), side = "LEFT" )
485
-
486
-
487
- @UNARY_OP_REGISTRATION .register (ops .StrPadOp )
488
- def _ (op : ops .StrPadOp , expr : TypedExpr ) -> sge .Expression :
489
- pad_length = sge .func (
490
- "GREATEST" , sge .Length (this = expr .expr ), sge .convert (op .length )
491
- )
492
- if op .side == "left" :
493
- return sge .func (
494
- "LPAD" ,
495
- expr .expr ,
496
- pad_length ,
497
- sge .convert (op .fillchar ),
498
- )
499
- elif op .side == "right" :
500
- return sge .func (
501
- "RPAD" ,
502
- expr .expr ,
503
- pad_length ,
504
- sge .convert (op .fillchar ),
505
- )
506
- else : # side == both
507
- lpad_amount = sge .Cast (
508
- this = sge .func (
509
- "SAFE_DIVIDE" ,
510
- sge .Sub (this = pad_length , expression = sge .Length (this = expr .expr )),
511
- sge .convert (2 ),
512
- ),
513
- to = "INT64" ,
514
- ) + sge .Length (this = expr .expr )
515
- return sge .func (
516
- "RPAD" ,
517
- sge .func (
518
- "LPAD" ,
519
- expr .expr ,
520
- lpad_amount ,
521
- sge .convert (op .fillchar ),
522
- ),
523
- pad_length ,
524
- sge .convert (op .fillchar ),
525
- )
526
-
527
-
528
529
@UNARY_OP_REGISTRATION .register (ops .neg_op )
529
530
def _ (op : ops .base_ops .UnaryOp , expr : TypedExpr ) -> sge .Expression :
530
531
return sge .Neg (this = expr .expr )
@@ -560,6 +561,18 @@ def _(op: ops.base_ops.UnaryOp, expr: TypedExpr) -> sge.Expression:
560
561
return sge .Extract (this = sge .Identifier (this = "QUARTER" ), expression = expr .expr )
561
562
562
563
564
+ @UNARY_OP_REGISTRATION .register (ops .ReplaceStrOp )
565
+ def _ (op : ops .ReplaceStrOp , expr : TypedExpr ) -> sge .Expression :
566
+ return sge .func ("REPLACE" , expr .expr , sge .convert (op .pat ), sge .convert (op .repl ))
567
+
568
+
569
+ @UNARY_OP_REGISTRATION .register (ops .RegexReplaceStrOp )
570
+ def _ (op : ops .RegexReplaceStrOp , expr : TypedExpr ) -> sge .Expression :
571
+ return sge .func (
572
+ "REGEXP_REPLACE" , expr .expr , sge .convert (op .pat ), sge .convert (op .repl )
573
+ )
574
+
575
+
563
576
@UNARY_OP_REGISTRATION .register (ops .reverse_op )
564
577
def _ (op : ops .base_ops .UnaryOp , expr : TypedExpr ) -> sge .Expression :
565
578
return sge .func ("REVERSE" , expr .expr )
0 commit comments