Skip to content

Commit

Permalink
OGM-1089 Rebase Neo4j Bolt to the latest changes
Browse files Browse the repository at this point in the history
  • Loading branch information
gsmet committed Oct 3, 2016
1 parent 137367c commit 5a97e77
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 45 deletions.
Expand Up @@ -19,8 +19,6 @@
import org.hibernate.AssertionFailure;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.ogm.datastore.impl.EmptyTupleSnapshot;
import org.hibernate.ogm.datastore.neo4j.logging.impl.Log;
import org.hibernate.ogm.datastore.neo4j.logging.impl.LoggerFactory;
import org.hibernate.ogm.datastore.neo4j.remote.bolt.dialect.impl.BoltNeo4jAssociatedNodesHelper;
Expand All @@ -43,9 +41,12 @@
import org.hibernate.ogm.dialect.spi.AssociationContext;
import org.hibernate.ogm.dialect.spi.ModelConsumer;
import org.hibernate.ogm.dialect.spi.NextValueRequest;
import org.hibernate.ogm.dialect.spi.OperationContext;
import org.hibernate.ogm.dialect.spi.TransactionContext;
import org.hibernate.ogm.dialect.spi.TupleAlreadyExistsException;
import org.hibernate.ogm.dialect.spi.TupleContext;
import org.hibernate.ogm.dialect.spi.TupleTypeContext;
import org.hibernate.ogm.entityentry.impl.TuplePointer;
import org.hibernate.ogm.exception.NotSupportedException;
import org.hibernate.ogm.model.key.spi.AssociatedEntityKeyMetadata;
import org.hibernate.ogm.model.key.spi.AssociationKey;
Expand All @@ -56,6 +57,7 @@
import org.hibernate.ogm.model.spi.Association;
import org.hibernate.ogm.model.spi.AssociationOperation;
import org.hibernate.ogm.model.spi.Tuple;
import org.hibernate.ogm.model.spi.Tuple.SnapshotType;
import org.hibernate.ogm.model.spi.TupleOperation;
import org.hibernate.ogm.model.spi.TupleSnapshot;
import org.hibernate.ogm.persister.impl.OgmCollectionPersister;
Expand Down Expand Up @@ -122,10 +124,8 @@ private Map<EntityKeyMetadata, BoltNeo4jEntityQueries> initializeEntityQueries(S
for ( EntityPersister entityPersister : entityPersisters ) {
if ( entityPersister instanceof OgmEntityPersister ) {
OgmEntityPersister ogmEntityPersister = (OgmEntityPersister) entityPersister;
SessionImplementor currentSession = null;
TupleContext tupleContext = ogmEntityPersister.getTupleContext( currentSession );
queryMap.put( ogmEntityPersister.getEntityKeyMetadata(),
new BoltNeo4jEntityQueries( ogmEntityPersister.getEntityKeyMetadata(), tupleContext ) );
new BoltNeo4jEntityQueries( ogmEntityPersister.getEntityKeyMetadata(), ogmEntityPersister.getTupleTypeContext() ) );
}
}
return queryMap;
Expand Down Expand Up @@ -164,7 +164,7 @@ public ClosableIterator<Tuple> executeBackendQuery(BackendQuery<String> backendQ
}
EntityKey[] keys = entityKeys.toArray( new EntityKey[entityKeys.size()] );
ClosableIterator<NodeWithEmbeddedNodes> entities = entitiesQueries.get( entityKeyMetadata ).findEntities( keys, transaction );
return new BoltNeo4jNodesTupleIterator( transaction, queries, entityKeyMetadata, tupleContext, entities );
return new BoltNeo4jNodesTupleIterator( transaction, queries, entityKeyMetadata, tupleContext.getTupleTypeContext(), entities );
}
else {
Transaction transaction = transaction( tupleContext );
Expand All @@ -173,8 +173,8 @@ public ClosableIterator<Tuple> executeBackendQuery(BackendQuery<String> backendQ
}
}

private Transaction transaction(TupleContext tupleContext) {
return (Transaction) ( tupleContext.getTransactionContext() ).getTransactionId();
private Transaction transaction(OperationContext operationContext) {
return (Transaction) ( operationContext.getTransactionContext() ).getTransactionId();
}

private Transaction transaction(AssociationContext associationContext) {
Expand All @@ -190,22 +190,24 @@ private Object[] columnValues(Map<String, Object> node, EntityKeyMetadata metada
}

@Override
public Tuple getTuple(EntityKey key, TupleContext tupleContext) {
Transaction tx = transaction( tupleContext );
public Tuple getTuple(EntityKey key, OperationContext operationContext) {
Transaction tx = transaction( operationContext );
BoltNeo4jEntityQueries queries = entitiesQueries.get( key.getMetadata() );
NodeWithEmbeddedNodes owner = queries.findEntity( tx, key.getColumnValues() );
if ( owner == null ) {
return null;
}

Map<String, Node> toOneEntities = BoltNeo4jAssociatedNodesHelper.findAssociatedNodes( tx, owner, key.getMetadata(), tupleContext, queries );
Map<String, Node> toOneEntities = BoltNeo4jAssociatedNodesHelper.findAssociatedNodes( tx, owner, key.getMetadata(),
operationContext.getTupleTypeContext(), queries );

return new Tuple(
new BoltNeo4jTupleSnapshot(
owner,
key.getMetadata(),
toOneEntities,
tupleContext ) );
operationContext.getTupleTypeContext() ),
SnapshotType.UPDATE );
}

@Override
Expand Down Expand Up @@ -241,13 +243,15 @@ private List<Tuple> tuplesResult(EntityKey[] keys, TupleContext tupleContext, Cl
EntityKeyMetadata metadata = keys[i].getMetadata();
EntityKey key = keys[i];
BoltNeo4jEntityQueries entityQueries = entitiesQueries.get( key.getMetadata() );
Map<String, Node> toOneEntities = BoltNeo4jAssociatedNodesHelper.findAssociatedNodes( tx, node, metadata, tupleContext, entityQueries );
Map<String, Node> toOneEntities = BoltNeo4jAssociatedNodesHelper.findAssociatedNodes( tx, node, metadata,
tupleContext.getTupleTypeContext(), entityQueries );
tuples[i] = new Tuple(
new BoltNeo4jTupleSnapshot(
node,
metadata,
toOneEntities,
tupleContext ) );
tupleContext.getTupleTypeContext() ),
SnapshotType.UPDATE );
// We assume there are no duplicated keys
break;
}
Expand All @@ -257,12 +261,13 @@ private List<Tuple> tuplesResult(EntityKey[] keys, TupleContext tupleContext, Cl
}

@Override
public void insertOrUpdateTuple(EntityKey key, Tuple tuple, TupleContext tupleContext) throws TupleAlreadyExistsException {
public void insertOrUpdateTuple(EntityKey key, TuplePointer tuplePointer, TupleContext tupleContext) throws TupleAlreadyExistsException {
Tuple tuple = tuplePointer.getTuple();
final Map<String, EntityKey> toOneAssociations = new HashMap<>();
Map<String, Object> properties = new HashMap<>();
List<Statement> statements = new ArrayList<>();
applyTupleOperations( key, tuple, properties, toOneAssociations, statements, tuple.getOperations(), tupleContext, tupleContext.getTransactionContext() );
if ( tuple.getSnapshot() instanceof EmptyTupleSnapshot ) {
if ( SnapshotType.INSERT.equals( tuple.getSnapshotType() ) ) {
// Insert new node
Statement statement = entitiesQueries.get( key.getMetadata() ).getCreateEntityWithPropertiesQueryStatement( key.getColumnValues(), properties );
statements.add( 0, statement );
Expand All @@ -273,11 +278,12 @@ public void insertOrUpdateTuple(EntityKey key, Tuple tuple, TupleContext tupleCo
saveToOneAssociations( statements, key, toOneAssociations );
try {
runAll( transaction( tupleContext ), statements );
tuple.setSnapshotType( SnapshotType.UPDATE );
}
catch (ClientException e) {
switch ( e.neo4jErrorCode() ) {
case BaseNeo4jDialect.CONSTRAINT_VIOLATION_CODE:
throw extractException( key, tuple, e );
throw extractException( key, e );
default:
throw new HibernateException( e.getMessage() );
}
Expand All @@ -295,10 +301,10 @@ private void validate(StatementResult result) {
result.hasNext();
}

private HibernateException extractException(EntityKey key, Tuple tuple, ClientException exception) {
private HibernateException extractException(EntityKey key, ClientException exception) {
if ( exception.getMessage().matches( ".*Node \\d+ already exists with label.*" ) ) {
// This is the exception we expect for this kind of error by the CompensationAPI and some unit tests
return new TupleAlreadyExistsException( key.getMetadata(), tuple, exception.getMessage() );
return new TupleAlreadyExistsException( key, exception.getMessage() );
}
else {
return log.constraintViolation( key, exception.getMessage(), null );
Expand Down Expand Up @@ -340,7 +346,7 @@ private void saveToOneAssociations(List<Statement> statements, EntityKey key, fi
}

private void removeTupleOperation(EntityKey entityKey, Map<String, Object> ownerNode, TupleOperation operation, List<Statement> statements, TupleContext tupleContext, TransactionContext transactionContext, Set<String> processedAssociationRoles) {
if ( !tupleContext.isPartOfAssociation( operation.getColumn() ) ) {
if ( !tupleContext.getTupleTypeContext().isPartOfAssociation( operation.getColumn() ) ) {
if ( isPartOfRegularEmbedded( entityKey.getColumnNames(), operation.getColumn() ) ) {
// Embedded node
Statement statement = entitiesQueries.get( entityKey.getMetadata() ).removeEmbeddedColumnStatement( entityKey.getColumnValues(),
Expand All @@ -353,7 +359,7 @@ private void removeTupleOperation(EntityKey entityKey, Map<String, Object> owner
}
}
else {
String associationRole = tupleContext.getRole( operation.getColumn() );
String associationRole = tupleContext.getTupleTypeContext().getRole( operation.getColumn() );
if ( !processedAssociationRoles.contains( associationRole ) ) {
Transaction tx = (Transaction) transactionContext.getTransactionId();
entitiesQueries.get( entityKey.getMetadata() ).removeToOneAssociation( tx, entityKey.getColumnValues(), associationRole );
Expand All @@ -362,7 +368,7 @@ private void removeTupleOperation(EntityKey entityKey, Map<String, Object> owner
}

private void putTupleOperation(EntityKey entityKey, Tuple tuple, Map<String, Object> node, Map<String, EntityKey> toOneAssociations, List<Statement> statements, TupleOperation operation, TupleContext tupleContext, Set<String> processedAssociationRoles) {
if ( tupleContext.isPartOfAssociation( operation.getColumn() ) ) {
if ( tupleContext.getTupleTypeContext().isPartOfAssociation( operation.getColumn() ) ) {
// the column represents a to-one association, map it as relationship
putOneToOneAssociation( entityKey, tuple, node, toOneAssociations, operation, tupleContext, processedAssociationRoles );
}
Expand All @@ -376,12 +382,12 @@ else if ( isPartOfRegularEmbedded( entityKey.getMetadata().getColumnNames(), ope
}

private void putOneToOneAssociation(EntityKey ownerKey, Tuple tuple, Map<String, Object> node, Map<String, EntityKey> toOneAssociations, TupleOperation operation, TupleContext tupleContext, Set<String> processedAssociationRoles) {
String associationRole = tupleContext.getRole( operation.getColumn() );
String associationRole = tupleContext.getTupleTypeContext().getRole( operation.getColumn() );

if ( !processedAssociationRoles.contains( associationRole ) ) {
processedAssociationRoles.add( associationRole );

EntityKey targetKey = getEntityKey( tuple, tupleContext.getAssociatedEntityKeyMetadata( operation.getColumn() ) );
EntityKey targetKey = getEntityKey( tuple, tupleContext.getTupleTypeContext().getAssociatedEntityKeyMetadata( operation.getColumn() ) );

toOneAssociations.put( associationRole, targetKey );
}
Expand Down Expand Up @@ -421,11 +427,12 @@ private Map<RowKey, Tuple> createAssociationMap(AssociationKey associationKey, A
AssociatedEntityKeyMetadata associatedEntityKeyMetadata = associationContext.getAssociationTypeContext().getAssociatedEntityKeyMetadata();
BoltNeo4jTupleAssociationSnapshot snapshot = new BoltNeo4jTupleAssociationSnapshot( row, associationKey, associatedEntityKeyMetadata );
RowKey rowKey = convert( associationKey, snapshot );
tuples.put( rowKey, new Tuple( snapshot ) );
tuples.put( rowKey, new Tuple( snapshot, SnapshotType.UPDATE ) );
}
return tuples;
}

@Override
protected RowKey convert(AssociationKey associationKey, TupleSnapshot snapshot) {
String[] columnNames = associationKey.getMetadata().getRowKeyColumnNames();
Object[] values = new Object[columnNames.length];
Expand Down Expand Up @@ -548,7 +555,7 @@ public Number nextValue(NextValueRequest request) {
}

@Override
public void forEachTuple(ModelConsumer consumer, TupleContext tupleContext, EntityKeyMetadata entityKeyMetadata) {
public void forEachTuple(ModelConsumer consumer, TupleTypeContext tupleTypeContext, EntityKeyMetadata entityKeyMetadata) {
throw new NotSupportedException( "OGM-1111", "This is not supported yet for Neo4j remote" );
}
}
Expand Up @@ -10,7 +10,7 @@
import java.util.Map;
import java.util.Map.Entry;

import org.hibernate.ogm.dialect.spi.TupleContext;
import org.hibernate.ogm.dialect.spi.TupleTypeContext;
import org.hibernate.ogm.model.key.spi.AssociatedEntityKeyMetadata;
import org.hibernate.ogm.model.key.spi.EntityKeyMetadata;
import org.neo4j.driver.v1.Transaction;
Expand All @@ -26,12 +26,13 @@ public final class BoltNeo4jAssociatedNodesHelper {
private BoltNeo4jAssociatedNodesHelper() {
}

public static Map<String, Node> findAssociatedNodes(Transaction tx, NodeWithEmbeddedNodes node, EntityKeyMetadata entityKeyMetadata, TupleContext tupleContext, BoltNeo4jEntityQueries queries) {
Map<String, Node> associatedNodes = new HashMap<>( tupleContext.getAllAssociatedEntityKeyMetadata().size() );
if ( tupleContext.getAllAssociatedEntityKeyMetadata().size() > 0 ) {
public static Map<String, Node> findAssociatedNodes(Transaction tx, NodeWithEmbeddedNodes node, EntityKeyMetadata entityKeyMetadata,
TupleTypeContext tupleTypeContext, BoltNeo4jEntityQueries queries) {
Map<String, Node> associatedNodes = new HashMap<>( tupleTypeContext.getAllAssociatedEntityKeyMetadata().size() );
if ( tupleTypeContext.getAllAssociatedEntityKeyMetadata().size() > 0 ) {
Object[] keyValues = keyValues( node.getOwner(), entityKeyMetadata );
for ( Entry<String, AssociatedEntityKeyMetadata> entry : tupleContext.getAllAssociatedEntityKeyMetadata().entrySet() ) {
String associationRole = tupleContext.getAllRoles().get( entry.getKey() );
for ( Entry<String, AssociatedEntityKeyMetadata> entry : tupleTypeContext.getAllAssociatedEntityKeyMetadata().entrySet() ) {
String associationRole = tupleTypeContext.getAllRoles().get( entry.getKey() );
Node associatedEntity = queries.findAssociatedEntity( tx, keyValues, associationRole );
associatedNodes.put( associationRole, associatedEntity );
}
Expand Down
Expand Up @@ -19,7 +19,7 @@
import org.hibernate.ogm.datastore.neo4j.remote.common.dialect.impl.RemoteNeo4jAssociationPropertiesRow;
import org.hibernate.ogm.datastore.neo4j.remote.common.util.impl.RemoteNeo4jHelper;
import org.hibernate.ogm.dialect.query.spi.ClosableIterator;
import org.hibernate.ogm.dialect.spi.TupleContext;
import org.hibernate.ogm.dialect.spi.TupleTypeContext;
import org.hibernate.ogm.model.key.spi.EntityKey;
import org.hibernate.ogm.model.key.spi.EntityKeyMetadata;
import org.hibernate.ogm.util.impl.ArrayHelper;
Expand All @@ -45,8 +45,8 @@ public class BoltNeo4jEntityQueries extends BaseNeo4jEntityQueries {
private static final ClosableIteratorAdapter<RemoteNeo4jAssociationPropertiesRow> EMPTY_RELATIONSHIPS = new ClosableIteratorAdapter<>(
EMPTY_RELATIONSHIPS_ITERATOR );

public BoltNeo4jEntityQueries(EntityKeyMetadata entityKeyMetadata, TupleContext tupleContext) {
super( entityKeyMetadata, tupleContext, true );
public BoltNeo4jEntityQueries(EntityKeyMetadata entityKeyMetadata, TupleTypeContext tupleTypeContext) {
super( entityKeyMetadata, tupleTypeContext, true );
}

public NodeWithEmbeddedNodes findEntity(Transaction tx, Object[] columnValues) {
Expand Down
Expand Up @@ -9,9 +9,10 @@
import java.util.Map;

import org.hibernate.ogm.dialect.query.spi.ClosableIterator;
import org.hibernate.ogm.dialect.spi.TupleContext;
import org.hibernate.ogm.dialect.spi.TupleTypeContext;
import org.hibernate.ogm.model.key.spi.EntityKeyMetadata;
import org.hibernate.ogm.model.spi.Tuple;
import org.hibernate.ogm.model.spi.Tuple.SnapshotType;
import org.neo4j.driver.v1.Transaction;
import org.neo4j.driver.v1.types.Node;

Expand All @@ -25,26 +26,26 @@ public class BoltNeo4jNodesTupleIterator implements ClosableIterator<Tuple> {

private final EntityKeyMetadata entityKeyMetadata;
private final BoltNeo4jEntityQueries entityQueries;
private final TupleContext tupleContext;
private final TupleTypeContext tupleTypeContext;
private final ClosableIterator<NodeWithEmbeddedNodes> entities;
private final Transaction tx;

public BoltNeo4jNodesTupleIterator(
Transaction tx,
BoltNeo4jEntityQueries entityQueries,
EntityKeyMetadata entityKeyMetadata,
TupleContext tupleContext,
TupleTypeContext tupleTypeContext,
ClosableIterator<NodeWithEmbeddedNodes> entities) {
this.tx = tx;
this.entityQueries = entityQueries;
this.entityKeyMetadata = entityKeyMetadata;
this.tupleContext = tupleContext;
this.tupleTypeContext = tupleTypeContext;
this.entities = entities;
}

private Tuple createTuple(NodeWithEmbeddedNodes node) {
Map<String, Node> toOneEntities = BoltNeo4jAssociatedNodesHelper.findAssociatedNodes( tx, node, entityKeyMetadata, tupleContext, entityQueries );
return new Tuple( new BoltNeo4jTupleSnapshot( node, entityKeyMetadata, toOneEntities, tupleContext ) );
Map<String, Node> toOneEntities = BoltNeo4jAssociatedNodesHelper.findAssociatedNodes( tx, node, entityKeyMetadata, tupleTypeContext, entityQueries );
return new Tuple( new BoltNeo4jTupleSnapshot( node, entityKeyMetadata, toOneEntities, tupleTypeContext ), SnapshotType.UPDATE );
}

@Override
Expand Down
Expand Up @@ -13,7 +13,7 @@
import java.util.Set;

import org.hibernate.ogm.datastore.neo4j.BaseNeo4jDialect;
import org.hibernate.ogm.dialect.spi.TupleContext;
import org.hibernate.ogm.dialect.spi.TupleTypeContext;
import org.hibernate.ogm.model.key.spi.AssociatedEntityKeyMetadata;
import org.hibernate.ogm.model.key.spi.EntityKeyMetadata;
import org.hibernate.ogm.model.spi.TupleSnapshot;
Expand Down Expand Up @@ -46,14 +46,14 @@ public BoltNeo4jTupleSnapshot(
NodeWithEmbeddedNodes node,
EntityKeyMetadata metadata,
Map<String, Node> toOneEntities,
TupleContext tupleContext
TupleTypeContext tupleTypeContext
) {
this.node = node.getOwner();
this.embeddedNodes = node.getEmbeddedNodes();
this.entityKeyMetadata = metadata;
this.toOneEntities = toOneEntities;
this.associatedEntityKeyMetadata = tupleContext.getAllAssociatedEntityKeyMetadata();
this.rolesByColumn = tupleContext.getAllRoles();
this.associatedEntityKeyMetadata = tupleTypeContext.getAllAssociatedEntityKeyMetadata();
this.rolesByColumn = tupleTypeContext.getAllRoles();
}

@Override
Expand Down

0 comments on commit 5a97e77

Please sign in to comment.