private ClosableIterator closableIterator()

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;
	}