in neo4j/src/main/java/org/hibernate/ogm/datastore/neo4j/dialect/impl/BaseNeo4jAssociationQueries.java [360:416]
private void createRelationshipforCollectionOfComponents(AssociationKey associationKey, String collectionRole, String[] embeddedColumnNames, Object[] embeddedColumnValues, StringBuilder queryBuilder) {
int offset = associationKey.getEntityKey().getColumnNames().length;
if ( isPartOfEmbedded( collectionRole ) ) {
String[] pathToEmbedded = appendEmbeddedNodes( collectionRole, queryBuilder );
queryBuilder.append( " MERGE (e) -[r:" );
appendRelationshipType( queryBuilder, pathToEmbedded[pathToEmbedded.length - 1] );
}
else {
queryBuilder.append( " MERGE (owner) -[r:" );
appendRelationshipType( queryBuilder, collectionRole );
}
appendProperties( queryBuilder, associationKey.getMetadata().getRowKeyIndexColumnNames(), offset );
offset += associationKey.getMetadata().getRowKeyIndexColumnNames().length;
queryBuilder.append( "]-> " );
queryBuilder.append( "(target:" );
queryBuilder.append( EMBEDDED );
queryBuilder.append( ":" );
escapeIdentifier( queryBuilder, associationKey.getMetadata().getAssociatedEntityKeyMetadata().getEntityKeyMetadata().getTable() );
int index = 0;
int embeddedNumber = 0;
EmbeddedNodesTree tree = createEmbeddedTree( collectionRole, embeddedColumnNames, embeddedColumnValues, offset );
if ( !hasRowIndex( associationKey ) ) {
appendPrimitiveProperties( queryBuilder, index, tree );
}
queryBuilder.append( ")" );
// Append relationships representing embedded properties
Map<String, EmbeddedNodesTree> children = tree.getChildren();
boolean first = true;
for ( Entry<String, EmbeddedNodesTree> entry : children.entrySet() ) {
index = 0;
String relationshipType = entry.getKey();
EmbeddedNodesTree child = entry.getValue();
if ( first ) {
first = false;
}
else {
queryBuilder.append( ", (target)" );
}
queryBuilder.append( " - [:" );
appendRelationshipType( queryBuilder, relationshipType );
queryBuilder.append( "] -> " );
queryBuilder.append( "(a" );
queryBuilder.append( embeddedNumber++ );
queryBuilder.append( ":" );
queryBuilder.append( EMBEDDED );
appendPrimitiveProperties( queryBuilder, index, child );
queryBuilder.append( ")" );
}
if ( hasRowIndex( associationKey ) && !tree.getProperties().isEmpty() ) {
queryBuilder.append( " SET target = " );
appendPrimitiveProperties( queryBuilder, index, tree );
}
queryBuilder.append( " RETURN r" );
}