从多个 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)));
  }
});

这将有效地移除所有未能匹配目标距离的实体。