@Override public BoltResult start() throws KernelException { try { Result result = queryExecutionEngine.executeQuery( statement, params, transactionalContext ); if ( result instanceof QueryResultProvider ) { return newBoltResult( (QueryResultProvider) result, clock ); } else { throw new IllegalStateException( format( "Unexpected query execution result. Expected to get instance of %s but was %s.", QueryResultProvider.class.getName(), result.getClass().getName() ) ); } } catch ( KernelException e ) { close( false ); throw new QueryExecutionKernelException( e ); } catch ( Throwable e ) { close( false ); throw e; } }
@Override public Result executeQuery( String query, MapValue parameters, TransactionalContext transactionalContext ) { try { availability.assertDatabaseAvailable(); return dataSource.neoStoreDataSource.getExecutionEngine().executeQuery( query, parameters, transactionalContext ); } catch ( QueryExecutionKernelException e ) { throw e.asUserException(); } }
@Override public Result executeQuery( String query, MapValue parameters, TransactionalContext tc ) { try { availability.assertDatabaseAvailable(); return sourceModule.neoStoreDataSource.getExecutionEngine().executeQuery( query, parameters, tc ); } catch ( QueryExecutionKernelException e ) { throw e.asUserException(); } }
private Result safelyExecute( Statement statement, boolean hasPeriodicCommit, TransactionalContext tc ) throws QueryExecutionKernelException, IOException { try { return engine.executeQuery( statement.statement(), ValueUtils.asMapValue( statement.parameters() ), tc ); } finally { if ( hasPeriodicCommit ) { context.reopenAfterPeriodicCommit(); } } } }
result = executionEngine.executeQuery( query, params, tc ); includePlan = result.getQueryExecutionType().requestedExecutionPlanDescription();
@Test public void shouldCommitSinglePeriodicCommitStatement() throws Exception { // given String queryText = "USING PERIODIC COMMIT CREATE()"; TransitionalPeriodTransactionMessContainer kernel = mockKernel(); QueryExecutionEngine executionEngine = mock( QueryExecutionEngine.class ); Result executionResult = mock( Result.class ); TransactionalContext transactionalContext = prepareKernelWithQuerySession( kernel ); when( executionEngine.isPeriodicCommit( queryText) ).thenReturn( true ); when( executionEngine.executeQuery( eq( queryText ), eq( NO_PARAMS ), eq( transactionalContext ) ) ) .thenReturn( executionResult ); TransactionRegistry registry = mock( TransactionRegistry.class ); when( registry.begin( any( TransactionHandle.class ) ) ).thenReturn( 1337L ); TransactionHandle handle = getTransactionHandle( kernel, executionEngine, registry ); ExecutionResultSerializer output = mock( ExecutionResultSerializer.class ); Statement statement = new Statement( queryText, map(), false, (ResultDataContent[]) null ); // when handle.commit( statements( statement ), output, mock( HttpServletRequest.class ) ); // then verify( executionEngine ).executeQuery( queryText, NO_PARAMS, transactionalContext ); InOrder outputOrder = inOrder( output ); outputOrder.verify( output ).statementResult( executionResult, false, (ResultDataContent[]) null ); outputOrder.verify( output ).notifications( anyCollectionOf( Notification.class ) ); outputOrder.verify( output ).errors( argThat( hasNoErrors() ) ); outputOrder.verify( output ).finish(); verifyNoMoreInteractions( output ); }
@Test public void shouldHandleExecutionEngineThrowingUndeclaredCheckedExceptions() throws Exception { // given QueryExecutionEngine executionEngine = mock( QueryExecutionEngine.class ); when( executionEngine.executeQuery( eq( "match (n) return n" ), eq( NO_PARAMS ), any( TransactionalContext.class ) ) ).thenAnswer( invocationOnMock -> { throw new Exception( "BOO" ); } ); TransactionRegistry registry = mock( TransactionRegistry.class ); when( registry.begin( any( TransactionHandle.class ) ) ).thenReturn( 1337L ); GraphDatabaseQueryService queryService = mock( GraphDatabaseQueryService.class ); TransactionHandle handle = new TransactionHandle( mockKernel(), executionEngine, queryService, registry, uriScheme, false, AUTH_DISABLED, anyLong(), NullLogProvider.getInstance() ); ExecutionResultSerializer output = mock( ExecutionResultSerializer.class ); // when Statement statement = new Statement( "match (n) return n", map(), false, (ResultDataContent[]) null ); handle.commit( statements( statement ), output, mock( HttpServletRequest.class ) ); // then verify( registry ).forget( 1337L ); InOrder outputOrder = inOrder( output ); outputOrder.verify( output ).statementResult( isNull(), eq( false ), isNull() ); outputOrder.verify( output ).errors( argThat( hasErrors( Status.Statement.ExecutionFailed ) ) ); outputOrder.verify( output ).finish(); verifyNoMoreInteractions( output ); }
@Test public void shouldExecuteStatements() throws Exception { // given TransitionalPeriodTransactionMessContainer kernel = mockKernel(); QueryExecutionEngine executionEngine = mock( QueryExecutionEngine.class ); Result executionResult = mock( Result.class ); TransactionalContext transactionalContext = prepareKernelWithQuerySession( kernel ); when( executionEngine.executeQuery( "query", NO_PARAMS, transactionalContext ) ).thenReturn( executionResult ); TransactionRegistry registry = mock( TransactionRegistry.class ); when( registry.begin( any( TransactionHandle.class ) ) ).thenReturn( 1337L ); TransactionHandle handle = getTransactionHandle( kernel, executionEngine, registry ); ExecutionResultSerializer output = mock( ExecutionResultSerializer.class ); // when handle.execute( statements( new Statement( "query", map(), false, (ResultDataContent[]) null ) ), output, mock( HttpServletRequest.class ) ); // then verify( executionEngine ).executeQuery( "query", NO_PARAMS, transactionalContext ); InOrder outputOrder = inOrder( output ); outputOrder.verify( output ).transactionCommitUri( uriScheme.txCommitUri( 1337 ) ); outputOrder.verify( output ).statementResult( executionResult, false, (ResultDataContent[])null ); outputOrder.verify( output ).notifications( anyCollection() ); outputOrder.verify( output ).transactionStatus( anyLong() ); outputOrder.verify( output ).errors( argThat( hasNoErrors() ) ); outputOrder.verify( output ).finish(); verifyNoMoreInteractions( output ); }
@Test @SuppressWarnings( "unchecked" ) public void deadlockExceptionHasCorrectStatus() throws Exception { // given QueryExecutionEngine executionEngine = mock( QueryExecutionEngine.class ); when( executionEngine.executeQuery( anyString(), any( MapValue.class ), isNull() ) ) .thenThrow( new DeadlockDetectedException( "deadlock" ) ); GraphDatabaseQueryService queryService = mock( GraphDatabaseQueryService.class ); TransactionHandle handle = new TransactionHandle( mockKernel(), executionEngine, queryService, mock( TransactionRegistry.class ), uriScheme, true, AUTH_DISABLED, anyLong(), NullLogProvider.getInstance() ); ExecutionResultSerializer output = mock( ExecutionResultSerializer.class ); // when handle.execute( statements( new Statement( "query", map(), false, (ResultDataContent[]) null ) ), output, mock( HttpServletRequest.class ) ); // then verify( output ).errors( argThat( hasErrors( Status.Transaction.DeadlockDetected ) ) ); }
Result executionResult = mock( Result.class ); TransactionalContext transactionalContext = prepareKernelWithQuerySession( kernel ); when( engine.executeQuery( "query", NO_PARAMS, transactionalContext ) ).thenReturn( executionResult ); when( registry.begin( any( TransactionHandle.class ) ) ).thenReturn( 1337L ); GraphDatabaseQueryService queryService = mock( GraphDatabaseQueryService.class );
@Test public void shouldRollbackTransactionIfExecutionErrorOccurs() throws Exception { // given TransitionalPeriodTransactionMessContainer kernel = mockKernel(); TransitionalTxManagementKernelTransaction transactionContext = kernel.newTransaction( explicit, AUTH_DISABLED, -1 ); TransactionRegistry registry = mock( TransactionRegistry.class ); QueryExecutionEngine executionEngine = mock( QueryExecutionEngine.class ); TransactionalContext transactionalContext = prepareKernelWithQuerySession( kernel ); when( executionEngine.executeQuery( "query", NO_PARAMS, transactionalContext ) ).thenThrow( new NullPointerException() ); when( registry.begin( any( TransactionHandle.class ) ) ).thenReturn( 1337L ); TransactionHandle handle = getTransactionHandle( kernel, executionEngine, registry ); ExecutionResultSerializer output = mock( ExecutionResultSerializer.class ); // when handle.execute( statements( new Statement( "query", map(), false, (ResultDataContent[]) null ) ), output, mock( HttpServletRequest.class ) ); // then verify( transactionContext ).rollback(); verify( registry ).forget( 1337L ); InOrder outputOrder = inOrder( output ); outputOrder.verify( output ).transactionCommitUri( uriScheme.txCommitUri( 1337 ) ); outputOrder.verify( output ).errors( argThat( hasErrors( Status.Statement.ExecutionFailed ) ) ); outputOrder.verify( output ).finish(); verifyNoMoreInteractions( output ); }
TransactionalContext transactionalContext = prepareKernelWithQuerySession( kernel ); Result result = mock( Result.class ); when( engine.executeQuery( "query", NO_PARAMS, transactionalContext ) ).thenReturn( result ); when( registry.begin( any( TransactionHandle.class ) ) ).thenReturn( 1337L ); GraphDatabaseQueryService queryService = mock( GraphDatabaseQueryService.class );
@Test public void shouldLogMessageIfCypherSyntaxErrorOccurs() throws Exception { // given TransitionalPeriodTransactionMessContainer kernel = mockKernel(); QueryExecutionEngine executionEngine = mock( QueryExecutionEngine.class ); TransactionalContext transactionalContext = prepareKernelWithQuerySession( kernel ); when( executionEngine.executeQuery( "matsch (n) return n", NO_PARAMS, transactionalContext ) ) .thenThrow( new QueryExecutionKernelException( new SyntaxException( "did you mean MATCH?" ) ) ); TransactionRegistry registry = mock( TransactionRegistry.class ); when( registry.begin( any( TransactionHandle.class ) ) ).thenReturn( 1337L ); GraphDatabaseQueryService queryService = mock( GraphDatabaseQueryService.class ); TransactionHandle handle = new TransactionHandle( kernel, executionEngine, queryService, registry, uriScheme, false, AUTH_DISABLED, anyLong(), NullLogProvider.getInstance() ); ExecutionResultSerializer output = mock( ExecutionResultSerializer.class ); // when Statement statement = new Statement( "matsch (n) return n", map(), false, (ResultDataContent[]) null ); handle.commit( statements( statement ), output, mock( HttpServletRequest.class ) ); // then verify( registry ).forget( 1337L ); InOrder outputOrder = inOrder( output ); outputOrder.verify( output ).errors( argThat( hasErrors( Status.Statement.SyntaxError ) ) ); outputOrder.verify( output ).finish(); verifyNoMoreInteractions( output ); }
@Test public void shouldSuspendTransactionAndReleaseForOtherRequestsAfterExecutingStatements() throws Exception { // given TransitionalPeriodTransactionMessContainer kernel = mockKernel(); TransitionalTxManagementKernelTransaction transactionContext = kernel.newTransaction( explicit, AUTH_DISABLED, -1 ); TransactionRegistry registry = mock( TransactionRegistry.class ); QueryExecutionEngine executionEngine = mock( QueryExecutionEngine.class ); TransactionalContext transactionalContext = prepareKernelWithQuerySession( kernel ); Result executionResult = mock( Result.class ); when( executionEngine.executeQuery( "query", NO_PARAMS, transactionalContext) ).thenReturn( executionResult ); when( registry.begin( any( TransactionHandle.class ) ) ).thenReturn( 1337L ); TransactionHandle handle = getTransactionHandle( kernel, executionEngine, registry ); ExecutionResultSerializer output = mock( ExecutionResultSerializer.class ); // when handle.execute( statements( new Statement( "query", map(), false, (ResultDataContent[]) null ) ), output, mock( HttpServletRequest.class ) ); // then InOrder transactionOrder = inOrder( transactionContext, registry ); transactionOrder.verify( transactionContext ).suspendSinceTransactionsAreStillThreadBound(); transactionOrder.verify( registry ).release( 1337L, handle ); InOrder outputOrder = inOrder( output ); outputOrder.verify( output ).transactionCommitUri( uriScheme.txCommitUri( 1337 ) ); outputOrder.verify( output ).statementResult( executionResult, false, (ResultDataContent[])null ); outputOrder.verify( output ).notifications( anyCollection() ); outputOrder.verify( output ).transactionStatus( anyLong() ); outputOrder.verify( output ).errors( argThat( hasNoErrors() ) ); outputOrder.verify( output ).finish(); verifyNoMoreInteractions( output ); }
Result executionResult = mock( Result.class ); TransactionalContext transactionalContext = prepareKernelWithQuerySession( kernel ); when( engine.executeQuery( "query", NO_PARAMS, transactionalContext ) ).thenReturn( executionResult ); when( registry.begin( any( TransactionHandle.class ) ) ).thenReturn( 1337L ); GraphDatabaseQueryService queryService = mock( GraphDatabaseQueryService.class );
reset( transactionContext, registry, executionEngine, output ); Result executionResult = mock( Result.class ); when( executionEngine.executeQuery( "query", NO_PARAMS, transactionalContext ) ).thenReturn( executionResult ); order.verify( executionEngine ).executeQuery( "query", NO_PARAMS, transactionalContext ); order.verify( transactionContext ).suspendSinceTransactionsAreStillThreadBound(); order.verify( registry ).release( 1337L, handle );
private List<LockOperationRecord> traceQueryLocks( String query, LockOperationListener... listeners ) throws QueryExecutionKernelException { GraphDatabaseQueryService graph = databaseRule.resolveDependency( GraphDatabaseQueryService.class ); QueryExecutionEngine executionEngine = databaseRule.resolveDependency( QueryExecutionEngine.class ); try ( InternalTransaction tx = graph .beginTransaction( KernelTransaction.Type.implicit, LoginContext.AUTH_DISABLED ) ) { TransactionalContextWrapper context = new TransactionalContextWrapper( createTransactionContext( graph, tx, query ), listeners ); executionEngine.executeQuery( query, VirtualValues.emptyMap(), context ); return new ArrayList<>( context.recordingLocks.getLockOperationRecords() ); } }
private Result getResult( String query, Session session ) throws QueryExecutionKernelException { Map<String,Object> parameters = getParameters( session ); TransactionalContext tc = createTransactionContext( query, parameters, session ); return getEngine().executeQuery( query, parameters, tc ); }
@Override public Result executeQuery( String query, MapValue parameters, TransactionalContext transactionalContext ) { try { availability.assertDatabaseAvailable(); return dataSource.neoStoreDataSource.getExecutionEngine().executeQuery( query, parameters, transactionalContext ); } catch ( QueryExecutionKernelException e ) { throw e.asUserException(); } }
@Override public Result executeQuery( String query, MapValue parameters, TransactionalContext tc ) { try { availability.assertDatabaseAvailable(); return sourceModule.neoStoreDataSource.getExecutionEngine().executeQuery( query, parameters, tc ); } catch ( QueryExecutionKernelException e ) { throw e.asUserException(); } }