private ClosableIterator closableIterator()

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