Skip to content

Commit b39f332

Browse files
authored
fix: update overlaps to work with timestamp range (#445)
1 parent d8ce53a commit b39f332

5 files changed

+56
-3
lines changed

postgrest/base_request_builder.py

+10-3
Original file line numberDiff line numberDiff line change
@@ -451,9 +451,16 @@ def contained_by(
451451
return self.filter(column, Filters.CD, f"{{{stringified_values}}}")
452452
return self.filter(column, Filters.CD, json.dumps(value))
453453

454-
def ov(self: Self, column: str, values: Iterable[Any]) -> Self:
455-
values = ",".join(values)
456-
return self.filter(column, Filters.OV, f"{{{values}}}")
454+
def ov(self: Self, column: str, value: Iterable[Any]) -> Self:
455+
if isinstance(value, str):
456+
# range types can be inclusive '[', ']' or exclusive '(', ')' so just
457+
# keep it simple and accept a string
458+
return self.filter(column, Filters.OV, value)
459+
if not isinstance(value, dict) and isinstance(value, Iterable):
460+
# Expected to be some type of iterable
461+
stringified_values = ",".join(value)
462+
return self.filter(column, Filters.OV, f"{{{stringified_values}}}")
463+
return self.filter(column, Filters.OV, json.dumps(value))
457464

458465
def sl(self: Self, column: str, range: Tuple[int, int]) -> Self:
459466
return self.filter(column, Filters.SL, f"({range[0]},{range[1]})")

tests/_async/test_filter_request_builder.py

+9
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,15 @@ def test_overlaps(filter_request_builder):
178178
assert str(builder.params) == "x=ov.%7Bis%3Aclosed%2Cseverity%3Ahigh%7D"
179179

180180

181+
def test_overlaps_with_timestamp_range(filter_request_builder):
182+
builder = filter_request_builder.overlaps("x", "[2000-01-01 12:45, 2000-01-01 13:15)")
183+
184+
# {a,["b",%20"c"]}
185+
assert (
186+
str(builder.params) == "x=ov.%5B2000-01-01%2012%3A45%2C%202000-01-01%2013%3A15%29"
187+
)
188+
189+
181190
def test_like(filter_request_builder):
182191
builder = filter_request_builder.like("x", "%a%")
183192

tests/_async/test_filter_request_builder_integration.py

+14
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,20 @@ async def test_overlaps():
200200
]
201201

202202

203+
async def test_overlaps_with_timestamp_range():
204+
res = (
205+
await rest_client()
206+
.from_("reservations")
207+
.select("room_name")
208+
.overlaps("during", "[2000-01-01 12:45, 2000-01-01 13:15)")
209+
.execute()
210+
)
211+
212+
assert res.data == [
213+
{"room_name": "Emerald"},
214+
]
215+
216+
203217
async def test_like():
204218
res = (
205219
await rest_client()

tests/_sync/test_filter_request_builder.py

+9
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,15 @@ def test_overlaps(filter_request_builder):
178178
assert str(builder.params) == "x=ov.%7Bis%3Aclosed%2Cseverity%3Ahigh%7D"
179179

180180

181+
def test_overlaps_with_timestamp_range(filter_request_builder):
182+
builder = filter_request_builder.overlaps("x", "[2000-01-01 12:45, 2000-01-01 13:15)")
183+
184+
# {a,["b",%20"c"]}
185+
assert (
186+
str(builder.params) == "x=ov.%5B2000-01-01%2012%3A45%2C%202000-01-01%2013%3A15%29"
187+
)
188+
189+
181190
def test_like(filter_request_builder):
182191
builder = filter_request_builder.like("x", "%a%")
183192

tests/_sync/test_filter_request_builder_integration.py

+14
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,20 @@ def test_overlaps():
193193
]
194194

195195

196+
def test_overlaps_with_timestamp_range():
197+
res = (
198+
rest_client()
199+
.from_("reservations")
200+
.select("room_name")
201+
.overlaps("during", "[2000-01-01 12:45, 2000-01-01 13:15)")
202+
.execute()
203+
)
204+
205+
assert res.data == [
206+
{"room_name": "Emerald"},
207+
]
208+
209+
196210
def test_like():
197211
res = (
198212
rest_client()

0 commit comments

Comments
 (0)