从多个 Entity 对象创建 EntityIterable
Creating a EntityIterable from multiple Entity objects
我正在尝试使用 Xodus 实现“附近”过滤器,代码如下:
AtomicReference<EntityIterable> referenceToScope = ...;
PropertyNearbyCondition propertyNearbyCondition = (PropertyNearbyCondition) entityCondition;
String propertyName = propertyNearbyCondition.propertyName();
Double longitude = propertyNearbyCondition.longitude();
Double latitude = propertyNearbyCondition.latitude();
Double distance = propertyNearbyCondition.distance();
EntityIterable entities =
referenceToScope.get().intersect(txn.findWithProp(entityType, propertyName));
List<Entity> entityList = new ArrayList<>();
entities.forEach(entity -> {
GeoPoint reference = (GeoPoint) entity.getProperty(propertyName);
double instantaneousDistance =
MathHelper.distFrom(latitude, longitude, reference.getLatitude(),
reference.getLatitude());
if (distance >= instantaneousDistance) {
entityList.add(entity);
}
});
EntityIterable scoped = referenceToScope.get().intersect(build(entityList));
EntityIterable build(List<Entity> entityList) {
// TODO: Build a new EntityIterable from the entityList
}
算法可能不是最好的,但是,这里的主要问题是如何从多个实体对象构建一个新的EntityIterable
?这可能吗?
我基本上收集“附近”实体的解决方案是使用自定义 GeoPoint
属性 遍历所有实体,然后对于找到的每个实体,比较其 GeoPoint 属性 的距离如果这是一个命中,那么所有这些实体应该被收集到一个 EntityIterable.
如何从 Entity
个对象的列表中构建一个 EntityIterable
?
更新:
逐步解释这是如何工作的:
下面的代码获取所有具有给定 属性 名称的实体,例如geoLocation
EntityIterable entities =
referenceToScope.get().intersect(txn.findWithProp(entityType, propertyName));
然后对于所有具有此类地理定位的实体 属性 例如,对其进行迭代以计算它是否满足距离目标:
List<Entity> entityList = new ArrayList<>();
entities.forEach(entity -> {
// compute the distance target
});
将实体添加到新的List
,如果它符合目标。
从这里需要做的是删除 EntityIterable entities
中不等于 实体 中匹配的 ID 的所有实体 entityList
或者将这些匹配的实体相交到 referenceToScope.get()
而不是 EntityIterable entities
(只是为了避免混淆,这个 entities
iterable 只是一个临时一)
解决方法如下:
entities.forEach(entity -> {
GeoPoint reference = (GeoPoint) entity.getProperty(propertyName);
double instantaneousDistance =
MathHelper.distFrom(latitude, longitude, reference.getLatitude(),
reference.getLatitude());
if (distance < instantaneousDistance) {
referenceToScope.set(referenceToScope.get().minus(txn.getSingletonIterable(entity)));
}
});
这将有效地移除所有未能匹配目标距离的实体。
我正在尝试使用 Xodus 实现“附近”过滤器,代码如下:
AtomicReference<EntityIterable> referenceToScope = ...;
PropertyNearbyCondition propertyNearbyCondition = (PropertyNearbyCondition) entityCondition;
String propertyName = propertyNearbyCondition.propertyName();
Double longitude = propertyNearbyCondition.longitude();
Double latitude = propertyNearbyCondition.latitude();
Double distance = propertyNearbyCondition.distance();
EntityIterable entities =
referenceToScope.get().intersect(txn.findWithProp(entityType, propertyName));
List<Entity> entityList = new ArrayList<>();
entities.forEach(entity -> {
GeoPoint reference = (GeoPoint) entity.getProperty(propertyName);
double instantaneousDistance =
MathHelper.distFrom(latitude, longitude, reference.getLatitude(),
reference.getLatitude());
if (distance >= instantaneousDistance) {
entityList.add(entity);
}
});
EntityIterable scoped = referenceToScope.get().intersect(build(entityList));
EntityIterable build(List<Entity> entityList) {
// TODO: Build a new EntityIterable from the entityList
}
算法可能不是最好的,但是,这里的主要问题是如何从多个实体对象构建一个新的EntityIterable
?这可能吗?
我基本上收集“附近”实体的解决方案是使用自定义 GeoPoint
属性 遍历所有实体,然后对于找到的每个实体,比较其 GeoPoint 属性 的距离如果这是一个命中,那么所有这些实体应该被收集到一个 EntityIterable.
如何从 Entity
个对象的列表中构建一个 EntityIterable
?
更新:
逐步解释这是如何工作的:
下面的代码获取所有具有给定 属性 名称的实体,例如geoLocation
EntityIterable entities =
referenceToScope.get().intersect(txn.findWithProp(entityType, propertyName));
然后对于所有具有此类地理定位的实体 属性 例如,对其进行迭代以计算它是否满足距离目标:
List<Entity> entityList = new ArrayList<>();
entities.forEach(entity -> {
// compute the distance target
});
将实体添加到新的List
,如果它符合目标。
从这里需要做的是删除 EntityIterable entities
中不等于 实体 中匹配的 ID 的所有实体 entityList
或者将这些匹配的实体相交到 referenceToScope.get()
而不是 EntityIterable entities
(只是为了避免混淆,这个 entities
iterable 只是一个临时一)
解决方法如下:
entities.forEach(entity -> {
GeoPoint reference = (GeoPoint) entity.getProperty(propertyName);
double instantaneousDistance =
MathHelper.distFrom(latitude, longitude, reference.getLatitude(),
reference.getLatitude());
if (distance < instantaneousDistance) {
referenceToScope.set(referenceToScope.get().minus(txn.getSingletonIterable(entity)));
}
});
这将有效地移除所有未能匹配目标距离的实体。