Skip to content

Commit

Permalink
Expose cursors and token via API
Browse files Browse the repository at this point in the history
  • Loading branch information
pontusmelke committed Dec 4, 2017
1 parent 92fbd55 commit 4cb1116
Show file tree
Hide file tree
Showing 8 changed files with 50 additions and 15 deletions.
Expand Up @@ -94,4 +94,9 @@ enum Type
* @return The lock operations of the graph. * @return The lock operations of the graph.
*/ */
Locks locks(); Locks locks();

/**
* @return The cursor factory
*/
CursorFactory cursors();
} }
Expand Up @@ -34,6 +34,7 @@


import org.neo4j.collection.pool.Pool; import org.neo4j.collection.pool.Pool;
import org.neo4j.graphdb.TransactionTerminatedException; import org.neo4j.graphdb.TransactionTerminatedException;
import org.neo4j.internal.kernel.api.CursorFactory;
import org.neo4j.internal.kernel.api.ExplicitIndexRead; import org.neo4j.internal.kernel.api.ExplicitIndexRead;
import org.neo4j.internal.kernel.api.ExplicitIndexWrite; import org.neo4j.internal.kernel.api.ExplicitIndexWrite;
import org.neo4j.internal.kernel.api.Read; import org.neo4j.internal.kernel.api.Read;
Expand Down Expand Up @@ -123,7 +124,6 @@ public class KernelTransactionImplementation implements KernelTransaction, TxSta
private final StoreReadLayer storeLayer; private final StoreReadLayer storeLayer;
private final Clock clock; private final Clock clock;
private final AccessCapability accessCapability; private final AccessCapability accessCapability;
private final Token token;


// 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(),
// whereas others, such as timestamp or txId when transaction starts, even locks, needs to be set in #initialize(). // whereas others, such as timestamp or txId when transaction starts, even locks, needs to be set in #initialize().
Expand Down Expand Up @@ -172,7 +172,7 @@ public KernelTransactionImplementation( StatementOperationParts statementOperati
Pool<KernelTransactionImplementation> pool, Clock clock, CpuClock cpuClock, HeapAllocation heapAllocation, Pool<KernelTransactionImplementation> pool, Clock clock, CpuClock cpuClock, HeapAllocation heapAllocation,
TransactionTracer transactionTracer, LockTracer lockTracer, PageCursorTracerSupplier cursorTracerSupplier, TransactionTracer transactionTracer, LockTracer lockTracer, PageCursorTracerSupplier cursorTracerSupplier,
StorageEngine storageEngine, AccessCapability accessCapability, Cursors cursors, AutoIndexing autoIndexing, StorageEngine storageEngine, AccessCapability accessCapability, Cursors cursors, AutoIndexing autoIndexing,
ExplicitIndexStore explicitIndexStore, Token token ) ExplicitIndexStore explicitIndexStore)
{ {
this.statementOperations = statementOperations; this.statementOperations = statementOperations;
this.schemaWriteGuard = schemaWriteGuard; this.schemaWriteGuard = schemaWriteGuard;
Expand All @@ -196,7 +196,6 @@ public KernelTransactionImplementation( StatementOperationParts statementOperati
this.userMetaData = new HashMap<>(); this.userMetaData = new HashMap<>();
this.operations = this.operations =
new Operations( storageEngine, storageStatement, this, cursors, autoIndexing, explicitIndexStore ); new Operations( storageEngine, storageStatement, this, cursors, autoIndexing, explicitIndexStore );
this.token = token;
} }


/** /**
Expand Down Expand Up @@ -705,7 +704,7 @@ public Write dataWrite() throws InvalidTransactionTypeKernelException
@Override @Override
public Token token() public Token token()
{ {
return token; return operations.token();
} }


@Override @Override
Expand Down Expand Up @@ -739,6 +738,12 @@ public StatementLocks locks()
return statementLocks; return statementLocks;
} }


@Override
public CursorFactory cursors()
{
return operations.cursors();
}

public LockTracer lockTracer() public LockTracer lockTracer()
{ {
return currentStatement.lockTracer(); return currentStatement.lockTracer();
Expand Down
Expand Up @@ -58,7 +58,6 @@
import org.neo4j.helpers.collection.ResourceClosingIterator; import org.neo4j.helpers.collection.ResourceClosingIterator;
import org.neo4j.internal.kernel.api.IndexQuery; import org.neo4j.internal.kernel.api.IndexQuery;
import org.neo4j.internal.kernel.api.NodeCursor; import org.neo4j.internal.kernel.api.NodeCursor;
import org.neo4j.internal.kernel.api.Read;
import org.neo4j.internal.kernel.api.exceptions.EntityNotFoundException; import org.neo4j.internal.kernel.api.exceptions.EntityNotFoundException;
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;
Expand Down Expand Up @@ -96,7 +95,6 @@
import org.neo4j.kernel.impl.coreapi.StandardRelationshipActions; import org.neo4j.kernel.impl.coreapi.StandardRelationshipActions;
import org.neo4j.kernel.impl.coreapi.TopLevelTransaction; import org.neo4j.kernel.impl.coreapi.TopLevelTransaction;
import org.neo4j.kernel.impl.coreapi.schema.SchemaImpl; import org.neo4j.kernel.impl.coreapi.schema.SchemaImpl;
import org.neo4j.kernel.impl.newapi.Cursors;
import org.neo4j.kernel.impl.query.Neo4jTransactionalContextFactory; import org.neo4j.kernel.impl.query.Neo4jTransactionalContextFactory;
import org.neo4j.kernel.impl.query.TransactionalContext; import org.neo4j.kernel.impl.query.TransactionalContext;
import org.neo4j.kernel.impl.query.TransactionalContextFactory; import org.neo4j.kernel.impl.query.TransactionalContextFactory;
Expand Down Expand Up @@ -137,7 +135,6 @@ public class GraphDatabaseFacade implements GraphDatabaseAPI
private SPI spi; private SPI spi;
private TransactionalContextFactory contextFactory; private TransactionalContextFactory contextFactory;
private Config config; private Config config;
private final Cursors cursors = new Cursors();


/** /**
* This is what you need to implemenent to get your very own {@link GraphDatabaseFacade}. This SPI exists as a thin * This is what you need to implemenent to get your very own {@link GraphDatabaseFacade}. This SPI exists as a thin
Expand Down Expand Up @@ -334,10 +331,10 @@ public Node getNodeById( long id )
new EntityNotFoundException( EntityType.NODE, id ) ); new EntityNotFoundException( EntityType.NODE, id ) );
} }


Read read = spi.currentTransaction().dataRead(); KernelTransaction ktx = spi.currentTransaction();
try ( NodeCursor nodeCursor = cursors.allocateNodeCursor() ) try ( NodeCursor nodeCursor = ktx.cursors().allocateNodeCursor() )
{ {
read.singleNode( id, nodeCursor ); ktx.dataRead().singleNode( id, nodeCursor );
if ( !nodeCursor.next() ) if ( !nodeCursor.next() )
{ {
throw new NotFoundException( format( "Node %d not found", id ), throw new NotFoundException( format( "Node %d not found", id ),
Expand Down Expand Up @@ -465,8 +462,9 @@ public ResourceIterable<Node> getAllNodes()
assertTransactionOpen(); assertTransactionOpen();
return () -> return () ->
{ {
NodeCursor cursor = cursors.allocateNodeCursor(); KernelTransaction ktx = spi.currentTransaction();
spi.currentTransaction().dataRead().allNodesScan( cursor ); NodeCursor cursor = ktx.cursors().allocateNodeCursor();
ktx.dataRead().allNodesScan( cursor );
return new PrefetchingResourceIterator<Node>() return new PrefetchingResourceIterator<Node>()
{ {
@Override @Override
Expand Down
Expand Up @@ -25,6 +25,7 @@
import org.neo4j.graphdb.NotInTransactionException; import org.neo4j.graphdb.NotInTransactionException;
import org.neo4j.graphdb.TransactionTerminatedException; import org.neo4j.graphdb.TransactionTerminatedException;
import org.neo4j.internal.kernel.api.CapableIndexReference; import org.neo4j.internal.kernel.api.CapableIndexReference;
import org.neo4j.internal.kernel.api.CursorFactory;
import org.neo4j.internal.kernel.api.ExplicitIndexRead; import org.neo4j.internal.kernel.api.ExplicitIndexRead;
import org.neo4j.internal.kernel.api.ExplicitIndexWrite; import org.neo4j.internal.kernel.api.ExplicitIndexWrite;
import org.neo4j.internal.kernel.api.IndexOrder; import org.neo4j.internal.kernel.api.IndexOrder;
Expand All @@ -41,6 +42,7 @@
import org.neo4j.internal.kernel.api.RelationshipTraversalCursor; import org.neo4j.internal.kernel.api.RelationshipTraversalCursor;
import org.neo4j.internal.kernel.api.Scan; import org.neo4j.internal.kernel.api.Scan;
import org.neo4j.internal.kernel.api.SchemaRead; import org.neo4j.internal.kernel.api.SchemaRead;
import org.neo4j.internal.kernel.api.Token;
import org.neo4j.internal.kernel.api.Write; import org.neo4j.internal.kernel.api.Write;
import org.neo4j.internal.kernel.api.exceptions.EntityNotFoundException; import org.neo4j.internal.kernel.api.exceptions.EntityNotFoundException;
import org.neo4j.internal.kernel.api.exceptions.KernelException; import org.neo4j.internal.kernel.api.exceptions.KernelException;
Expand All @@ -50,8 +52,8 @@
import org.neo4j.kernel.api.explicitindex.AutoIndexing; import org.neo4j.kernel.api.explicitindex.AutoIndexing;
import org.neo4j.kernel.impl.api.KernelTransactionImplementation; import org.neo4j.kernel.impl.api.KernelTransactionImplementation;
import org.neo4j.kernel.impl.index.ExplicitIndexStore; import org.neo4j.kernel.impl.index.ExplicitIndexStore;
import org.neo4j.kernel.impl.locking.ResourceTypes;
import org.neo4j.kernel.impl.index.IndexEntityType; import org.neo4j.kernel.impl.index.IndexEntityType;
import org.neo4j.kernel.impl.locking.ResourceTypes;
import org.neo4j.storageengine.api.EntityType; import org.neo4j.storageengine.api.EntityType;
import org.neo4j.storageengine.api.StorageEngine; import org.neo4j.storageengine.api.StorageEngine;
import org.neo4j.storageengine.api.StorageStatement; import org.neo4j.storageengine.api.StorageStatement;
Expand All @@ -73,6 +75,7 @@ public class Operations implements Read, ExplicitIndexRead, SchemaRead, Write, E
private org.neo4j.kernel.impl.newapi.NodeCursor nodeCursor; private org.neo4j.kernel.impl.newapi.NodeCursor nodeCursor;
private final IndexTxStateUpdater updater; private final IndexTxStateUpdater updater;
private final PropertyCursor propertyCursor; private final PropertyCursor propertyCursor;
private final Cursors cursors;


public Operations( public Operations(
StorageEngine engine, StorageEngine engine,
Expand All @@ -87,6 +90,7 @@ public Operations(
this.nodeCursor = cursors.allocateNodeCursor(); this.nodeCursor = cursors.allocateNodeCursor();
this.propertyCursor = cursors.allocatePropertyCursor(); this.propertyCursor = cursors.allocatePropertyCursor();
this.updater = new IndexTxStateUpdater( engine.storeReadLayer(), allStoreHolder ); this.updater = new IndexTxStateUpdater( engine.storeReadLayer(), allStoreHolder );
this.cursors = cursors;
} }


// READ // READ
Expand Down Expand Up @@ -615,4 +619,14 @@ private Value readProperty( long node, int propertyKey ) throws EntityNotFoundEx
} }
return existingValue; return existingValue;
} }

public CursorFactory cursors()
{
return cursors;
}

public Token token()
{
return allStoreHolder;
}
} }
Expand Up @@ -30,9 +30,9 @@
import org.neo4j.cursor.Cursor; import org.neo4j.cursor.Cursor;
import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.internal.kernel.api.IndexCapability;
import org.neo4j.internal.kernel.api.exceptions.EntityNotFoundException; import org.neo4j.internal.kernel.api.exceptions.EntityNotFoundException;
import org.neo4j.internal.kernel.api.exceptions.PropertyKeyIdNotFoundKernelException;
import org.neo4j.kernel.api.AssertOpen; import org.neo4j.kernel.api.AssertOpen;
import org.neo4j.kernel.api.exceptions.LabelNotFoundKernelException; import org.neo4j.kernel.api.exceptions.LabelNotFoundKernelException;
import org.neo4j.kernel.api.exceptions.PropertyKeyIdNotFoundKernelException;
import org.neo4j.kernel.api.exceptions.RelationshipTypeIdNotFoundKernelException; import org.neo4j.kernel.api.exceptions.RelationshipTypeIdNotFoundKernelException;
import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException; import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException;
import org.neo4j.kernel.api.exceptions.schema.SchemaRuleNotFoundException; import org.neo4j.kernel.api.exceptions.schema.SchemaRuleNotFoundException;
Expand Down
Expand Up @@ -21,6 +21,7 @@


import java.util.Optional; import java.util.Optional;


import org.neo4j.internal.kernel.api.CursorFactory;
import org.neo4j.internal.kernel.api.ExplicitIndexRead; import org.neo4j.internal.kernel.api.ExplicitIndexRead;
import org.neo4j.internal.kernel.api.ExplicitIndexWrite; import org.neo4j.internal.kernel.api.ExplicitIndexWrite;
import org.neo4j.internal.kernel.api.Locks; import org.neo4j.internal.kernel.api.Locks;
Expand Down Expand Up @@ -111,6 +112,12 @@ public Locks locks()
throw new UnsupportedOperationException( "not implemented" ); throw new UnsupportedOperationException( "not implemented" );
} }


@Override
public CursorFactory cursors()
{
throw new UnsupportedOperationException( "not implemented" );
}

@Override @Override
public long closeTransaction() throws TransactionFailureException public long closeTransaction() throws TransactionFailureException
{ {
Expand Down
Expand Up @@ -435,6 +435,12 @@ public Locks locks()
throw new UnsupportedOperationException( "not implemented" ); throw new UnsupportedOperationException( "not implemented" );
} }


@Override
public CursorFactory cursors()
{
throw new UnsupportedOperationException( "not implemented" );
}

@Override @Override
public long closeTransaction() throws TransactionFailureException public long closeTransaction() throws TransactionFailureException
{ {
Expand Down
Expand Up @@ -47,6 +47,7 @@
import org.neo4j.graphdb.Transaction; import org.neo4j.graphdb.Transaction;
import org.neo4j.internal.kernel.api.IndexQuery; import org.neo4j.internal.kernel.api.IndexQuery;
import org.neo4j.internal.kernel.api.exceptions.EntityNotFoundException; import org.neo4j.internal.kernel.api.exceptions.EntityNotFoundException;
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.security.SecurityContext; import org.neo4j.internal.kernel.api.security.SecurityContext;
import org.neo4j.kernel.GraphDatabaseQueryService; import org.neo4j.kernel.GraphDatabaseQueryService;
Expand All @@ -57,7 +58,6 @@
import org.neo4j.kernel.api.dbms.DbmsOperations; import org.neo4j.kernel.api.dbms.DbmsOperations;
import org.neo4j.kernel.api.exceptions.LabelNotFoundKernelException; import org.neo4j.kernel.api.exceptions.LabelNotFoundKernelException;
import org.neo4j.kernel.api.exceptions.ProcedureException; import org.neo4j.kernel.api.exceptions.ProcedureException;
import org.neo4j.kernel.api.exceptions.PropertyKeyIdNotFoundKernelException;
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 Down

0 comments on commit 4cb1116

Please sign in to comment.