@Test public void shouldHoldSharedIndexLockIfNodeIsExists() throws Exception { // given NodeValueIndexCursor cursor = mock( NodeValueIndexCursor.class ); when( cursor.next() ).thenReturn( true ); when( cursor.nodeReference() ).thenReturn( 42L ); // when long nodeId = LockingNodeUniqueIndexSeek.apply( locks, LockTracer.NONE, () -> cursor, uniqueNodeIndexSeeker, read, index, predicate ); // then assertEquals( 42L, nodeId ); verify( locks ).acquireShared( LockTracer.NONE, INDEX_ENTRY, resourceId ); verifyNoMoreInteractions( locks ); verify( cursor ).close(); }
@Test public void shouldHoldExclusiveIndexLockIfNodeDoesNotExist() throws Exception { // given NodeValueIndexCursor cursor = mock( NodeValueIndexCursor.class ); when( cursor.next() ).thenReturn( false, false ); when( cursor.nodeReference() ).thenReturn( -1L ); // when long nodeId = LockingNodeUniqueIndexSeek.apply( locks, LockTracer.NONE, () -> cursor, uniqueNodeIndexSeeker, read, index, predicate ); // then assertEquals( -1L, nodeId ); order.verify( locks ).acquireShared( LockTracer.NONE, INDEX_ENTRY, resourceId ); order.verify( locks ).releaseShared( INDEX_ENTRY, resourceId ); order.verify( locks ).acquireExclusive( LockTracer.NONE, INDEX_ENTRY, resourceId ); verifyNoMoreInteractions( locks ); verify( cursor ).close(); } }
@Override public final void nodeIndexSeek( IndexReference index, NodeValueIndexCursor cursor, IndexOrder indexOrder, boolean needsValues, IndexQuery... query ) throws IndexNotApplicableKernelException, IndexNotFoundKernelException { ktx.assertOpen(); if ( hasForbiddenProperties( index ) ) { cursor.close(); return; } DefaultNodeValueIndexCursor cursorImpl = (DefaultNodeValueIndexCursor) cursor; IndexReader reader = indexReader( index, false ); cursorImpl.setRead( this ); IndexProgressor.NodeValueClient withFullPrecision = injectFullValuePrecision( cursorImpl, query, reader ); reader.query( withFullPrecision, indexOrder, needsValues, query ); }
@Test public void shouldHoldSharedIndexLockIfNodeIsConcurrentlyCreated() throws Exception { // given NodeValueIndexCursor cursor = mock( NodeValueIndexCursor.class ); when( cursor.next() ).thenReturn( false, true ); when( cursor.nodeReference() ).thenReturn( 42L ); // when long nodeId = LockingNodeUniqueIndexSeek.apply( locks, LockTracer.NONE, () -> cursor, uniqueNodeIndexSeeker, read, index, predicate ); // then assertEquals( 42L, nodeId ); order.verify( locks ).acquireShared( LockTracer.NONE, INDEX_ENTRY, resourceId ); order.verify( locks ).releaseShared( INDEX_ENTRY, resourceId ); order.verify( locks ).acquireExclusive( LockTracer.NONE, INDEX_ENTRY, resourceId ); order.verify( locks ).acquireShared( LockTracer.NONE, INDEX_ENTRY, resourceId ); order.verify( locks ).releaseExclusive( INDEX_ENTRY, resourceId ); verifyNoMoreInteractions( locks ); verify( cursor ).close(); }
@Override public final void nodeIndexScan( IndexReference index, NodeValueIndexCursor cursor, IndexOrder indexOrder, boolean needsValues ) throws KernelException { ktx.assertOpen(); if ( hasForbiddenProperties( index ) ) { cursor.close(); return; } // for a scan, we simply query for existence of the first property, which covers all entries in an index int firstProperty = index.properties()[0]; DefaultNodeValueIndexCursor cursorImpl = (DefaultNodeValueIndexCursor) cursor; cursorImpl.setRead( this ); indexReader( index, false ).query( cursorImpl, indexOrder, needsValues, IndexQuery.exists( firstProperty ) ); }
@Override public final void nodeIndexSeek( IndexReference index, NodeValueIndexCursor cursor, IndexOrder indexOrder, boolean needsValues, IndexQuery... query ) throws IndexNotApplicableKernelException, IndexNotFoundKernelException { ktx.assertOpen(); if ( hasForbiddenProperties( index ) ) { cursor.close(); return; } DefaultNodeValueIndexCursor cursorImpl = (DefaultNodeValueIndexCursor) cursor; IndexReader reader = indexReader( index, false ); cursorImpl.setRead( this ); IndexProgressor.NodeValueClient withFullPrecision = injectFullValuePrecision( cursorImpl, query, reader ); reader.query( withFullPrecision, indexOrder, needsValues, query ); }
@Override public final void nodeIndexScan( IndexReference index, NodeValueIndexCursor cursor, IndexOrder indexOrder, boolean needsValues ) throws KernelException { ktx.assertOpen(); if ( hasForbiddenProperties( index ) ) { cursor.close(); return; } // for a scan, we simply query for existence of the first property, which covers all entries in an index int firstProperty = index.properties()[0]; DefaultNodeValueIndexCursor cursorImpl = (DefaultNodeValueIndexCursor) cursor; cursorImpl.setRead( this ); indexReader( index, false ).query( cursorImpl, indexOrder, needsValues, IndexQuery.exists( firstProperty ) ); }