package edu.isi.bmkeg.lapdf.model.RTree;
import edu.isi.bmkeg.lapdf.model.ChunkBlock;
import edu.isi.bmkeg.lapdf.model.WordBlock;
import edu.isi.bmkeg.lapdf.model.ordering.SpatialOrdering;
import edu.isi.bmkeg.lapdf.model.spatial.SpatialEntity;
import gnu.trove.TIntProcedure;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.TreeSet;
public class RTProcedure implements TIntProcedure {
private Collection<SpatialEntity> foundEntities;
private RTSpatialRepresentation tree;
private Class type = null;
private RTSpatialEntity sourceEnity;
private boolean isContainmentQuery;
public RTProcedure(RTSpatialRepresentation tree, String ordering,
RTSpatialEntity sourceEntity, Class type, boolean isContainmentQuery) {
this.tree = tree;
if (ordering != null) {
foundEntities = new TreeSet<SpatialEntity>(new SpatialOrdering(
ordering));
} else {
foundEntities = new ArrayList<SpatialEntity>();
}
this.type = type;
this.sourceEnity = sourceEntity;
this.isContainmentQuery = isContainmentQuery;
}
@Override
public boolean execute(int id) {
SpatialEntity entity = this.tree.getEntity(id);
if (type != null) {
if (checkType(entity) && !isSameInstance(sourceEnity, entity)) {
this.foundEntities.add(entity);
}
return true;
} else if (!sourceEnity.equals(entity)) {
this.foundEntities.add(entity);
return true;
}
return true;
}
public List getIntersectionList() {
return new ArrayList(foundEntities);
}
private boolean checkType(SpatialEntity entity) {
Class[] interfaces = entity.getClass().getInterfaces();
for (int i = 0; i < interfaces.length; i++)
if (type.getSimpleName().equals(interfaces[i].getSimpleName()))
return true;
return false;
}
private boolean isSameInstance(SpatialEntity entity1, SpatialEntity entity2) {
if (!this.isContainmentQuery)
return false;
if (entity1 instanceof WordBlock && entity2 instanceof WordBlock) {
return entity1.equals(entity2);
} else if (entity1 instanceof ChunkBlock
&& entity2 instanceof ChunkBlock) {
return entity1.equals(entity2);
} else {
return false;
}
}
}