diff --git a/community/cypher/interpreted-runtime/src/main/scala/org/neo4j/cypher/internal/runtime/interpreted/TransactionBoundQueryContext.scala b/community/cypher/interpreted-runtime/src/main/scala/org/neo4j/cypher/internal/runtime/interpreted/TransactionBoundQueryContext.scala index 1ef67cf7a728..e3db0faf10cc 100644 --- a/community/cypher/interpreted-runtime/src/main/scala/org/neo4j/cypher/internal/runtime/interpreted/TransactionBoundQueryContext.scala +++ b/community/cypher/interpreted-runtime/src/main/scala/org/neo4j/cypher/internal/runtime/interpreted/TransactionBoundQueryContext.scala @@ -706,11 +706,15 @@ sealed class TransactionBoundQueryContext(val transactionalContext: Transactiona case e: NotFoundException => throw new EntityNotFoundException(s"Relationship with id $id", e) } - override def getByIdIfExists(id: Long): Option[RelationshipValue] = - if (reads().relationshipExists(id)) - Some(fromRelationshipProxy(entityAccessor.newRelationshipProxy(id))) + override def getByIdIfExists(id: Long): Option[RelationshipValue] = { + val cursor = relationshipScanCursor + reads().singleRelationship(id, cursor) + if (cursor.next()) + Some(fromRelationshipProxy(entityAccessor.newRelationshipProxy(id, cursor.sourceNodeReference(), cursor.label(), + cursor.targetNodeReference())) else None + } override def all: Iterator[RelationshipValue] = { val relCursor = allocateAndTraceRelationshipScanCursor() diff --git a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Write.java b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Write.java index 9ac0a8b254b5..af88d30bc50e 100644 --- a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Write.java +++ b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Write.java @@ -41,7 +41,7 @@ public interface Write * @param node the internal id of the node to delete * @return returns true if it deleted a node or false if no node was found for this id */ - boolean nodeDelete( long node ) throws AutoIndexingKernelException, EntityNotFoundException; + boolean nodeDelete( long node ) throws AutoIndexingKernelException; /** * Create a relationship between two nodes. @@ -56,8 +56,7 @@ public interface Write * Delete a relationship * @param relationship the internal id of the relationship to delete */ - boolean relationshipDelete( long relationship ) throws AutoIndexingKernelException, EntityNotFoundException; - + boolean relationshipDelete( long relationship ) throws AutoIndexingKernelException; /** * Add a label to a node * @param node the internal node id diff --git a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/ExplicitIndexCursorWritesTestBase.java b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/ExplicitIndexCursorWritesTestBase.java index eac24795ecc2..35549d60b5b5 100644 --- a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/ExplicitIndexCursorWritesTestBase.java +++ b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/ExplicitIndexCursorWritesTestBase.java @@ -263,7 +263,6 @@ public void shouldCreateExplicitIndexTwice() throws Exception } } - //TODO unignore when we support relationship creation. @Test public void shouldAddRelationshipToExplicitIndex() throws Exception { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/core/NodeProxy.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/core/NodeProxy.java index 6fc8850414e1..b40fe083dc00 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/core/NodeProxy.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/core/NodeProxy.java @@ -119,11 +119,6 @@ public void delete() throw new IllegalStateException( "Auto indexing encountered a failure while deleting the node: " + e.getMessage(), e ); } - catch ( EntityNotFoundException e ) - { - throw new NotFoundException( "Unable to delete node[" + - getId() + "] since it is already deleted." ); - } } @Override @@ -311,10 +306,6 @@ public Object removeProperty( String key ) throws NotFoundException throw new IllegalStateException( "Auto indexing encountered a failure while removing property: " + e.getMessage(), e ); } - catch ( KernelException e ) - { - throw new ConstraintViolationException( e.getMessage(), e ); - } } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/core/RelationshipProxy.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/core/RelationshipProxy.java index 0a423dbe6819..5692bd2b4996 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/core/RelationshipProxy.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/core/RelationshipProxy.java @@ -40,7 +40,6 @@ import org.neo4j.internal.kernel.api.TokenRead; import org.neo4j.internal.kernel.api.exceptions.EntityNotFoundException; import org.neo4j.internal.kernel.api.exceptions.InvalidTransactionTypeKernelException; -import org.neo4j.internal.kernel.api.exceptions.KernelException; import org.neo4j.internal.kernel.api.exceptions.PropertyKeyIdNotFoundKernelException; import org.neo4j.internal.kernel.api.exceptions.explicitindex.AutoIndexingKernelException; import org.neo4j.internal.kernel.api.exceptions.schema.IllegalTokenNameException; @@ -140,17 +139,14 @@ public void delete() boolean deleted = transaction.dataWrite().relationshipDelete( id ); if ( !deleted ) { - alreadyDeleted(); + throw new NotFoundException( "Unable to delete relationship[" + + getId() + "] since it is already deleted." ); } } catch ( InvalidTransactionTypeKernelException e ) { throw new ConstraintViolationException( e.getMessage(), e ); } - catch ( EntityNotFoundException e ) - { - alreadyDeleted(); - } catch ( AutoIndexingKernelException e ) { throw new IllegalStateException( "Auto indexing encountered a failure while deleting the relationship: " @@ -452,10 +448,7 @@ public void setProperty( String key, Object value ) throw new IllegalStateException( "Auto indexing encountered a failure while setting property: " + e.getMessage(), e ); } - catch ( KernelException e ) - { - throw new ConstraintViolationException( e.getMessage(), e ); - } + } @Override @@ -484,10 +477,6 @@ public Object removeProperty( String key ) throw new IllegalStateException( "Auto indexing encountered a failure while removing property: " + e.getMessage(), e ); } - catch ( KernelException e ) - { - throw new ConstraintViolationException( e.getMessage(), e ); - } } @Override @@ -559,9 +548,4 @@ private void assertInUnterminatedTransaction() actions.assertInUnterminatedTransaction(); } - private void alreadyDeleted() - { - throw new NotFoundException( "Unable to delete relationship[" + - getId() + "] since it is already deleted." ); - } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Operations.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Operations.java index a707420816a6..dd778f9d519d 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Operations.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Operations.java @@ -172,7 +172,7 @@ public long relationshipCreate( long sourceNode, int relationshipType, long targ } @Override - public boolean relationshipDelete( long relationship ) throws AutoIndexingKernelException, EntityNotFoundException + public boolean relationshipDelete( long relationship ) throws AutoIndexingKernelException { ktx.assertOpen(); @@ -182,7 +182,10 @@ public boolean relationshipDelete( long relationship ) throws AutoIndexingKernel { lockRelationshipNodes( relationshipCursor.sourceNodeReference(), relationshipCursor.targetNodeReference() ); acquireExclusiveRelationshipLock( relationship ); - assertRelationshipExists( relationship ); + if ( !allStoreHolder.relationshipExists( relationship ) ) + { + return false; + } ktx.assertOpen();