@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; } }
boolean periodicCommitQuery = executionEngine.isPeriodicCommit( query ); CommitOnSuccessfulStatusCodeRepresentationWriteHandler handler = (CommitOnSuccessfulStatusCodeRepresentationWriteHandler) output.getRepresentationWriteHandler(); if ( profile ) result = executionEngine.profileQuery( query, params, tc ); includePlan = true; result = executionEngine.executeQuery( query, params, tc ); includePlan = result.getQueryExecutionType().requestedExecutionPlanDescription();
@Admin @Description( "Clears all query caches." ) @Procedure( name = "dbms.clearQueryCaches", mode = DBMS ) public Stream<StringResult> clearAllQueryCaches() { QueryExecutionEngine queryExecutionEngine = graph.getDependencyResolver().resolveDependency( QueryExecutionEngine.class ); long numberOfClearedQueries = queryExecutionEngine.clearQueryCaches() - 1; // this query itself does not count String result = numberOfClearedQueries == 0 ? "Query cache already empty." : "Query caches successfully cleared of " + numberOfClearedQueries + " queries."; log.info( "Called dbms.clearQueryCaches(): " + result ); return Stream.of( new StringResult( result ) ); }
@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 ); }
@Override public boolean isPeriodicCommit( String query ) { return queryExecutionEngine.isPeriodicCommit( query ); }
private void dumpToFile( final String id, final String query, final Object params ) throws Exception { QueryExecutionEngine engine = ((GraphDatabaseAPI) db).getDependencyResolver().resolveDependency( QueryExecutionEngine.class ); StringBuffer sb = new StringBuffer( 2048 ); String prettifiedJson = WRITER.writeValueAsString( params ); sb.append( "\n.Parameters\n[source,javascript]\n----\n" ) .append( prettifiedJson ) .append( "\n----\n\n.Query\n" ) .append( AsciidocHelper.createAsciiDocSnippet( "cypher", engine.prettify( query ) ) ); AsciiDocGenerator.dumpToSeparateFile( docsTargetDir, id, sb.toString() ); }
@Test public void shouldNotDetectNonPeriodicCommitQueriesAsPeriodicCommitQueries() { // GIVEN QueryExecutionEngine engine = rule.getGraphDatabaseAPI().getDependencyResolver() .resolveDependency( QueryExecutionEngine.class ); // WHEN boolean result = engine.isPeriodicCommit("CREATE ()"); // THEN assertFalse( "Did detect non-periodic commit query as periodic commit query", result ); }
@Test public void prettifier_makes_pretty() throws Exception { QueryExecutionEngine engine = ((GraphDatabaseAPI) db).getDependencyResolver().resolveDependency( QueryExecutionEngine.class ); String given = "match (n)-->() return n"; String expected = String.format("MATCH (n)-->()%nRETURN n"); assertEquals(expected, engine.prettify(given)); }
@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(); } }
boolean periodicCommitQuery = executionEngine.isPeriodicCommit( query ); CommitOnSuccessfulStatusCodeRepresentationWriteHandler handler = (CommitOnSuccessfulStatusCodeRepresentationWriteHandler) output.getRepresentationWriteHandler(); if ( profile ) result = executionEngine.profileQuery( query, params, tc ); includePlan = true; result = executionEngine.executeQuery( query, params, tc ); includePlan = result.getQueryExecutionType().requestedExecutionPlanDescription();
@Test public void shouldDetectPeriodicCommitQueries() { // GIVEN QueryExecutionEngine engine = rule.getGraphDatabaseAPI().getDependencyResolver() .resolveDependency( QueryExecutionEngine.class ); // WHEN boolean result = engine.isPeriodicCommit("USING PERIODIC COMMIT LOAD CSV FROM 'file:///tmp/foo.csv' AS line CREATE ()"); // THEN assertTrue( "Did not detect periodic commit query", result ); }
@Admin @Description( "Clears all query caches." ) @Procedure( name = "dbms.clearQueryCaches", mode = DBMS ) public Stream<StringResult> clearAllQueryCaches() { QueryExecutionEngine queryExecutionEngine = graph.getDependencyResolver().resolveDependency( QueryExecutionEngine.class ); long numberOfClearedQueries = queryExecutionEngine.clearQueryCaches() - 1; // this query itself does not count String result = numberOfClearedQueries == 0 ? "Query cache already empty." : "Query caches successfully cleared of " + numberOfClearedQueries + " queries."; log.info( "Called dbms.clearQueryCaches(): " + result ); return Stream.of( new StringResult( result ) ); }
@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(); } }
@Test public void shouldNotDetectInvalidQueriesAsPeriodicCommitQueries() { // GIVEN QueryExecutionEngine engine = rule.getGraphDatabaseAPI().getDependencyResolver() .resolveDependency( QueryExecutionEngine.class ); // WHEN boolean result = engine.isPeriodicCommit("MATCH n RETURN m"); // THEN assertFalse( "Did detect an invalid query as periodic commit query", result ); } }
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(); } } } }
try boolean hasPeriodicCommit = engine.isPeriodicCommit( statement.statement() ); if ( (statements.hasNext() || hasPrevious) && hasPeriodicCommit )
@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 ); }
@Override public boolean isPeriodicCommit( String query ) { return queryExecutionEngine.isPeriodicCommit( query ); }
@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 ); }
@Override public Continuation execute( AppCommandParser parser, Session session, Output out ) throws Exception { String query = parser.getLine().trim(); if ( isComplete( query ) ) { if ( getEngine().isPeriodicCommit( query ) ) { return exec( parser, session, out ); } else { return super.execute( parser, session, out ); } } else { return Continuation.INPUT_INCOMPLETE; } }