in neo4j/src/main/java/org/hibernate/ogm/datastore/neo4j/remote/bolt/dialect/impl/BoltNeo4jEntityQueries.java [119:181]
private ClosableIterator<NodeWithEmbeddedNodes> closableIterator(StatementResult results, EntityKey[] keys) {
if ( results != null && results.hasNext() ) {
List<Node> owners = new ArrayList<>();
Map<Long, Map<String, Collection<Node>>> nodes = new HashMap<>();
while ( results.hasNext() ) {
Record record = results.next();
Node owner = asNode( record, BaseNeo4jEntityQueries.ENTITY_ALIAS );
Relationship firstEmbeddedRel = asRelationship( record, BaseNeo4jEntityQueries.FIRST_EMBEDDED_REL_ALIAS );
Node firstEmbeddedNode = asNode( record, BaseNeo4jEntityQueries.FIRST_EMBEDDED_ALIAS );
Map<String, Collection<Node>> embeddedNodesMap = nodes.get( owner.id() );
if ( embeddedNodesMap == null ) {
embeddedNodesMap = new HashMap<>();
nodes.put( owner.id(), embeddedNodesMap );
owners.add( owner );
}
if ( firstEmbeddedRel != null ) {
// Save the first embedded node, the one connected to the owner
StringBuilder builder = new StringBuilder();
builder.append( "." );
builder.append( firstEmbeddedRel.type() );
collectEmbeddedNode( firstEmbeddedNode, embeddedNodesMap, builder );
// Save other embedded nodes, the ones connected to the first embedded node
// The distance between the first one and the last might be made by multiple relationships
List<Relationship> embeddedRelationships = asList( record, BaseNeo4jEntityQueries.EMBEDDED_REL_ALIAS );
if ( !embeddedRelationships.isEmpty() ) {
Node lastEmbeddedNode = asNode( record, BaseNeo4jEntityQueries.EMBEDDED_ALIAS );
for ( Relationship embeddedRel : embeddedRelationships ) {
builder.append( "." );
builder.append( embeddedRel.type() );
}
collectEmbeddedNode( lastEmbeddedNode, embeddedNodesMap, builder );
}
}
}
if ( keys == null ) {
List<NodeWithEmbeddedNodes> nodeWithEmbeddeds = new ArrayList<>();
for ( Node owner : owners ) {
nodeWithEmbeddeds.add( new NodeWithEmbeddedNodes( owner, nodes.get( owner.id() ) ) );
}
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.id() ) );
}
}
List<NodeWithEmbeddedNodes> nullRemoved = new ArrayList<>();
for ( NodeWithEmbeddedNodes node : array ) {
if ( node != null ) {
nullRemoved.add( node );
}
}
return new ClosableIteratorAdapter<>( nullRemoved.iterator() );
}
}
return EMPTY_NODES;
}