}
@Override
public ResultIterator<Node> findEntity(EntityTypeMetadata<NodeMetadata> entityTypeMetadata, Label discriminator, Map<PrimitivePropertyMethodMetadata<PropertyMetadata>, Object> values) {
if (values.size() > 1) {
throw new XOException("Only one property value is supported for find operation");
}
Map.Entry<PrimitivePropertyMethodMetadata<PropertyMetadata>, Object> entry = values.entrySet().iterator().next();
PrimitivePropertyMethodMetadata<PropertyMetadata> propertyMethodMetadata = entry.getKey();
if (propertyMethodMetadata == null) {
IndexedPropertyMethodMetadata<?> indexedProperty = entityTypeMetadata.getDatastoreMetadata().getIndexedProperty();
if (indexedProperty == null) {
throw new XOException("Type " + entityTypeMetadata.getAnnotatedType().getAnnotatedElement().getName() + " has no indexed property.");
}
propertyMethodMetadata = indexedProperty.getPropertyMethodMetadata();
}
PropertyMetadata propertyMetadata = propertyMethodMetadata.getDatastoreMetadata();
Object value = entry.getValue();
ResourceIterable<Node> nodesByLabelAndProperty = graphDatabaseService.findNodesByLabelAndProperty(discriminator,
propertyMetadata.getName(), value);
final ResourceIterator<Node> iterator = nodesByLabelAndProperty.iterator();
return new ResultIterator<Node>() {
@Override
public boolean hasNext() {
return iterator.hasNext();
}
@Override
public Node next() {
return iterator.next();
}
@Override
public void remove() {
throw new XOException("Remove operation is not supported for find results.");
}
@Override
public void close() {
iterator.close();