Skip to content

Commit

Permalink
Implement methods for functions in Kernel API
Browse files Browse the repository at this point in the history
  • Loading branch information
pontusmelke committed Mar 3, 2018
1 parent 389c75b commit 4813bef
Show file tree
Hide file tree
Showing 9 changed files with 152 additions and 32 deletions.
Expand Up @@ -29,6 +29,7 @@
import org.neo4j.internal.kernel.api.security.SecurityContext; import org.neo4j.internal.kernel.api.security.SecurityContext;
import org.neo4j.kernel.api.exceptions.Status; import org.neo4j.kernel.api.exceptions.Status;
import org.neo4j.kernel.api.exceptions.TransactionFailureException; import org.neo4j.kernel.api.exceptions.TransactionFailureException;
import org.neo4j.kernel.impl.api.ClockContext;
import org.neo4j.kernel.impl.api.Kernel; import org.neo4j.kernel.impl.api.Kernel;


/** /**
Expand Down Expand Up @@ -205,6 +206,8 @@ default void close() throws TransactionFailureException


Revertable overrideWith( SecurityContext context ); Revertable overrideWith( SecurityContext context );


ClockContext clocks();

NodeCursor nodeCursor(); NodeCursor nodeCursor();


RelationshipScanCursor relationshipCursor(); RelationshipScanCursor relationshipCursor();
Expand Down
Expand Up @@ -21,7 +21,6 @@


import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.function.Function; import java.util.function.Function;


Expand All @@ -34,21 +33,22 @@
import org.neo4j.internal.kernel.api.InternalIndexState; import org.neo4j.internal.kernel.api.InternalIndexState;
import org.neo4j.internal.kernel.api.exceptions.EntityNotFoundException; import org.neo4j.internal.kernel.api.exceptions.EntityNotFoundException;
import org.neo4j.internal.kernel.api.exceptions.LabelNotFoundKernelException; import org.neo4j.internal.kernel.api.exceptions.LabelNotFoundKernelException;
import org.neo4j.internal.kernel.api.exceptions.ProcedureException;
import org.neo4j.internal.kernel.api.exceptions.PropertyKeyIdNotFoundKernelException; import org.neo4j.internal.kernel.api.exceptions.PropertyKeyIdNotFoundKernelException;
import org.neo4j.internal.kernel.api.exceptions.explicitindex.ExplicitIndexNotFoundKernelException; import org.neo4j.internal.kernel.api.exceptions.explicitindex.ExplicitIndexNotFoundKernelException;
import org.neo4j.internal.kernel.api.procs.ProcedureSignature;
import org.neo4j.internal.kernel.api.procs.QualifiedName;
import org.neo4j.internal.kernel.api.procs.UserFunctionHandle;
import org.neo4j.internal.kernel.api.procs.UserFunctionSignature;
import org.neo4j.internal.kernel.api.schema.LabelSchemaDescriptor; import org.neo4j.internal.kernel.api.schema.LabelSchemaDescriptor;
import org.neo4j.internal.kernel.api.schema.SchemaDescriptor; import org.neo4j.internal.kernel.api.schema.SchemaDescriptor;
import org.neo4j.internal.kernel.api.schema.constraints.ConstraintDescriptor; import org.neo4j.internal.kernel.api.schema.constraints.ConstraintDescriptor;
import org.neo4j.kernel.api.exceptions.ProcedureException;
import org.neo4j.kernel.api.exceptions.RelationshipTypeIdNotFoundKernelException; import org.neo4j.kernel.api.exceptions.RelationshipTypeIdNotFoundKernelException;
import org.neo4j.kernel.api.exceptions.index.IndexNotApplicableKernelException; import org.neo4j.kernel.api.exceptions.index.IndexNotApplicableKernelException;
import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException; import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException;
import org.neo4j.kernel.api.exceptions.schema.IndexBrokenKernelException; import org.neo4j.kernel.api.exceptions.schema.IndexBrokenKernelException;
import org.neo4j.kernel.api.exceptions.schema.SchemaRuleNotFoundException; import org.neo4j.kernel.api.exceptions.schema.SchemaRuleNotFoundException;
import org.neo4j.kernel.api.index.SchemaIndexProvider; import org.neo4j.kernel.api.index.SchemaIndexProvider;
import org.neo4j.kernel.api.proc.ProcedureSignature;
import org.neo4j.kernel.api.proc.QualifiedName;
import org.neo4j.kernel.api.proc.UserFunctionSignature;
import org.neo4j.kernel.api.schema.index.IndexDescriptor; import org.neo4j.kernel.api.schema.index.IndexDescriptor;
import org.neo4j.kernel.impl.api.RelationshipVisitor; import org.neo4j.kernel.impl.api.RelationshipVisitor;
import org.neo4j.kernel.impl.api.operations.KeyReadOperations; import org.neo4j.kernel.impl.api.operations.KeyReadOperations;
Expand Down Expand Up @@ -498,10 +498,10 @@ DoubleLongRegister indexSample( IndexDescriptor index, DoubleLongRegister target
ProcedureSignature procedureGet( QualifiedName name ) throws ProcedureException; ProcedureSignature procedureGet( QualifiedName name ) throws ProcedureException;


/** Fetch a function given its signature, or <code>empty</code> if no such function exists*/ /** Fetch a function given its signature, or <code>empty</code> if no such function exists*/
Optional<UserFunctionSignature> functionGet( QualifiedName name ); UserFunctionHandle functionGet( QualifiedName name );


/** Fetch an aggregation function given its signature, or <code>empty</code> if no such function exists*/ /** Fetch an aggregation function given its signature, or <code>empty</code> if no such function exists*/
Optional<UserFunctionSignature> aggregationFunctionGet( QualifiedName name ); UserFunctionHandle aggregationFunctionGet( QualifiedName name );


/** Fetch all registered procedures */ /** Fetch all registered procedures */
Set<UserFunctionSignature> functionsGetAll(); Set<UserFunctionSignature> functionsGetAll();
Expand Down
Expand Up @@ -24,11 +24,11 @@
import org.neo4j.internal.kernel.api.Modes; import org.neo4j.internal.kernel.api.Modes;
import org.neo4j.internal.kernel.api.Session; import org.neo4j.internal.kernel.api.Session;
import org.neo4j.internal.kernel.api.Transaction; import org.neo4j.internal.kernel.api.Transaction;
import org.neo4j.internal.kernel.api.exceptions.ProcedureException;
import org.neo4j.internal.kernel.api.security.LoginContext; import org.neo4j.internal.kernel.api.security.LoginContext;
import org.neo4j.kernel.api.InwardKernel; import org.neo4j.kernel.api.InwardKernel;
import org.neo4j.kernel.api.KernelTransaction; import org.neo4j.kernel.api.KernelTransaction;
import org.neo4j.kernel.api.TransactionHook; import org.neo4j.kernel.api.TransactionHook;
import org.neo4j.kernel.api.exceptions.ProcedureException;
import org.neo4j.kernel.api.exceptions.TransactionFailureException; import org.neo4j.kernel.api.exceptions.TransactionFailureException;
import org.neo4j.kernel.api.proc.CallableProcedure; import org.neo4j.kernel.api.proc.CallableProcedure;
import org.neo4j.kernel.api.proc.CallableUserAggregationFunction; import org.neo4j.kernel.api.proc.CallableUserAggregationFunction;
Expand Down
Expand Up @@ -133,7 +133,7 @@ public class KernelTransactionImplementation implements KernelTransaction, TxSta
private final PageCursorTracerSupplier cursorTracerSupplier; private final PageCursorTracerSupplier cursorTracerSupplier;
private final VersionContextSupplier versionContextSupplier; private final VersionContextSupplier versionContextSupplier;
private final StoreReadLayer storeLayer; private final StoreReadLayer storeLayer;
private final Clock clock; private final ClockContext clocks;
private final AccessCapability accessCapability; private final AccessCapability accessCapability;


// State that needs to be reset between uses. Most of these should be cleared or released in #release(), // State that needs to be reset between uses. Most of these should be cleared or released in #release(),
Expand Down Expand Up @@ -197,19 +197,19 @@ public KernelTransactionImplementation( StatementOperationParts statementOperati
this.storageEngine = storageEngine; this.storageEngine = storageEngine;
this.explicitIndexTxStateSupplier = explicitIndexTxStateSupplier; this.explicitIndexTxStateSupplier = explicitIndexTxStateSupplier;
this.pool = pool; this.pool = pool;
this.clock = clock; this.clocks = new ClockContext( clock );
this.transactionTracer = transactionTracer; this.transactionTracer = transactionTracer;
this.cursorTracerSupplier = cursorTracerSupplier; this.cursorTracerSupplier = cursorTracerSupplier;
this.versionContextSupplier = versionContextSupplier; this.versionContextSupplier = versionContextSupplier;
this.storageStatement = storeLayer.newStatement(); this.storageStatement = storeLayer.newStatement();
this.currentStatement = new KernelStatement( this, this, storageStatement, this.currentStatement = new KernelStatement( this, this, storageStatement,
procedures, accessCapability, lockTracer, statementOperations, new ClockContext( clock ), procedures, accessCapability, lockTracer, statementOperations, this.clocks,
versionContextSupplier ); versionContextSupplier );
this.accessCapability = accessCapability; this.accessCapability = accessCapability;
this.statistics = new Statistics( this, cpuClockRef, heapAllocationRef ); this.statistics = new Statistics( this, cpuClockRef, heapAllocationRef );
this.userMetaData = new HashMap<>(); this.userMetaData = new HashMap<>();
AllStoreHolder allStoreHolder = AllStoreHolder allStoreHolder =
new AllStoreHolder( storageEngine, storageStatement, this, cursors, explicitIndexStore ); new AllStoreHolder( storageEngine, storageStatement, this, cursors, explicitIndexStore, procedures );
this.operations = this.operations =
new Operations( new Operations(
allStoreHolder, allStoreHolder,
Expand All @@ -234,7 +234,7 @@ public KernelTransactionImplementation initialize( long lastCommittedTx, long la
this.failure = false; this.failure = false;
this.success = false; this.success = false;
this.writeState = TransactionWriteState.NONE; this.writeState = TransactionWriteState.NONE;
this.startTimeMillis = clock.millis(); this.startTimeMillis = clocks.systemClock().millis();
this.timeoutMillis = transactionTimeout; this.timeoutMillis = transactionTimeout;
this.lastTransactionIdWhenStarted = lastCommittedTx; this.lastTransactionIdWhenStarted = lastCommittedTx;
this.lastTransactionTimestampWhenStarted = lastTimeStamp; this.lastTransactionTimestampWhenStarted = lastTimeStamp;
Expand Down Expand Up @@ -624,7 +624,7 @@ private long commit() throws TransactionFailureException
PhysicalTransactionRepresentation transactionRepresentation = PhysicalTransactionRepresentation transactionRepresentation =
new PhysicalTransactionRepresentation( extractedCommands ); new PhysicalTransactionRepresentation( extractedCommands );
TransactionHeaderInformation headerInformation = headerInformationFactory.create(); TransactionHeaderInformation headerInformation = headerInformationFactory.create();
long timeCommitted = clock.millis(); long timeCommitted = clocks.systemClock().millis();
transactionRepresentation.setHeader( headerInformation.getAdditionalHeader(), transactionRepresentation.setHeader( headerInformation.getAdditionalHeader(),
headerInformation.getMasterId(), headerInformation.getMasterId(),
headerInformation.getAuthorId(), headerInformation.getAuthorId(),
Expand Down Expand Up @@ -797,6 +797,12 @@ public CursorFactory cursors()
return operations.cursors(); return operations.cursors();
} }


@Override
public org.neo4j.internal.kernel.api.Procedures procedures()
{
return operations.procedures();
}

public LockTracer lockTracer() public LockTracer lockTracer()
{ {
return currentStatement.lockTracer(); return currentStatement.lockTracer();
Expand Down Expand Up @@ -1077,6 +1083,12 @@ void reset()
} }
} }


@Override
public ClockContext clocks()
{
return clocks;
}

@Override @Override
public NodeCursor nodeCursor() public NodeCursor nodeCursor()
{ {
Expand Down
Expand Up @@ -21,7 +21,6 @@


import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Stream; import java.util.stream.Stream;
Expand All @@ -40,12 +39,18 @@
import org.neo4j.internal.kernel.api.exceptions.InvalidTransactionTypeKernelException; import org.neo4j.internal.kernel.api.exceptions.InvalidTransactionTypeKernelException;
import org.neo4j.internal.kernel.api.exceptions.KernelException; import org.neo4j.internal.kernel.api.exceptions.KernelException;
import org.neo4j.internal.kernel.api.exceptions.LabelNotFoundKernelException; import org.neo4j.internal.kernel.api.exceptions.LabelNotFoundKernelException;
import org.neo4j.internal.kernel.api.exceptions.ProcedureException;
import org.neo4j.internal.kernel.api.exceptions.PropertyKeyIdNotFoundKernelException; import org.neo4j.internal.kernel.api.exceptions.PropertyKeyIdNotFoundKernelException;
import org.neo4j.internal.kernel.api.exceptions.explicitindex.AutoIndexingKernelException; import org.neo4j.internal.kernel.api.exceptions.explicitindex.AutoIndexingKernelException;
import org.neo4j.internal.kernel.api.exceptions.explicitindex.ExplicitIndexNotFoundKernelException; import org.neo4j.internal.kernel.api.exceptions.explicitindex.ExplicitIndexNotFoundKernelException;
import org.neo4j.internal.kernel.api.exceptions.schema.ConstraintValidationException; import org.neo4j.internal.kernel.api.exceptions.schema.ConstraintValidationException;
import org.neo4j.internal.kernel.api.exceptions.schema.IllegalTokenNameException; import org.neo4j.internal.kernel.api.exceptions.schema.IllegalTokenNameException;
import org.neo4j.internal.kernel.api.exceptions.schema.TooManyLabelsException; import org.neo4j.internal.kernel.api.exceptions.schema.TooManyLabelsException;
import org.neo4j.internal.kernel.api.procs.ProcedureSignature;
import org.neo4j.internal.kernel.api.procs.QualifiedName;
import org.neo4j.internal.kernel.api.procs.UserAggregator;
import org.neo4j.internal.kernel.api.procs.UserFunctionHandle;
import org.neo4j.internal.kernel.api.procs.UserFunctionSignature;
import org.neo4j.internal.kernel.api.schema.LabelSchemaDescriptor; import org.neo4j.internal.kernel.api.schema.LabelSchemaDescriptor;
import org.neo4j.internal.kernel.api.schema.RelationTypeSchemaDescriptor; import org.neo4j.internal.kernel.api.schema.RelationTypeSchemaDescriptor;
import org.neo4j.internal.kernel.api.schema.SchemaDescriptor; import org.neo4j.internal.kernel.api.schema.SchemaDescriptor;
Expand All @@ -63,7 +68,6 @@
import org.neo4j.kernel.api.SchemaWriteOperations; import org.neo4j.kernel.api.SchemaWriteOperations;
import org.neo4j.kernel.api.StatementConstants; import org.neo4j.kernel.api.StatementConstants;
import org.neo4j.kernel.api.TokenWriteOperations; import org.neo4j.kernel.api.TokenWriteOperations;
import org.neo4j.kernel.api.exceptions.ProcedureException;
import org.neo4j.kernel.api.exceptions.RelationshipTypeIdNotFoundKernelException; import org.neo4j.kernel.api.exceptions.RelationshipTypeIdNotFoundKernelException;
import org.neo4j.kernel.api.exceptions.index.IndexNotApplicableKernelException; import org.neo4j.kernel.api.exceptions.index.IndexNotApplicableKernelException;
import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException; import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException;
Expand All @@ -77,11 +81,7 @@
import org.neo4j.kernel.api.exceptions.schema.SchemaRuleNotFoundException; import org.neo4j.kernel.api.exceptions.schema.SchemaRuleNotFoundException;
import org.neo4j.kernel.api.index.SchemaIndexProvider; import org.neo4j.kernel.api.index.SchemaIndexProvider;
import org.neo4j.kernel.api.proc.BasicContext; import org.neo4j.kernel.api.proc.BasicContext;
import org.neo4j.kernel.api.proc.CallableUserAggregationFunction;
import org.neo4j.kernel.api.proc.Context; import org.neo4j.kernel.api.proc.Context;
import org.neo4j.kernel.api.proc.ProcedureSignature;
import org.neo4j.kernel.api.proc.QualifiedName;
import org.neo4j.kernel.api.proc.UserFunctionSignature;
import org.neo4j.kernel.api.query.ExecutingQuery; import org.neo4j.kernel.api.query.ExecutingQuery;
import org.neo4j.kernel.api.schema.constaints.NodeExistenceConstraintDescriptor; import org.neo4j.kernel.api.schema.constaints.NodeExistenceConstraintDescriptor;
import org.neo4j.kernel.api.schema.constaints.NodeKeyConstraintDescriptor; import org.neo4j.kernel.api.schema.constaints.NodeKeyConstraintDescriptor;
Expand Down Expand Up @@ -484,14 +484,14 @@ public ProcedureSignature procedureGet( QualifiedName name ) throws ProcedureExc
} }


@Override @Override
public Optional<UserFunctionSignature> functionGet( QualifiedName name ) public UserFunctionHandle functionGet( QualifiedName name )
{ {
statement.assertOpen(); statement.assertOpen();
return procedures.function( name ); return procedures.function( name );
} }


@Override @Override
public Optional<UserFunctionSignature> aggregationFunctionGet( QualifiedName name ) public UserFunctionHandle aggregationFunctionGet( QualifiedName name )
{ {
statement.assertOpen(); statement.assertOpen();
return procedures.aggregationFunction( name ); return procedures.aggregationFunction( name );
Expand Down Expand Up @@ -1484,7 +1484,7 @@ public AnyValue functionCallOverride( QualifiedName name, AnyValue[] arguments )
} }


@Override @Override
public CallableUserAggregationFunction.Aggregator aggregationFunction( QualifiedName name ) throws ProcedureException public UserAggregator aggregationFunction( QualifiedName name ) throws ProcedureException
{ {
if ( !tx.securityContext().mode().allowsReads() ) if ( !tx.securityContext().mode().allowsReads() )
{ {
Expand All @@ -1495,7 +1495,7 @@ public CallableUserAggregationFunction.Aggregator aggregationFunction( Qualified
} }


@Override @Override
public CallableUserAggregationFunction.Aggregator aggregationFunctionOverride( QualifiedName name ) throws ProcedureException public UserAggregator aggregationFunctionOverride( QualifiedName name ) throws ProcedureException
{ {
return aggregationFunction( name, return aggregationFunction( name,
new OverriddenAccessMode( tx.securityContext().mode(), AccessMode.Static.READ ) ); new OverriddenAccessMode( tx.securityContext().mode(), AccessMode.Static.READ ) );
Expand Down Expand Up @@ -1524,7 +1524,7 @@ private AnyValue callFunction( QualifiedName name, AnyValue[] input, final Acces
} }
} }


private CallableUserAggregationFunction.Aggregator aggregationFunction( QualifiedName name, final AccessMode mode ) private UserAggregator aggregationFunction( QualifiedName name, final AccessMode mode )
throws ProcedureException throws ProcedureException
{ {
statement.assertOpen(); statement.assertOpen();
Expand Down
Expand Up @@ -79,13 +79,13 @@
import org.neo4j.logging.Log; import org.neo4j.logging.Log;
import org.neo4j.procedure.ProcedureTransaction; import org.neo4j.procedure.ProcedureTransaction;


import static org.neo4j.internal.kernel.api.procs.Neo4jTypes.NTGeometry;
import static org.neo4j.internal.kernel.api.procs.Neo4jTypes.NTNode;
import static org.neo4j.internal.kernel.api.procs.Neo4jTypes.NTPath;
import static org.neo4j.internal.kernel.api.procs.Neo4jTypes.NTPoint;
import static org.neo4j.internal.kernel.api.procs.Neo4jTypes.NTRelationship;
import static org.neo4j.kernel.api.proc.Context.KERNEL_TRANSACTION; import static org.neo4j.kernel.api.proc.Context.KERNEL_TRANSACTION;
import static org.neo4j.kernel.api.proc.Context.SECURITY_CONTEXT; import static org.neo4j.kernel.api.proc.Context.SECURITY_CONTEXT;
import static org.neo4j.kernel.api.proc.Neo4jTypes.NTGeometry;
import static org.neo4j.kernel.api.proc.Neo4jTypes.NTNode;
import static org.neo4j.kernel.api.proc.Neo4jTypes.NTPath;
import static org.neo4j.kernel.api.proc.Neo4jTypes.NTPoint;
import static org.neo4j.kernel.api.proc.Neo4jTypes.NTRelationship;


/** /**
* Datasource module for {@link GraphDatabaseFacadeFactory}. This implements all the * Datasource module for {@link GraphDatabaseFacadeFactory}. This implements all the
Expand Down

0 comments on commit 4813bef

Please sign in to comment.