in neo4j/src/main/java/org/hibernate/ogm/datastore/neo4j/remote/http/dialect/impl/HttpNeo4jEntityQueries.java [243:287]
private ClosableIterator<NodeWithEmbeddedNodes> closableIterator(List<StatementResult> results, EntityKey[] keys) {
if ( results != null ) {
List<Row> data = results.get( 0 ).getData();
if ( data.size() > 0 ) {
List<Node> owners = new ArrayList<>();
Map<Long, Map<String, Collection<Node>>> nodes = new HashMap<>();
for ( Row row : data ) {
if ( row.getGraph().getNodes().size() > 0 ) {
Node owner = findEntity( row.getGraph().getNodes() );
Map<String, Collection<Node>> embeddedNodesMap = nodes.get( owner.getId() );
if ( embeddedNodesMap == null ) {
embeddedNodesMap = new HashMap<>();
nodes.put( owner.getId(), embeddedNodesMap );
owners.add( owner );
}
updateEmbeddedNodesMap( embeddedNodesMap, row.getGraph().getNodes(), row.getGraph().getRelationships(), owner );
}
}
if ( keys == null ) {
List<NodeWithEmbeddedNodes> nodeWithEmbeddeds = new ArrayList<>();
for ( Node owner : owners ) {
nodeWithEmbeddeds.add( new NodeWithEmbeddedNodes( owner, nodes.get( owner.getId() ) ) );
}
return new ClosableIteratorAdapter<>( nodeWithEmbeddeds.iterator() );
}
else {
NodeWithEmbeddedNodes[] array = new NodeWithEmbeddedNodes[keys.length];
for ( Node owner : owners ) {
int index = findKeyIndex( keys, owner );
if ( index > -1 ) {
array[index] = new NodeWithEmbeddedNodes( owner, nodes.get( owner.getId() ) );
}
}
List<NodeWithEmbeddedNodes> nullRemoved = new ArrayList<>();
for ( NodeWithEmbeddedNodes node : array ) {
if ( node != null ) {
nullRemoved.add( node );
}
}
return new ClosableIteratorAdapter<>( nullRemoved.iterator() );
}
}
}
return EMPTY_NODES;
}