use of org.neo4j.kernel.api.procedure.GlobalProcedures in project neo4j by neo4j.
the class SingleInstanceRoutingProcedureInstallerTest method shouldRegisterRoutingProcedures.
@Test
void shouldRegisterRoutingProcedures() throws Exception {
DatabaseManager<?> databaseManager = mock(DatabaseManager.class);
ConnectorPortRegister portRegister = mock(ConnectorPortRegister.class);
ClientRoutingDomainChecker clientRoutingDomainChecker = mock(ClientRoutingDomainChecker.class);
Config config = Config.defaults();
LogProvider logProvider = nullLogProvider();
SingleInstanceRoutingProcedureInstaller installer = new SingleInstanceRoutingProcedureInstaller(databaseManager, clientRoutingDomainChecker, portRegister, config, logProvider);
GlobalProcedures procedures = spy(new GlobalProceduresRegistry());
installer.install(procedures);
verify(procedures, times(2)).register(any(GetRoutingTableProcedure.class));
Set<QualifiedName> expectedNames = newSetWith(new QualifiedName(new String[] { "dbms", "routing" }, "getRoutingTable"), new QualifiedName(new String[] { "dbms", "cluster", "routing" }, "getRoutingTable"));
Set<QualifiedName> actualNames = procedures.getAllProcedures().stream().map(ProcedureSignature::name).collect(toSet());
assertEquals(expectedNames, actualNames);
}
use of org.neo4j.kernel.api.procedure.GlobalProcedures in project neo4j by neo4j.
the class FabricServicesBootstrap method bootstrapServices.
public void bootstrapServices() {
LogProvider internalLogProvider = logService.getInternalLogProvider();
@SuppressWarnings("unchecked") var databaseManager = (DatabaseManager<DatabaseContext>) resolve(DatabaseManager.class);
var fabricDatabaseManager = register(createFabricDatabaseManager(fabricConfig), FabricDatabaseManager.class);
var jobScheduler = resolve(JobScheduler.class);
var monitors = resolve(Monitors.class);
var databaseAccess = createFabricDatabaseAccess();
var remoteExecutor = bootstrapRemoteStack();
var localExecutor = register(new FabricLocalExecutor(fabricConfig, fabricDatabaseManager, databaseAccess), FabricLocalExecutor.class);
var systemNanoClock = resolve(SystemNanoClock.class);
var transactionMonitor = register(new FabricTransactionMonitor(systemNanoClock, logService, fabricConfig), FabricTransactionMonitor.class);
var transactionCheckInterval = config.get(GraphDatabaseSettings.transaction_monitor_check_interval).toMillis();
register(new TransactionMonitorScheduler(transactionMonitor, jobScheduler, transactionCheckInterval, null), TransactionMonitorScheduler.class);
var errorReporter = new ErrorReporter(logService);
register(new TransactionManager(remoteExecutor, localExecutor, errorReporter, fabricConfig, transactionMonitor, securityLog, systemNanoClock, config, availabilityGuard), TransactionManager.class);
var cypherConfig = CypherConfiguration.fromConfig(config);
Supplier<GlobalProcedures> proceduresSupplier = () -> resolve(GlobalProcedures.class);
var catalogManager = register(createCatalogManger(), CatalogManager.class);
var signatureResolver = new SignatureResolver(proceduresSupplier);
var statementLifecycles = new FabricStatementLifecycles(databaseManager, monitors, config, systemNanoClock);
var monitoredExecutor = jobScheduler.monitoredJobExecutor(CYPHER_CACHE);
var cacheFactory = new ExecutorBasedCaffeineCacheFactory(job -> monitoredExecutor.execute(systemJob("Query plan cache maintenance"), job));
var planner = register(new FabricPlanner(fabricConfig, cypherConfig, monitors, cacheFactory, signatureResolver), FabricPlanner.class);
var useEvaluation = register(new UseEvaluation(catalogManager, proceduresSupplier, signatureResolver), UseEvaluation.class);
register(new FabricReactorHooksService(errorReporter), FabricReactorHooksService.class);
Executor fabricWorkerExecutor = jobScheduler.executor(FABRIC_WORKER);
var fabricExecutor = new FabricExecutor(fabricConfig, planner, useEvaluation, catalogManager, internalLogProvider, statementLifecycles, fabricWorkerExecutor);
register(fabricExecutor, FabricExecutor.class);
register(new TransactionBookmarkManagerFactory(fabricDatabaseManager), TransactionBookmarkManagerFactory.class);
}
use of org.neo4j.kernel.api.procedure.GlobalProcedures in project neo4j by neo4j.
the class TokenHoldersIdLookupTest method setup.
@BeforeAll
static void setup() throws KernelException {
GlobalProcedures procs = new GlobalProceduresRegistry();
procs.registerProcedure(TestProcedures.class);
procs.registerFunction(TestProcedures.class);
procs.registerAggregationFunction(TestProcedures.class);
procName2id = new HashMap<>();
for (ProcedureSignature signature : procs.getAllProcedures()) {
QualifiedName name = signature.name();
ProcedureHandle procedure = procs.procedure(name);
procName2id.put(name.toString(), procedure.id());
}
funcName2id = new HashMap<>();
procs.getAllNonAggregatingFunctions().forEach(signature -> {
QualifiedName name = signature.name();
UserFunctionHandle function = procs.function(name);
funcName2id.put(name.toString(), function.id());
});
procs.getAllAggregatingFunctions().forEach(signature -> {
QualifiedName name = signature.name();
UserFunctionHandle function = procs.aggregationFunction(name);
funcName2id.put(name.toString(), function.id());
});
idLookup = new TokenHoldersIdLookup(mockedTokenHolders(), procs);
}
use of org.neo4j.kernel.api.procedure.GlobalProcedures in project neo4j by neo4j.
the class DatabaseManagementServiceFactory method setupProcedures.
/**
* Creates and registers the systems procedures, including those which belong to a particular edition.
* N.B. This method takes a {@link DatabaseManager} as an unused parameter *intentionally*, in
* order to enforce that the databaseManager must be constructed first.
*/
@SuppressWarnings("unused")
private static void setupProcedures(GlobalModule globalModule, AbstractEditionModule editionModule, DatabaseManager<?> databaseManager) {
Supplier<GlobalProcedures> procedureInitializer = () -> {
Config globalConfig = globalModule.getGlobalConfig();
Path proceduresDirectory = globalConfig.get(GraphDatabaseSettings.plugin_dir);
LogService logService = globalModule.getLogService();
Log internalLog = logService.getInternalLog(GlobalProcedures.class);
Log proceduresLog = logService.getUserLog(GlobalProcedures.class);
ProcedureConfig procedureConfig = new ProcedureConfig(globalConfig);
Edition neo4jEdition = globalModule.getDbmsInfo().edition;
SpecialBuiltInProcedures builtInProcedures = new SpecialBuiltInProcedures(Version.getNeo4jVersion(), neo4jEdition.toString());
GlobalProceduresRegistry globalProcedures = new GlobalProceduresRegistry(builtInProcedures, proceduresDirectory, internalLog, procedureConfig);
globalProcedures.registerType(Node.class, NTNode);
globalProcedures.registerType(NodeValue.class, NTNode);
globalProcedures.registerType(Relationship.class, NTRelationship);
globalProcedures.registerType(RelationshipValue.class, NTRelationship);
globalProcedures.registerType(org.neo4j.graphdb.Path.class, NTPath);
globalProcedures.registerType(PathValue.class, NTPath);
globalProcedures.registerType(Geometry.class, NTGeometry);
globalProcedures.registerType(Point.class, NTPoint);
globalProcedures.registerType(PointValue.class, NTPoint);
// Below components are not public API, but are made available for internal
// procedures to call, and to provide temporary workarounds for the following
// patterns:
// - Batch-transaction imports (GDAPI, needs to be real and passed to background processing threads)
// - Group-transaction writes (same pattern as above, but rather than splitting large transactions,
// combine lots of small ones)
// - Bleeding-edge performance (KernelTransaction, to bypass overhead of working with Core API)
globalProcedures.registerComponent(DependencyResolver.class, Context::dependencyResolver, false);
globalProcedures.registerComponent(KernelTransaction.class, ctx -> ctx.internalTransaction().kernelTransaction(), false);
globalProcedures.registerComponent(GraphDatabaseAPI.class, Context::graphDatabaseAPI, false);
globalProcedures.registerComponent(SystemGraphComponents.class, ctx -> globalModule.getSystemGraphComponents(), false);
globalProcedures.registerComponent(ValueMapper.class, Context::valueMapper, true);
// Register injected public API components
globalProcedures.registerComponent(Log.class, ctx -> proceduresLog, true);
globalProcedures.registerComponent(Transaction.class, new ProcedureTransactionProvider(), true);
globalProcedures.registerComponent(org.neo4j.procedure.TerminationGuard.class, new TerminationGuardProvider(), true);
globalProcedures.registerComponent(SecurityContext.class, Context::securityContext, true);
globalProcedures.registerComponent(ProcedureCallContext.class, Context::procedureCallContext, true);
globalProcedures.registerComponent(FulltextAdapter.class, ctx -> ctx.dependencyResolver().resolveDependency(FulltextAdapter.class), true);
globalProcedures.registerComponent(GraphDatabaseService.class, ctx -> new GraphDatabaseFacade((GraphDatabaseFacade) ctx.graphDatabaseAPI(), new ProcedureLoginContextTransformer(ctx)), true);
globalProcedures.registerComponent(DataCollector.class, ctx -> ctx.dependencyResolver().resolveDependency(DataCollector.class), false);
// Edition procedures
try {
editionModule.registerProcedures(globalProcedures, procedureConfig, globalModule, databaseManager);
} catch (KernelException e) {
internalLog.error("Failed to register built-in edition procedures at start up: " + e.getMessage());
}
globalModule.getGlobalLife().add(globalProcedures);
return globalProcedures;
};
GlobalProcedures procedures = tryResolveOrCreate(GlobalProcedures.class, globalModule.getExternalDependencyResolver(), procedureInitializer);
if (procedures instanceof Consumer) {
((Consumer) procedures).accept(procedureInitializer);
}
globalModule.getGlobalDependencies().satisfyDependency(procedures);
}
use of org.neo4j.kernel.api.procedure.GlobalProcedures in project neo4j by neo4j.
the class BuiltInDbmsProcedures method listFunctions.
@Deprecated(since = "4.3.0", forRemoval = true)
@SystemProcedure
@Description("List all functions in the DBMS.")
@Procedure(name = "dbms.functions", mode = DBMS, deprecatedBy = "SHOW FUNCTIONS command")
public Stream<FunctionResult> listFunctions() {
DependencyResolver resolver = graph.getDependencyResolver();
QueryExecutionEngine queryExecutionEngine = resolver.resolveDependency(QueryExecutionEngine.class);
List<FunctionInformation> providedLanguageFunctions = queryExecutionEngine.getProvidedLanguageFunctions();
var globalProcedures = resolver.resolveDependency(GlobalProcedures.class);
// gets you all functions provided by the query language
Stream<FunctionResult> languageFunctions = providedLanguageFunctions.stream().map(FunctionResult::new);
// gets you all non-aggregating functions that are registered in the db (incl. those from libs like apoc)
Stream<FunctionResult> loadedFunctions = globalProcedures.getAllNonAggregatingFunctions().map(f -> new FunctionResult(f, false));
// gets you all aggregation functions that are registered in the db (incl. those from libs like apoc)
Stream<FunctionResult> loadedAggregationFunctions = globalProcedures.getAllAggregatingFunctions().map(f -> new FunctionResult(f, true));
return Stream.concat(Stream.concat(languageFunctions, loadedFunctions), loadedAggregationFunctions).sorted(Comparator.comparing(a -> a.name));
}
Aggregations