Skip to content

Commit 97ce718

Browse files
Copilotanidotnet
andcommitted
Fix repository queries by handling Document-serialized geometries
Co-authored-by: anidotnet <[email protected]>
1 parent fac5944 commit 97ce718

File tree

2 files changed

+54
-2
lines changed

2 files changed

+54
-2
lines changed

packages/nitrite_spatial/lib/src/filter.dart

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:dart_jts/dart_jts.dart';
22
import 'package:nitrite/nitrite.dart';
3+
import 'package:nitrite_spatial/src/geom_utils.dart';
34
import 'package:nitrite_spatial/src/indexer.dart';
45

56
/// The abstract base class for all spatial filters in Nitrite.
@@ -57,11 +58,25 @@ class _GeometryValidationFilter extends FieldBasedFilter {
5758
} catch (e) {
5859
return false;
5960
}
61+
} else if (fieldValue is Document) {
62+
// For entity repositories, geometry is stored as a Document with serialized string
63+
try {
64+
var geometryString = fieldValue['geometry'] as String?;
65+
if (geometryString != null) {
66+
documentGeometry = GeometrySerializer.deserialize(geometryString);
67+
}
68+
} catch (e) {
69+
return false;
70+
}
6071
} else {
6172
return false;
6273
}
6374

64-
return _validator(documentGeometry!, value as Geometry);
75+
if (documentGeometry == null) {
76+
return false;
77+
}
78+
79+
return _validator(documentGeometry, value as Geometry);
6580
}
6681
}
6782

@@ -258,10 +273,24 @@ class _NearValidationFilter extends NitriteFilter {
258273
} catch (e) {
259274
return false;
260275
}
276+
} else if (fieldValue is Document) {
277+
// For entity repositories, geometry is stored as a Document with serialized string
278+
try {
279+
var geometryString = fieldValue['geometry'] as String?;
280+
if (geometryString != null) {
281+
documentGeometry = GeometrySerializer.deserialize(geometryString);
282+
}
283+
} catch (e) {
284+
return false;
285+
}
261286
} else {
262287
return false;
263288
}
264289

290+
if (documentGeometry == null) {
291+
return false;
292+
}
293+
265294
// For near queries, check if the geometry is within the distance
266295
// For points, check direct distance. For other geometries, check if they intersect the circle.
267296
if (documentGeometry is Point) {
@@ -272,7 +301,7 @@ class _NearValidationFilter extends NitriteFilter {
272301
} else {
273302
// For non-point geometries, check if they intersect the circle
274303
var circle = _createCircle(center, radius);
275-
return documentGeometry!.intersects(circle);
304+
return documentGeometry.intersects(circle);
276305
}
277306
}
278307
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import 'package:dart_jts/dart_jts.dart';
2+
import 'package:nitrite/nitrite.dart';
3+
import 'package:nitrite_spatial/nitrite_spatial.dart' as spatial;
4+
5+
void main() async {
6+
print('Testing filter apply directly...');
7+
8+
var reader = WKTReader();
9+
var polygon = reader.read('POLYGON ((490 490, 536 490, 536 515, 490 515, 490 490))');
10+
var point = reader.read('POINT (500 505)');
11+
12+
// Create a document with the geometry
13+
var doc = createDocument('geometry', point);
14+
15+
// Create the filter
16+
var filter = spatial.where('geometry').intersects(polygon!);
17+
18+
// Apply the filter
19+
var result = filter.apply(doc);
20+
21+
print('Filter result: $result');
22+
print('Expected: true');
23+
}

0 commit comments

Comments
 (0)