@Test void executeQueryStartDefaultTransaction() { KernelTransaction kernelTransaction = mock( KernelTransaction.class ); InternalTransaction transaction = new TopLevelTransaction( kernelTransaction ); when( queryService.beginTransaction( KernelTransaction.Type.implicit, AUTH_DISABLED ) ) .thenReturn( transaction ); graphDatabaseFacade.execute( "create (n)" ); graphDatabaseFacade.execute( "create (n)", new HashMap<>() ); long timeout = Config.defaults().get( GraphDatabaseSettings.transaction_timeout ).toMillis(); verify( spi, times( 2 ) ).beginTransaction( KernelTransaction.Type.implicit, AUTH_DISABLED, timeout ); } }
@BeforeEach void setUp() { queryService = mock( GraphDatabaseQueryService.class ); DependencyResolver resolver = mock( DependencyResolver.class ); Statement statement = mock( Statement.class, RETURNS_DEEP_STUBS ); ThreadToStatementContextBridge contextBridge = mock( ThreadToStatementContextBridge.class ); when( spi.queryService() ).thenReturn( queryService ); when( spi.resolver() ).thenReturn( resolver ); when( resolver.resolveDependency( ThreadToStatementContextBridge.class ) ).thenReturn( contextBridge ); when( contextBridge.get() ).thenReturn( statement ); Config config = Config.defaults(); when( resolver.resolveDependency( Config.class ) ).thenReturn( config ); graphDatabaseFacade.init( spi, contextBridge, config, mockedTokenHolders() ); }
/** * Create a new Core API facade, backed by the given SPI and using pre-resolved dependencies */ public void init( SPI spi, ThreadToStatementContextBridge txBridge, Config config, TokenHolders tokenHolders ) { this.spi = spi; this.config = config; this.schema = new SchemaImpl( () -> txBridge.getKernelTransactionBoundToThisThread( true ) ); this.statementContext = txBridge; this.tokenHolders = tokenHolders; this.indexManager = Suppliers.lazySingleton( () -> { IndexProviderImpl idxProvider = new IndexProviderImpl( this, () -> txBridge.getKernelTransactionBoundToThisThread( true ) ); AutoIndexerFacade<Node> nodeAutoIndexer = new AutoIndexerFacade<>( () -> new ReadOnlyIndexFacade<>( idxProvider.getOrCreateNodeIndex( NODE_AUTO_INDEX, null ) ), spi.autoIndexing().nodes() ); RelationshipAutoIndexerFacade relAutoIndexer = new RelationshipAutoIndexerFacade( () -> new ReadOnlyRelationshipIndexFacade( idxProvider.getOrCreateRelationshipIndex( RELATIONSHIP_AUTO_INDEX, null ) ), spi.autoIndexing().relationships() ); return new IndexManagerImpl( () -> txBridge.getKernelTransactionBoundToThisThread( true ), idxProvider, nodeAutoIndexer, relAutoIndexer ); } ); this.contextFactory = Neo4jTransactionalContextFactory.create( spi, txBridge, locker ); }
@Override public KernelEventHandler registerKernelEventHandler( KernelEventHandler handler ) { spi.registerKernelEventHandler( handler ); return handler; }
@Override public String toString() { return spi.name() + " [" + databaseLayout() + "]"; }
@Override public <T> TransactionEventHandler<T> registerTransactionEventHandler( TransactionEventHandler<T> handler ) { spi.registerTransactionEventHandler( handler ); return handler; }
@Override public DatabaseLayout databaseLayout() { return spi.databaseLayout(); }
@Override public boolean isAvailable( long timeoutMillis ) { return spi.databaseIsAvailable( timeoutMillis ); }
@Override public DependencyResolver getDependencyResolver() { return spi.resolver(); }
public Result execute( InternalTransaction transaction, String query, MapValue parameters ) throws QueryExecutionException { TransactionalContext context = contextFactory.newContext( ClientConnectionInfo.EMBEDDED_CONNECTION, transaction, query, parameters ); return spi.executeQuery( query, parameters, context ); }
private InternalTransaction beginTransactionInternal( KernelTransaction.Type type, LoginContext loginContext, long timeoutMillis ) { if ( statementContext.hasTransaction() ) { // FIXME: perhaps we should check that the new type and access mode are compatible with the current tx return new PlaceboTransaction( statementContext.getKernelTransactionBoundToThisThread( true ) ); } return new TopLevelTransaction( spi.beginTransaction( type, loginContext, timeoutMillis ) ); }
/** * Create a new Core API facade, backed by the given SPI and using pre-resolved dependencies */ public void init( SPI spi, ThreadToStatementContextBridge txBridge, Config config, TokenHolders tokenHolders ) { this.spi = spi; this.config = config; this.schema = new SchemaImpl( () -> txBridge.getKernelTransactionBoundToThisThread( true ) ); this.statementContext = txBridge; this.tokenHolders = tokenHolders; this.indexManager = Suppliers.lazySingleton( () -> { IndexProviderImpl idxProvider = new IndexProviderImpl( this, () -> txBridge.getKernelTransactionBoundToThisThread( true ) ); AutoIndexerFacade<Node> nodeAutoIndexer = new AutoIndexerFacade<>( () -> new ReadOnlyIndexFacade<>( idxProvider.getOrCreateNodeIndex( NODE_AUTO_INDEX, null ) ), spi.autoIndexing().nodes() ); RelationshipAutoIndexerFacade relAutoIndexer = new RelationshipAutoIndexerFacade( () -> new ReadOnlyRelationshipIndexFacade( idxProvider.getOrCreateRelationshipIndex( RELATIONSHIP_AUTO_INDEX, null ) ), spi.autoIndexing().relationships() ); return new IndexManagerImpl( () -> txBridge.getKernelTransactionBoundToThisThread( true ), idxProvider, nodeAutoIndexer, relAutoIndexer ); } ); this.contextFactory = Neo4jTransactionalContextFactory.create( spi, txBridge, locker ); }
@Override public KernelEventHandler registerKernelEventHandler( KernelEventHandler handler ) { spi.registerKernelEventHandler( handler ); return handler; }
@Override public DatabaseLayout databaseLayout() { return spi.databaseLayout(); }
@Override public boolean isAvailable( long timeoutMillis ) { return spi.databaseIsAvailable( timeoutMillis ); }
@Test void executeQueryWithCustomTimeoutShouldStartTransactionWithRequestedTimeout() { graphDatabaseFacade.execute( "create (n)", 157L, TimeUnit.SECONDS ); verify( spi ).beginTransaction( KernelTransaction.Type.implicit, AUTH_DISABLED, TimeUnit.SECONDS.toMillis( 157L ) ); graphDatabaseFacade.execute( "create (n)", new HashMap<>(), 247L, TimeUnit.MINUTES ); verify( spi ).beginTransaction( KernelTransaction.Type.implicit, AUTH_DISABLED, TimeUnit.MINUTES.toMillis( 247L ) ); }
private InternalTransaction beginTransactionInternal( KernelTransaction.Type type, LoginContext loginContext, long timeoutMillis ) { if ( statementContext.hasTransaction() ) { // FIXME: perhaps we should check that the new type and access mode are compatible with the current tx return new PlaceboTransaction( statementContext.getKernelTransactionBoundToThisThread( true ) ); } return new TopLevelTransaction( spi.beginTransaction( type, loginContext, timeoutMillis ) ); }
@Override public String toString() { return spi.name() + " [" + databaseLayout() + "]"; }
@Override public <T> TransactionEventHandler<T> registerTransactionEventHandler( TransactionEventHandler<T> handler ) { spi.registerTransactionEventHandler( handler ); return handler; }
@Override public DependencyResolver getDependencyResolver() { return spi.resolver(); }