/*
* Hibernate OGM, Domain model persistence for NoSQL datastores
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.ogm.datastore.neo4j.remote.bolt.dialect.impl;
import java.util.Arrays;
import java.util.Map;
import org.hibernate.ogm.datastore.neo4j.dialect.impl.BaseNeo4jAssociationQueries;
import org.hibernate.ogm.model.key.spi.AssociationKey;
import org.hibernate.ogm.model.key.spi.AssociationKeyMetadata;
import org.hibernate.ogm.model.key.spi.EntityKey;
import org.hibernate.ogm.model.key.spi.EntityKeyMetadata;
import org.hibernate.ogm.model.key.spi.RowKey;
import org.hibernate.ogm.util.impl.ArrayHelper;
import org.neo4j.driver.v1.StatementResult;
import org.neo4j.driver.v1.Transaction;
import org.neo4j.driver.v1.types.Relationship;
/**
* @author Davide D'Alto
*/
public class BoltNeo4jAssociationQueries extends BaseNeo4jAssociationQueries {
public BoltNeo4jAssociationQueries(EntityKeyMetadata ownerEntityKeyMetadata, AssociationKeyMetadata associationKeyMetadata) {
super( ownerEntityKeyMetadata, associationKeyMetadata );
}
public void removeAssociation(Transaction tx, AssociationKey associationKey) {
tx.run( removeAssociationQuery, params( associationKey.getEntityKey().getColumnValues() ) );
}
public Relationship findRelationship(Transaction tx, AssociationKey associationKey, RowKey rowKey) {
Object[] relationshipValues = relationshipValues( associationKey, rowKey );
Object[] queryValues = ArrayHelper.concat( associationKey.getEntityKey().getColumnValues(), relationshipValues );
StatementResult result = tx.run( findRelationshipQuery, params( queryValues ) );
return relationship( result );
}
private Relationship relationship(StatementResult result) {
if ( result.hasNext() ) {
return result.next().get( 0 ).asRelationship();
}
return null;
}
public Relationship createRelationshipForEmbeddedAssociation(Transaction tx, AssociationKey associationKey, EntityKey embeddedKey,
Object[] relationshipProperties) {
String query = initCreateEmbeddedAssociationQuery( associationKey, embeddedKey );
Object[] queryValues = createRelationshipForEmbeddedQueryValues( associationKey, embeddedKey, relationshipProperties );
StatementResult statementResult = tx.run( query, params( queryValues ) );
return relationship( statementResult );
}
public Relationship createRelationship(Transaction tx, Object[] ownerKeyValues, Object[] targetKeyValues, Object[] relationshipProperties) {
Object[] concat = ArrayHelper.concat( Arrays.asList( ownerKeyValues, targetKeyValues, relationshipProperties ) );
Map<String, Object> params = params( concat );
StatementResult statementResult = tx.run( createRelationshipQuery, params );
return relationship( statementResult );
}
public void removeAssociationRow(Transaction tx, AssociationKey associationKey, RowKey rowKey) {
Object[] relationshipValues = relationshipValues( associationKey, rowKey );
Object[] queryValues = ArrayHelper.concat( associationKey.getEntityKey().getColumnValues(), relationshipValues );
tx.run( removeAssociationRowQuery, params( queryValues ) );
}
}