Skip to content

Commit

Permalink
Using generic dependency resolution mechanics to resolve GraphDatabas…
Browse files Browse the repository at this point in the history
…eQueryService.

Use dependency resolver to resolve GraphDatabaseQueryService instances instead of using QueryExecutionEngine for that.
Remove `queryService` method from QueryExecutionEngine interface.
  • Loading branch information
MishaDemianenko committed Aug 23, 2016
1 parent 2af5eb3 commit f076bf2
Show file tree
Hide file tree
Showing 19 changed files with 130 additions and 105 deletions.
Expand Up @@ -23,6 +23,16 @@
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
import org.bouncycastle.operator.OperatorCreationException;

import java.io.File;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.time.Clock;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.BiFunction;

import org.neo4j.bolt.security.auth.Authentication;
import org.neo4j.bolt.security.auth.BasicAuthentication;
import org.neo4j.bolt.security.ssl.Certificates;
Expand All @@ -33,11 +43,11 @@
import org.neo4j.bolt.transport.NettyServer;
import org.neo4j.bolt.transport.NettyServer.ProtocolInitializer;
import org.neo4j.bolt.transport.SocketTransport;
import org.neo4j.bolt.v1.runtime.BoltFactory;
import org.neo4j.bolt.v1.runtime.BoltWorker;
import org.neo4j.bolt.v1.runtime.LifecycleManagedBoltFactory;
import org.neo4j.bolt.v1.runtime.MonitoredWorkerFactory;
import org.neo4j.bolt.v1.runtime.WorkerFactory;
import org.neo4j.bolt.v1.runtime.BoltFactory;
import org.neo4j.bolt.v1.runtime.LifecycleManagedBoltFactory;
import org.neo4j.bolt.v1.runtime.concurrent.ThreadedWorkerFactory;
import org.neo4j.bolt.v1.transport.BoltProtocolV1;
import org.neo4j.graphdb.GraphDatabaseService;
Expand Down Expand Up @@ -65,20 +75,13 @@
import org.neo4j.logging.Log;
import org.neo4j.udc.UsageData;

import java.io.File;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.time.Clock;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.BiFunction;

import static java.lang.String.format;
import static java.util.stream.Collectors.toList;
import static org.neo4j.graphdb.factory.GraphDatabaseSettings.Connector.ConnectorType.BOLT;
import static org.neo4j.kernel.configuration.GroupSettingSupport.enumerate;
import static org.neo4j.kernel.configuration.Settings.*;
import static org.neo4j.kernel.configuration.Settings.PATH;
import static org.neo4j.kernel.configuration.Settings.derivedSetting;
import static org.neo4j.kernel.configuration.Settings.pathSetting;
import static org.neo4j.kernel.impl.util.JobScheduler.Groups.boltNetworkIO;

/**
Expand Down Expand Up @@ -153,7 +156,7 @@ public Lifecycle newInstance( KernelContext context, Dependencies dependencies )

BoltFactory boltConnectionManagerFactory = life.add(
new LifecycleManagedBoltFactory( api, dependencies.usageData(), logService, dependencies.txBridge(),
authentication, dependencies.dataSource(), dependencies.sessionTracker() ) );
authentication, dependencies.sessionTracker() ) );
ThreadedWorkerFactory threadedSessions = new ThreadedWorkerFactory( boltConnectionManagerFactory, scheduler, logService );
WorkerFactory workerFactory = new MonitoredWorkerFactory( dependencies.monitors(), threadedSessions, Clock.systemUTC() );

Expand Down
Expand Up @@ -21,7 +21,8 @@

import org.neo4j.bolt.security.auth.Authentication;
import org.neo4j.bolt.v1.runtime.cypher.CypherStatementRunner;
import org.neo4j.kernel.NeoStoreDataSource;
import org.neo4j.graphdb.DependencyResolver;
import org.neo4j.kernel.GraphDatabaseQueryService;
import org.neo4j.kernel.api.bolt.BoltConnectionTracker;
import org.neo4j.kernel.impl.core.ThreadToStatementContextBridge;
import org.neo4j.kernel.impl.logging.LogService;
Expand All @@ -39,22 +40,21 @@ public class LifecycleManagedBoltFactory extends LifecycleAdapter implements Bol
private final LogService logging;
private final Authentication authentication;
private final BoltConnectionTracker connectionTracker;
private final NeoStoreDataSource neoStoreDataSource;
private final ThreadToStatementContextBridge txBridge;

private QueryExecutionEngine queryExecutionEngine;
private GraphDatabaseQueryService queryService;

public LifecycleManagedBoltFactory( GraphDatabaseAPI gds, UsageData usageData, LogService logging,
ThreadToStatementContextBridge txBridge, Authentication authentication,
NeoStoreDataSource neoStoreDataSource, BoltConnectionTracker connectionTracker)
ThreadToStatementContextBridge txBridge, Authentication authentication,
BoltConnectionTracker connectionTracker )
{
this.gds = gds;
this.usageData = usageData;
this.logging = logging;
this.txBridge = txBridge;
this.authentication = authentication;
this.connectionTracker = connectionTracker;
this.neoStoreDataSource = neoStoreDataSource;
}

@Override
Expand All @@ -66,7 +66,9 @@ public void init() throws Throwable
@Override
public void start() throws Throwable
{
this.queryExecutionEngine = gds.getDependencyResolver().resolveDependency( QueryExecutionEngine.class );
DependencyResolver dependencyResolver = gds.getDependencyResolver();
queryExecutionEngine = dependencyResolver.resolveDependency( QueryExecutionEngine.class );
queryService = dependencyResolver.resolveDependency( GraphDatabaseQueryService.class );
life.start();
}

Expand All @@ -85,7 +87,8 @@ public void shutdown() throws Throwable
@Override
public BoltStateMachine newMachine( String connectionDescriptor, Runnable onClose )
{
final CypherStatementRunner statementRunner = new CypherStatementRunner( queryExecutionEngine, txBridge );
final CypherStatementRunner statementRunner = new CypherStatementRunner( queryExecutionEngine, txBridge,
queryService );
BoltStateMachine.SPI spi = new BoltStateMachineSPI( connectionDescriptor, usageData, gds,
queryExecutionEngine, logging, authentication, txBridge, statementRunner, connectionTracker );
return new BoltStateMachine( spi, onClose );
Expand Down
Expand Up @@ -20,6 +20,8 @@

package org.neo4j.bolt.v1.runtime.cypher;

import java.util.Map;

import org.neo4j.bolt.v1.runtime.spi.StatementRunner;
import org.neo4j.graphdb.Result;
import org.neo4j.kernel.GraphDatabaseQueryService;
Expand All @@ -32,8 +34,6 @@
import org.neo4j.kernel.impl.query.QueryExecutionEngine;
import org.neo4j.kernel.impl.query.QuerySession;

import java.util.Map;

import static java.lang.String.format;
import static org.neo4j.kernel.api.KernelTransaction.Type.implicit;

Expand All @@ -43,21 +43,23 @@ public class CypherStatementRunner implements StatementRunner

private final QueryExecutionEngine queryExecutionEngine;
private final ThreadToStatementContextBridge txBridge;
private GraphDatabaseQueryService queryService;

public CypherStatementRunner( QueryExecutionEngine queryExecutionEngine, ThreadToStatementContextBridge txBridge )
public CypherStatementRunner( QueryExecutionEngine queryExecutionEngine, ThreadToStatementContextBridge txBridge,
GraphDatabaseQueryService queryService )
{
this.queryExecutionEngine = queryExecutionEngine;
this.txBridge = txBridge;
this.queryService = queryService;
}

@Override
public Result run( final String querySource, final AuthSubject authSubject, final String statement, final Map<String, Object> params )
throws KernelException
{
GraphDatabaseQueryService service = queryExecutionEngine.queryService();
InternalTransaction transaction = service.beginTransaction( implicit, authSubject );
InternalTransaction transaction = queryService.beginTransaction( implicit, authSubject );
Neo4jTransactionalContext transactionalContext =
new Neo4jTransactionalContext( service, transaction, txBridge.get(), locker );
new Neo4jTransactionalContext( queryService, transaction, txBridge.get(), locker );
QuerySession session = new BoltQuerySession( transactionalContext, querySource );
return queryExecutionEngine.executeQuery( statement, params, session );
}
Expand Down
Expand Up @@ -19,6 +19,10 @@
*/
package org.neo4j.bolt.v1.runtime.integration;

import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
Expand All @@ -27,10 +31,6 @@
import java.util.LinkedList;
import java.util.Map;

import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;

import org.neo4j.bolt.security.auth.Authentication;
import org.neo4j.bolt.security.auth.BasicAuthentication;
import org.neo4j.bolt.v1.runtime.BoltStateMachine;
Expand All @@ -39,7 +39,6 @@
import org.neo4j.graphdb.DependencyResolver;
import org.neo4j.graphdb.config.Setting;
import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import org.neo4j.kernel.NeoStoreDataSource;
import org.neo4j.kernel.api.bolt.BoltConnectionTracker;
import org.neo4j.kernel.api.security.AuthManager;
import org.neo4j.kernel.configuration.Config;
Expand Down Expand Up @@ -77,8 +76,7 @@ public void evaluate() throws Throwable
resolver.resolveDependency( AuthManager.class ), logService );
boltFactory = new LifecycleManagedBoltFactory( gdb, new UsageData( null ), logService,
resolver.resolveDependency( ThreadToStatementContextBridge.class ),
authentication, resolver.resolveDependency( NeoStoreDataSource.class ),
BoltConnectionTracker.NOOP );
authentication, BoltConnectionTracker.NOOP );
boltFactory.start();
try
{
Expand Down
Expand Up @@ -20,11 +20,13 @@
package org.neo4j.cypher.internal.javacompat;

import org.neo4j.cypher.javacompat.internal.GraphDatabaseCypherService;
import org.neo4j.graphdb.DependencyResolver;
import org.neo4j.helpers.Service;
import org.neo4j.kernel.internal.GraphDatabaseAPI;
import org.neo4j.kernel.impl.logging.LogService;
import org.neo4j.kernel.impl.query.QueryEngineProvider;
import org.neo4j.kernel.impl.query.QueryExecutionEngine;
import org.neo4j.kernel.impl.util.Dependencies;
import org.neo4j.kernel.internal.GraphDatabaseAPI;

@Service.Implementation(QueryEngineProvider.class)
public class CypherEngineProvider extends QueryEngineProvider
Expand All @@ -35,9 +37,13 @@ public CypherEngineProvider()
}

@Override
protected QueryExecutionEngine createEngine( GraphDatabaseAPI graphAPI )
protected QueryExecutionEngine createEngine( Dependencies deps, GraphDatabaseAPI graphAPI )
{
LogService logService = graphAPI.getDependencyResolver().resolveDependency( LogService.class );
return new ExecutionEngine( new GraphDatabaseCypherService( graphAPI ), logService.getInternalLogProvider() );
GraphDatabaseCypherService queryService = new GraphDatabaseCypherService( graphAPI );
deps.satisfyDependency( queryService );

DependencyResolver resolver = graphAPI.getDependencyResolver();
LogService logService = resolver.resolveDependency( LogService.class );
return new ExecutionEngine( queryService, logService.getInternalLogProvider() );
}
}
Expand Up @@ -50,12 +50,6 @@ public ExecutionEngine( GraphDatabaseQueryService queryService, LogProvider logP
inner = new org.neo4j.cypher.internal.ExecutionEngine( queryService, logProvider );
}

@Override
public GraphDatabaseQueryService queryService()
{
return inner.queryService();
}

@Override
public Result executeQuery( String query, Map<String, Object> parameters, QuerySession querySession ) throws
QueryExecutionKernelException
Expand Down
Expand Up @@ -139,7 +139,7 @@ public URL validateURLAccess( URL url ) throws URLAccessValidationError
@Override
public GraphDatabaseQueryService queryService()
{
return dataSource.queryExecutor.get().queryService();
return platform.dependencies.resolveDependency( GraphDatabaseQueryService.class );
}

@Override
Expand Down
Expand Up @@ -230,10 +230,8 @@ public void registered( NeoStoreDataSource dataSource )
{
if ( engine == null )
{
engine = QueryEngineProvider.initialize( platformModule.graphDatabaseFacade,
engine = QueryEngineProvider.initialize( deps, platformModule.graphDatabaseFacade,
dependencies.executionEngines() );

deps.satisfyDependency( engine );
}

queryExecutor.set( engine );
Expand Down
Expand Up @@ -186,7 +186,7 @@ public URL validateURLAccess( URL url ) throws URLAccessValidationError
@Override
public GraphDatabaseQueryService queryService()
{
return queryExecutor.get().queryService();
return resolver.resolveDependency( GraphDatabaseQueryService.class );
}

@Override
Expand Down
Expand Up @@ -22,7 +22,6 @@
import java.util.Map;

import org.neo4j.graphdb.Result;
import org.neo4j.kernel.GraphDatabaseQueryService;

enum NoQueryEngine implements QueryExecutionEngine
{
Expand Down Expand Up @@ -52,12 +51,6 @@ public boolean isPeriodicCommit( String query )
throw noQueryEngine();
}

@Override
public GraphDatabaseQueryService queryService()
{
throw noQueryEngine();
}

private RuntimeException noQueryEngine()
{
return new UnsupportedOperationException( "No query engine installed." );
Expand Down
Expand Up @@ -20,6 +20,7 @@
package org.neo4j.kernel.impl.query;

import org.neo4j.helpers.Service;
import org.neo4j.kernel.impl.util.Dependencies;
import org.neo4j.kernel.internal.GraphDatabaseAPI;

import static java.lang.String.format;
Expand All @@ -31,9 +32,10 @@ public QueryEngineProvider( String name )
super( name );
}

protected abstract QueryExecutionEngine createEngine( GraphDatabaseAPI graphAPI );
protected abstract QueryExecutionEngine createEngine( Dependencies deps, GraphDatabaseAPI graphAPI );

public static QueryExecutionEngine initialize( GraphDatabaseAPI graphAPI, Iterable<QueryEngineProvider> providers )
public static QueryExecutionEngine initialize( Dependencies deps, GraphDatabaseAPI graphAPI,
Iterable<QueryEngineProvider> providers )
{
QueryEngineProvider provider = null;
for ( QueryEngineProvider candidate : providers )
Expand All @@ -49,9 +51,10 @@ public static QueryExecutionEngine initialize( GraphDatabaseAPI graphAPI, Iterab
}
if ( provider == null )
{
return NoQueryEngine.INSTANCE;
return noEngine();
}
return provider.createEngine( graphAPI );
QueryExecutionEngine engine = provider.createEngine( deps, graphAPI );
return deps.satisfyDependency( engine );
}

public static QueryExecutionEngine noEngine()
Expand Down
Expand Up @@ -22,12 +22,9 @@
import java.util.Map;

import org.neo4j.graphdb.Result;
import org.neo4j.kernel.GraphDatabaseQueryService;

public interface QueryExecutionEngine
{
GraphDatabaseQueryService queryService();

Result executeQuery( String query, Map<String, Object> parameters, QuerySession querySession ) throws QueryExecutionKernelException;

Result profileQuery( String query, Map<String, Object> parameters, QuerySession querySession) throws QueryExecutionKernelException;
Expand Down

0 comments on commit f076bf2

Please sign in to comment.