Skip to content

Commit b4e547a

Browse files
committed
RDBC-1059 Fix spatial order_by_distance dynamic-field quoting
1 parent 80e29f9 commit b4e547a

2 files changed

Lines changed: 57 additions & 4 deletions

File tree

ravendb/documents/session/query.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1533,7 +1533,7 @@ def _order_by_distance(
15331533
raise ValueError("Field cannot be None")
15341534
self.__assert_is_dynamic_query(field_or_field_name, "orderByDistance")
15351535
round_factor = field_or_field_name.round_factor
1536-
field_name = f"'{field_or_field_name.to_field(self._ensure_valid_field_name)}'"
1536+
field_name = field_or_field_name.to_field(self._ensure_valid_field_name)
15371537
else:
15381538
field_name = field_or_field_name
15391539

@@ -1560,7 +1560,7 @@ def _order_by_distance_wkt(
15601560
raise ValueError("Field cannot be None")
15611561
self.__assert_is_dynamic_query(field_or_field_name, "orderByDistance")
15621562
round_factor = field_or_field_name.round_factor
1563-
field_name = f"'{field_or_field_name.to_field(self._ensure_valid_field_name)}'"
1563+
field_name = field_or_field_name.to_field(self._ensure_valid_field_name)
15641564
else:
15651565
round_factor = self.__add_query_parameter(round_factor) if round_factor != 0 else None
15661566
field_name = field_or_field_name
@@ -1584,7 +1584,7 @@ def _order_by_distance_descending(
15841584
raise ValueError("Field cannot be None")
15851585
self.__assert_is_dynamic_query(field_or_field_name, "orderByDistanceDescending")
15861586
round_factor = field_or_field_name.round_factor
1587-
field_name = f"'{field_or_field_name.to_field(self._ensure_valid_field_name)}'"
1587+
field_name = field_or_field_name.to_field(self._ensure_valid_field_name)
15881588
else:
15891589
round_factor = self.__add_query_parameter(round_factor) if round_factor != 0 else None
15901590
field_name = field_or_field_name
@@ -1613,7 +1613,7 @@ def _order_by_distance_descending_wkt(
16131613
raise ValueError("Field cannot be None")
16141614
self.__assert_is_dynamic_query(field_or_field_name, "orderByDistanceDescending")
16151615
round_factor = field_or_field_name.round_factor
1616-
field_name = f"'{field_or_field_name.to_field(self._ensure_valid_field_name)}'"
1616+
field_name = field_or_field_name.to_field(self._ensure_valid_field_name)
16171617
else:
16181618
round_factor = self.__add_query_parameter(round_factor) if round_factor != 0 else None
16191619
field_name = field_or_field_name
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
"""
2+
Regression test for the 7.2.3 spatial-quoting fix.
3+
4+
Before the fix, dynamic spatial fields were wrapped in single quotes in the
5+
order_by_distance* methods (e.g. 'point(...)') which produced invalid RQL
6+
for projection / aliased queries. The fix drops the quotes; the field name
7+
is used verbatim.
8+
"""
9+
10+
import unittest
11+
from typing import Optional
12+
13+
from ravendb.documents.queries.spatial import PointField, WktField
14+
from ravendb.tests.test_base import TestBase
15+
16+
17+
class _Geo:
18+
def __init__(
19+
self,
20+
Id: Optional[str] = None,
21+
lat: Optional[float] = None,
22+
lng: Optional[float] = None,
23+
):
24+
self.Id = Id
25+
self.lat = lat
26+
self.lng = lng
27+
28+
29+
class TestOrderByDistanceQuoting(TestBase):
30+
def setUp(self):
31+
super().setUp()
32+
with self.store.open_session() as s:
33+
s.store(_Geo(lat=51.4779, lng=0.0015), "geo/1") # near Greenwich
34+
s.store(_Geo(lat=40.7128, lng=-74.0060), "geo/2") # New York
35+
s.save_changes()
36+
37+
def test_order_by_distance_with_dynamic_point_field(self):
38+
with self.store.open_session() as s:
39+
results = list(s.query(object_type=_Geo).order_by_distance(PointField("lat", "lng"), 51.4779, 0.0015))
40+
self.assertGreaterEqual(len(results), 2)
41+
self.assertEqual("geo/1", results[0].Id)
42+
43+
def test_order_by_distance_descending_with_dynamic_point_field(self):
44+
with self.store.open_session() as s:
45+
results = list(
46+
s.query(object_type=_Geo).order_by_distance_descending(PointField("lat", "lng"), 51.4779, 0.0015)
47+
)
48+
self.assertGreaterEqual(len(results), 2)
49+
self.assertEqual("geo/2", results[0].Id)
50+
51+
52+
if __name__ == "__main__":
53+
unittest.main()

0 commit comments

Comments
 (0)