Skip to content

Commit 1593d13

Browse files
committed
factor common logic in Distance lookups
1 parent 673ac3e commit 1593d13

File tree

1 file changed

+20
-26
lines changed

1 file changed

+20
-26
lines changed

django_mongodb_backend/gis/operators.py

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -49,46 +49,40 @@ def as_mql(self, field, value, params=None):
4949
}
5050

5151

52-
class DistanceGTE(Operator):
53-
name = "distance_gte"
52+
class DistanceLTE(Operator):
53+
name = "distance_lte"
5454

55-
def as_mql(self, field, value, params=None):
56-
distance = params[0].m if hasattr(params[0], "m") else params[0]
55+
def get_geo_within(self, value, params):
56+
distance = params[0]
57+
# Get the distance in meters if it's a Distance object.
58+
distance = distance.m if hasattr(distance, "m") else distance
5759
return {
58-
field: {
59-
"$not": {
60-
"$geoWithin": {
61-
"$centerSphere": [
62-
value["coordinates"],
63-
distance / 6378100, # radius of earth in meters
64-
],
65-
}
66-
}
60+
"$geoWithin": {
61+
"$centerSphere": [
62+
value["coordinates"],
63+
distance / 6378100, # radius of earth in meters
64+
],
6765
}
6866
}
6967

68+
def as_mql(self, field, value, params=None):
69+
return {field: self.get_geo_within(value, params)}
7070

71-
class DistanceLTE(Operator):
72-
name = "distance_lte"
71+
72+
class DistanceGTE(DistanceLTE):
73+
name = "distance_gte"
7374

7475
def as_mql(self, field, value, params=None):
75-
distance = params[0].m if hasattr(params[0], "m") else params[0]
76-
return {
77-
field: {
78-
"$geoWithin": {
79-
"$centerSphere": [
80-
value["coordinates"],
81-
distance / 6378100, # radius of earth in meters
82-
],
83-
}
84-
}
85-
}
76+
return {field: {"$not": self.get_geo_within(value, params)}}
8677

8778

8879
class DWithin(Operator):
8980
name = "dwithin"
9081

9182
def as_mql(self, field, value, params=None):
83+
# The parameter is always in degrees. GISOperations.get_distance()
84+
# prohibits using Distance objects since MongoDB doesn't support any
85+
# projected systems.
9286
param = radians(params[0])
9387
return {field: {"$geoWithin": {"$centerSphere": [value["coordinates"], param]}}}
9488

0 commit comments

Comments
 (0)