public ClosableIterator executeBackendQuery()

in neo4j/src/main/java/org/hibernate/ogm/datastore/neo4j/HttpNeo4jDialect.java [542:581]


	public ClosableIterator<Tuple> executeBackendQuery(BackendQuery<String> backendQuery, QueryParameters queryParameters, TupleContext tupleContext) {
		Map<String, Object> parameters = getParameters( queryParameters );
		String nativeQuery = buildNativeQuery( backendQuery, queryParameters );

		Statement statement = new Statement( nativeQuery, parameters );
		Statements statements = new Statements();
		statements.addStatement( statement );

		Long txId = transactionId( tupleContext.getTransactionContext() );
		StatementsResponse response = null;
		if ( backendQuery.getSingleEntityMetadataInformationOrNull() != null ) {
			response = client.executeQueriesInOpenTransaction( txId, statements );
			validate( response, nativeQuery );
			EntityKeyMetadata entityKeyMetadata = backendQuery.getSingleEntityMetadataInformationOrNull().getEntityKeyMetadata();
			HttpNeo4jEntityQueries queries = getEntityQueries( entityKeyMetadata, tupleContext );
			List<StatementResult> results = response.getResults();
			List<Row> rows = results.get( 0 ).getData();
			EntityKey[] keys = new EntityKey[ rows.size() ];
			for ( int i = 0; i < rows.size(); i++ ) {
				List<Node> nodes = rows.get( i ).getGraph().getNodes();

				if ( nodes.isEmpty() ) {
					// Projections and addEntities are not allowed in the same query at the same time
					throw log.addEntityNotAllowedInNativeQueriesUsingProjection( entityKeyMetadata.getTable(), backendQuery.getQuery() );
				}

				Node node = nodes.get( 0 );
				Object[] values = columnValues( node, entityKeyMetadata );
				keys[i] = new EntityKey( entityKeyMetadata, values );
			}
			ClosableIterator<NodeWithEmbeddedNodes> entities = getEntityQueries( entityKeyMetadata, tupleContext ).findEntities( client, keys, txId );
			return new HttpNeo4jNodesTupleIterator( client, txId, queries, entityKeyMetadata, tupleContext.getTupleTypeContext(), entities );
		}
		else {
			statement.setResultDataContents( Arrays.asList( Statement.AS_ROW ) );
			response = client.executeQueriesInOpenTransaction( txId, statements );
			validate( response, nativeQuery );
			return new HttpNeo4jMapsTupleIterator( response.getResults().get( 0 ) );
		}
	}