feat: liveQuery support for unsorted distance queries (#8221)
This commit is contained in:
@@ -1156,6 +1156,40 @@ describe('ParseLiveQuery', function () {
|
|||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('can subscribe to query and return object with withinKilometers with last parameter on update', async done => {
|
||||||
|
await reconfigureServer({
|
||||||
|
liveQuery: {
|
||||||
|
classNames: ['TestObject'],
|
||||||
|
},
|
||||||
|
startLiveQueryServer: true,
|
||||||
|
verbose: false,
|
||||||
|
silent: true,
|
||||||
|
});
|
||||||
|
const object = new TestObject();
|
||||||
|
const firstPoint = new Parse.GeoPoint({ latitude: 40.0, longitude: -30.0 });
|
||||||
|
object.set({ location: firstPoint });
|
||||||
|
await object.save();
|
||||||
|
|
||||||
|
// unsorted will use $centerSphere operator
|
||||||
|
const sorted = false;
|
||||||
|
const query = new Parse.Query(TestObject);
|
||||||
|
query.withinKilometers(
|
||||||
|
'location',
|
||||||
|
new Parse.GeoPoint({ latitude: 40.0, longitude: -30.0 }),
|
||||||
|
2,
|
||||||
|
sorted
|
||||||
|
);
|
||||||
|
const subscription = await query.subscribe();
|
||||||
|
subscription.on('update', obj => {
|
||||||
|
expect(obj.id).toBe(object.id);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
|
||||||
|
const secondPoint = new Parse.GeoPoint({ latitude: 40.0, longitude: -30.0 });
|
||||||
|
object.set({ location: secondPoint });
|
||||||
|
await object.save();
|
||||||
|
});
|
||||||
|
|
||||||
afterEach(async function (done) {
|
afterEach(async function (done) {
|
||||||
const client = await Parse.CoreManager.getLiveQueryController().getDefaultLiveQueryClient();
|
const client = await Parse.CoreManager.getLiveQueryController().getDefaultLiveQueryClient();
|
||||||
client.close();
|
client.close();
|
||||||
|
|||||||
@@ -344,9 +344,25 @@ function matchesKeyConstraints(object, key, constraints) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case '$geoWithin': {
|
case '$geoWithin': {
|
||||||
const points = compareTo.$polygon.map(geoPoint => [geoPoint.latitude, geoPoint.longitude]);
|
if (compareTo.$polygon) {
|
||||||
const polygon = new Parse.Polygon(points);
|
const points = compareTo.$polygon.map(geoPoint => [
|
||||||
return polygon.containsPoint(object[key]);
|
geoPoint.latitude,
|
||||||
|
geoPoint.longitude,
|
||||||
|
]);
|
||||||
|
const polygon = new Parse.Polygon(points);
|
||||||
|
return polygon.containsPoint(object[key]);
|
||||||
|
}
|
||||||
|
if (compareTo.$centerSphere) {
|
||||||
|
const [WGS84Point, maxDistance] = compareTo.$centerSphere;
|
||||||
|
const centerPoint = new Parse.GeoPoint({
|
||||||
|
latitude: WGS84Point[1],
|
||||||
|
longitude: WGS84Point[0],
|
||||||
|
});
|
||||||
|
const point = new Parse.GeoPoint(object[key]);
|
||||||
|
const distance = point.radiansTo(centerPoint);
|
||||||
|
return distance <= maxDistance;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
case '$geoIntersects': {
|
case '$geoIntersects': {
|
||||||
const polygon = new Parse.Polygon(object[key].coordinates);
|
const polygon = new Parse.Polygon(object[key].coordinates);
|
||||||
|
|||||||
Reference in New Issue
Block a user