Skip to content

Commit d4e3f57

Browse files
authored
feat: add like_any_of, like_all_of, ilike_any_of and ilike_all_of filters (#358)
1 parent e9f49a5 commit d4e3f57

7 files changed

+201
-1
lines changed

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,4 @@ remove_pytest_asyncio_from_sync:
3737
sed -i 's/@pytest.mark.asyncio//g' tests/_sync/test_client.py
3838

3939
sleep:
40-
sleep 5
40+
sleep 2

postgrest/base_request_builder.py

+40
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,46 @@ def like(self: Self, column: str, pattern: str) -> Self:
321321
"""
322322
return self.filter(column, Filters.LIKE, pattern)
323323

324+
def like_all_of(self: Self, column: str, pattern: str) -> Self:
325+
"""A 'LIKE' filter, to use for pattern matching.
326+
327+
Args:
328+
column: The name of the column to apply a filter on
329+
pattern: The pattern to filter by
330+
"""
331+
332+
return self.filter(column, Filters.LIKE_ALL, f"{{{pattern}}}")
333+
334+
def like_any_of(self: Self, column: str, pattern: str) -> Self:
335+
"""A 'LIKE' filter, to use for pattern matching.
336+
337+
Args:
338+
column: The name of the column to apply a filter on
339+
pattern: The pattern to filter by
340+
"""
341+
342+
return self.filter(column, Filters.LIKE_ANY, f"{{{pattern}}}")
343+
344+
def ilike_all_of(self: Self, column: str, pattern: str) -> Self:
345+
"""A 'ILIKE' filter, to use for pattern matching (case insensitive).
346+
347+
Args:
348+
column: The name of the column to apply a filter on
349+
pattern: The pattern to filter by
350+
"""
351+
352+
return self.filter(column, Filters.ILIKE_ALL, f"{{{pattern}}}")
353+
354+
def ilike_any_of(self: Self, column: str, pattern: str) -> Self:
355+
"""A 'ILIKE' filter, to use for pattern matching (case insensitive).
356+
357+
Args:
358+
column: The name of the column to apply a filter on
359+
pattern: The pattern to filter by
360+
"""
361+
362+
return self.filter(column, Filters.ILIKE_ANY, f"{{{pattern}}}")
363+
324364
def ilike(self: Self, column: str, pattern: str) -> Self:
325365
"""An 'ILIKE' filter, to use for pattern matching (case insensitive).
326366

postgrest/types.py

+4
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@ class Filters(StrEnum):
2424
LTE = "lte"
2525
IS = "is"
2626
LIKE = "like"
27+
LIKE_ALL = "like(all)"
28+
LIKE_ANY = "like(any)"
2729
ILIKE = "ilike"
30+
ILIKE_ALL = "ilike(all)"
31+
ILIKE_ANY = "ilike(any)"
2832
FTS = "fts"
2933
PLFTS = "plfts"
3034
PHFTS = "phfts"

tests/_async/test_filter_request_builder.py

+24
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,30 @@ def test_ilike(filter_request_builder):
190190
assert str(builder.params) == "x=ilike.%25a%25"
191191

192192

193+
def test_like_all_of(filter_request_builder):
194+
builder = filter_request_builder.like_all_of("x", "A*,*b")
195+
196+
assert str(builder.params) == "x=like%28all%29.%7BA%2A%2C%2Ab%7D"
197+
198+
199+
def test_like_any_of(filter_request_builder):
200+
builder = filter_request_builder.like_any_of("x", "a*,*b")
201+
202+
assert str(builder.params) == "x=like%28any%29.%7Ba%2A%2C%2Ab%7D"
203+
204+
205+
def test_ilike_all_of(filter_request_builder):
206+
builder = filter_request_builder.ilike_all_of("x", "A*,*b")
207+
208+
assert str(builder.params) == "x=ilike%28all%29.%7BA%2A%2C%2Ab%7D"
209+
210+
211+
def test_ilike_any_of(filter_request_builder):
212+
builder = filter_request_builder.ilike_any_of("x", "A*,*b")
213+
214+
assert str(builder.params) == "x=ilike%28any%29.%7BA%2A%2C%2Ab%7D"
215+
216+
193217
def test_is_(filter_request_builder):
194218
builder = filter_request_builder.is_("x", "a")
195219

tests/_async/test_filter_request_builder_integration.py

+54
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,60 @@ async def test_ilike():
224224
assert res.data == [{"country_name": "ALBANIA", "iso": "AL"}]
225225

226226

227+
async def test_like_all_of():
228+
res = (
229+
await rest_client()
230+
.from_("countries")
231+
.select("nicename, iso")
232+
.like_all_of("nicename", "A*,*n")
233+
.execute()
234+
)
235+
236+
assert res.data == [{"iso": "AF", "nicename": "Afghanistan"}]
237+
238+
239+
async def test_like_any_of():
240+
res = (
241+
await rest_client()
242+
.from_("countries")
243+
.select("nicename, iso")
244+
.like_any_of("nicename", "Al*,*ia")
245+
.execute()
246+
)
247+
248+
assert res.data == [
249+
{"iso": "AL", "nicename": "Albania"},
250+
{"iso": "DZ", "nicename": "Algeria"},
251+
]
252+
253+
254+
async def test_ilike_all_of():
255+
res = (
256+
await rest_client()
257+
.from_("countries")
258+
.select("nicename, iso")
259+
.ilike_all_of("nicename", "a*,*n")
260+
.execute()
261+
)
262+
263+
assert res.data == [{"iso": "AF", "nicename": "Afghanistan"}]
264+
265+
266+
async def test_ilike_any_of():
267+
res = (
268+
await rest_client()
269+
.from_("countries")
270+
.select("nicename, iso")
271+
.ilike_any_of("nicename", "al*,*ia")
272+
.execute()
273+
)
274+
275+
assert res.data == [
276+
{"iso": "AL", "nicename": "Albania"},
277+
{"iso": "DZ", "nicename": "Algeria"},
278+
]
279+
280+
227281
async def test_is_():
228282
res = (
229283
await rest_client()

tests/_sync/test_filter_request_builder.py

+24
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,30 @@ def test_ilike(filter_request_builder):
190190
assert str(builder.params) == "x=ilike.%25a%25"
191191

192192

193+
def test_like_all_of(filter_request_builder):
194+
builder = filter_request_builder.like_all_of("x", "A*,*b")
195+
196+
assert str(builder.params) == "x=like%28all%29.%7BA%2A%2C%2Ab%7D"
197+
198+
199+
def test_like_any_of(filter_request_builder):
200+
builder = filter_request_builder.like_any_of("x", "a*,*b")
201+
202+
assert str(builder.params) == "x=like%28any%29.%7Ba%2A%2C%2Ab%7D"
203+
204+
205+
def test_ilike_all_of(filter_request_builder):
206+
builder = filter_request_builder.ilike_all_of("x", "A*,*b")
207+
208+
assert str(builder.params) == "x=ilike%28all%29.%7BA%2A%2C%2Ab%7D"
209+
210+
211+
def test_ilike_any_of(filter_request_builder):
212+
builder = filter_request_builder.ilike_any_of("x", "A*,*b")
213+
214+
assert str(builder.params) == "x=ilike%28any%29.%7BA%2A%2C%2Ab%7D"
215+
216+
193217
def test_is_(filter_request_builder):
194218
builder = filter_request_builder.is_("x", "a")
195219

tests/_sync/test_filter_request_builder_integration.py

+54
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,60 @@ def test_ilike():
217217
assert res.data == [{"country_name": "ALBANIA", "iso": "AL"}]
218218

219219

220+
def test_like_all_of():
221+
res = (
222+
rest_client()
223+
.from_("countries")
224+
.select("nicename, iso")
225+
.like_all_of("nicename", "A*,*n")
226+
.execute()
227+
)
228+
229+
assert res.data == [{"iso": "AF", "nicename": "Afghanistan"}]
230+
231+
232+
def test_like_any_of():
233+
res = (
234+
rest_client()
235+
.from_("countries")
236+
.select("nicename, iso")
237+
.like_any_of("nicename", "Al*,*ia")
238+
.execute()
239+
)
240+
241+
assert res.data == [
242+
{"iso": "AL", "nicename": "Albania"},
243+
{"iso": "DZ", "nicename": "Algeria"},
244+
]
245+
246+
247+
def test_ilike_all_of():
248+
res = (
249+
rest_client()
250+
.from_("countries")
251+
.select("nicename, iso")
252+
.ilike_all_of("nicename", "a*,*n")
253+
.execute()
254+
)
255+
256+
assert res.data == [{"iso": "AF", "nicename": "Afghanistan"}]
257+
258+
259+
def test_ilike_any_of():
260+
res = (
261+
rest_client()
262+
.from_("countries")
263+
.select("nicename, iso")
264+
.ilike_any_of("nicename", "al*,*ia")
265+
.execute()
266+
)
267+
268+
assert res.data == [
269+
{"iso": "AL", "nicename": "Albania"},
270+
{"iso": "DZ", "nicename": "Algeria"},
271+
]
272+
273+
220274
def test_is_():
221275
res = (
222276
rest_client()

0 commit comments

Comments
 (0)