Skip to content

Commit a5b7293

Browse files
committed
feat(clickhouse): implement trim, pad and string predicates
1 parent 0ec06a7 commit a5b7293

File tree

2 files changed

+51
-27
lines changed

2 files changed

+51
-27
lines changed

ibis/backends/clickhouse/registry.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,46 @@ def _string_like(translator, expr):
566566
)
567567

568568

569+
def _string_ilike(translator, expr):
570+
op = expr.op()
571+
return 'lower({}) LIKE lower({})'.format(
572+
translator.translate(op.arg),
573+
translator.translate(op.pattern),
574+
)
575+
576+
577+
def _startswith(translator, expr):
578+
op = expr.op()
579+
arg = op.arg
580+
start = op.start
581+
tr_arg = translator.translate(arg)
582+
tr_start = translator.translate(start)
583+
return f"startsWith({tr_arg}, {tr_start})"
584+
585+
586+
def _endswith(translator, expr):
587+
op = expr.op()
588+
arg = translator.translate(op.arg)
589+
end = translator.translate(op.end)
590+
return f"endsWith({arg}, {end})"
591+
592+
593+
def _lpad(translator, expr):
594+
op = expr.op()
595+
arg = translator.translate(op.arg)
596+
length = translator.translate(op.length)
597+
pad = translator.translate(op.pad)
598+
return f"leftPad({arg}, {length}, {pad})"
599+
600+
601+
def _rpad(translator, expr):
602+
op = expr.op()
603+
arg = translator.translate(op.arg)
604+
length = translator.translate(op.length)
605+
pad = translator.translate(op.pad)
606+
return f"rightPad({arg}, {length}, {pad})"
607+
608+
569609
def _group_concat(translator, expr):
570610
arg, sep, where = expr.op().args
571611
if where is not None:
@@ -646,6 +686,14 @@ def _group_concat(translator, expr):
646686
ops.StringJoin: _string_join,
647687
ops.StringSplit: _string_split,
648688
ops.StringSQLLike: _string_like,
689+
ops.StringSQLILike: _string_ilike,
690+
ops.StartsWith: _startswith,
691+
ops.EndsWith: _endswith,
692+
ops.LPad: _lpad,
693+
ops.RPad: _rpad,
694+
ops.LStrip: _unary('trimLeft'),
695+
ops.RStrip: _unary('trimRight'),
696+
ops.Strip: _unary('trimBoth'),
649697
ops.Repeat: _string_repeat,
650698
ops.RegexSearch: _fixed_arity('match', 2),
651699
# TODO: extractAll(haystack, pattern)[index + 1]

ibis/backends/tests/test_string.py

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,7 @@ def test_string_col_is_unicode(backend, alltypes, df):
4848
lambda t: t.string_col.ilike('6%'),
4949
lambda t: t.string_col.str.contains('6.*'),
5050
id='ilike',
51-
marks=pytest.mark.notimpl(
52-
[
53-
"clickhouse",
54-
"datafusion",
55-
"impala",
56-
"pyspark",
57-
]
58-
),
51+
marks=pytest.mark.notimpl(["datafusion", "impala", "pyspark"]),
5952
),
6053
param(
6154
lambda t: t.string_col.re_search(r'[[:digit:]]+'),
@@ -124,13 +117,11 @@ def test_string_col_is_unicode(backend, alltypes, df):
124117
lambda t: t.string_col.lpad(10, 'a'),
125118
lambda t: t.string_col.str.pad(10, fillchar='a', side='left'),
126119
id='lpad',
127-
marks=pytest.mark.notimpl(["clickhouse"]),
128120
),
129121
param(
130122
lambda t: t.string_col.rpad(10, 'a'),
131123
lambda t: t.string_col.str.pad(10, fillchar='a', side='right'),
132124
id='rpad',
133-
marks=pytest.mark.notimpl(["clickhouse"]),
134125
),
135126
param(
136127
lambda t: t.string_col.find_in_set(['1']),
@@ -179,43 +170,28 @@ def test_string_col_is_unicode(backend, alltypes, df):
179170
lambda t: t.string_col.startswith('foo'),
180171
lambda t: t.string_col.str.startswith('foo'),
181172
id='startswith',
182-
marks=pytest.mark.notimpl(
183-
["clickhouse", "dask", "datafusion", "pandas"]
184-
),
173+
marks=pytest.mark.notimpl(["dask", "datafusion", "pandas"]),
185174
),
186175
param(
187176
lambda t: t.string_col.endswith('foo'),
188177
lambda t: t.string_col.str.endswith('foo'),
189178
id='endswith',
190-
marks=pytest.mark.notimpl(
191-
["clickhouse", "dask", "datafusion", "pandas"]
192-
),
179+
marks=pytest.mark.notimpl(["dask", "datafusion", "pandas"]),
193180
),
194181
param(
195182
lambda t: t.string_col.strip(),
196183
lambda t: t.string_col.str.strip(),
197184
id='strip',
198-
marks=pytest.mark.notimpl(["clickhouse"]),
199185
),
200186
param(
201187
lambda t: t.string_col.lstrip(),
202188
lambda t: t.string_col.str.lstrip(),
203189
id='lstrip',
204-
marks=pytest.mark.notimpl(
205-
[
206-
"clickhouse",
207-
]
208-
),
209190
),
210191
param(
211192
lambda t: t.string_col.rstrip(),
212193
lambda t: t.string_col.str.rstrip(),
213194
id='rstrip',
214-
marks=pytest.mark.notimpl(
215-
[
216-
"clickhouse",
217-
]
218-
),
219195
),
220196
param(
221197
lambda t: t.string_col.capitalize(),

0 commit comments

Comments
 (0)