Skip to content

Commit d00b8d0

Browse files
committed
feat: add constraint to polygon
1 parent 14be107 commit d00b8d0

File tree

2 files changed

+57
-3
lines changed

2 files changed

+57
-3
lines changed

packages/dart/lib/src/network/parse_query.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,15 @@ class QueryBuilder<T extends ParseObject> {
302302
_SINGLE_QUERY, '"$column":{"\$geoWithin":${jsonEncode(dictionary)}}'));
303303
}
304304

305+
/// Add a constraint to the query that requires a particular key's coordinates that contains a point
306+
void wherePolygonContains(String column,ParseGeoPoint point){
307+
final double latitude = point.latitude;
308+
final double longitude = point.longitude;
309+
310+
queries.add(MapEntry<String, dynamic>(_SINGLE_QUERY,
311+
'"$column":{"\$geoIntersects":{"\$point":{"__type":"GeoPoint","latitude":$latitude,"longitude":$longitude}}}'));
312+
}
313+
305314
/// Add a constraint to the query that requires a particular key's value match another QueryBuilder
306315
void whereMatchesQuery<E extends ParseObject>(
307316
String column, QueryBuilder<E> query) {

packages/dart/test/parse_query_test.dart

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ import 'parse_query_test.mocks.dart';
88
@GenerateMocks([ParseClient])
99
void main() {
1010
group('queryBuilder', () {
11-
test('whereRelatedTo', () async {
12-
final MockParseClient client = MockParseClient();
13-
11+
setUp(() async {
1412
await Parse().initialize(
1513
'appId',
1614
'https://test.parse.com',
@@ -24,6 +22,10 @@ void main() {
2422
// to prevent automatic detection
2523
appVersion: 'someAppVersion',
2624
);
25+
});
26+
27+
test('whereRelatedTo', () async {
28+
final MockParseClient client = MockParseClient();
2729

2830
final QueryBuilder<ParseObject> queryBuilder =
2931
QueryBuilder<ParseObject>(ParseObject('_User', client: client));
@@ -62,5 +64,48 @@ void main() {
6264
'where={"\$relatedTo":{"object":{"__type":"Pointer","className":"Post","objectId":"8TOXdXf3tz"},"key":"likes"}}');
6365
expect(result.query, expectedQuery.query);
6466
});
67+
68+
test('wherePolygonContains', () async {
69+
final MockParseClient client = MockParseClient();
70+
71+
final QueryBuilder<ParseObject> queryBuilder =
72+
QueryBuilder<ParseObject>(ParseObject('TEST_SCHEMA', client: client));
73+
double latitude = 84.17724609375;
74+
double longitude = -53.69670647530323;
75+
ParseGeoPoint point =
76+
ParseGeoPoint(latitude: latitude, longitude: longitude);
77+
queryBuilder.wherePolygonContains("geometry", point);
78+
79+
when(client.get(
80+
any,
81+
options: anyNamed("options"),
82+
onReceiveProgress: anyNamed("onReceiveProgress"),
83+
)).thenAnswer((_) async => ParseNetworkResponse(
84+
statusCode: 200,
85+
data:
86+
'{"results":[{"objectId":"eT9muOxBTK","createdAt":"2022-07-25T13:46:06.092Z","updatedAt":"2022-07-25T13:46:23.586Z","geometry": {"type": "Polygon","coordinates": [[[84.17724609375,-53.69670647530323],[83.1884765625,-54.61025498157913],[84.814453125,-55.14120964449505],[85.67138671875,-54.40614309031968],[84.17724609375,-53.69670647530323]]]}}]}'));
87+
88+
ParseResponse response = await queryBuilder.query();
89+
90+
expect(response.results?.first, isA<ParseObject>());
91+
92+
ParseObject parseObject = response.results?.first;
93+
94+
expect(parseObject.objectId, "eT9muOxBTK");
95+
expect(parseObject.containsKey("geometry"), true);
96+
97+
final Uri result = Uri.parse(verify(client.get(
98+
captureAny,
99+
options: anyNamed("options"),
100+
onReceiveProgress: anyNamed("onReceiveProgress"),
101+
)).captured.single);
102+
103+
expect(result.path, '/classes/TEST_SCHEMA');
104+
105+
final Uri expectedQuery = Uri(
106+
query:
107+
'where={"geometry":{"\$geoIntersects":{"\$point":{"__type":"GeoPoint","latitude":$latitude,"longitude":$longitude}}}}');
108+
expect(result.query, expectedQuery.query);
109+
});
65110
});
66111
}

0 commit comments

Comments
 (0)