From 4cb1116319b37fcf43f9ac6323366e01fc0f3661 Mon Sep 17 00:00:00 2001 From: Pontus Melke Date: Thu, 23 Nov 2017 17:26:24 +0100 Subject: [PATCH] Expose cursors and token via API --- .../neo4j/internal/kernel/api/Transaction.java | 5 +++++ .../api/KernelTransactionImplementation.java | 13 +++++++++---- .../kernel/impl/factory/GraphDatabaseFacade.java | 14 ++++++-------- .../org/neo4j/kernel/impl/newapi/Operations.java | 16 +++++++++++++++- .../neo4j/storageengine/api/StoreReadLayer.java | 2 +- .../builtinprocs/StubKernelTransaction.java | 7 +++++++ .../constraints/ConstraintIndexCreatorTest.java | 6 ++++++ .../org/neo4j/locking/QueryExecutionLocksIT.java | 2 +- 8 files changed, 50 insertions(+), 15 deletions(-) diff --git a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Transaction.java b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Transaction.java index d273c97ea941e..5c62d92ef414b 100644 --- a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Transaction.java +++ b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/Transaction.java @@ -94,4 +94,9 @@ enum Type * @return The lock operations of the graph. */ Locks locks(); + + /** + * @return The cursor factory + */ + CursorFactory cursors(); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementation.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementation.java index f7cd329b0279d..5e5f4e6a373c5 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementation.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/KernelTransactionImplementation.java @@ -34,6 +34,7 @@ import org.neo4j.collection.pool.Pool; 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.ExplicitIndexWrite; import org.neo4j.internal.kernel.api.Read; @@ -123,7 +124,6 @@ public class KernelTransactionImplementation implements KernelTransaction, TxSta private final StoreReadLayer storeLayer; private final Clock clock; 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(), // whereas others, such as timestamp or txId when transaction starts, even locks, needs to be set in #initialize(). @@ -172,7 +172,7 @@ public KernelTransactionImplementation( StatementOperationParts statementOperati Pool pool, Clock clock, CpuClock cpuClock, HeapAllocation heapAllocation, TransactionTracer transactionTracer, LockTracer lockTracer, PageCursorTracerSupplier cursorTracerSupplier, StorageEngine storageEngine, AccessCapability accessCapability, Cursors cursors, AutoIndexing autoIndexing, - ExplicitIndexStore explicitIndexStore, Token token ) + ExplicitIndexStore explicitIndexStore) { this.statementOperations = statementOperations; this.schemaWriteGuard = schemaWriteGuard; @@ -196,7 +196,6 @@ public KernelTransactionImplementation( StatementOperationParts statementOperati this.userMetaData = new HashMap<>(); this.operations = new Operations( storageEngine, storageStatement, this, cursors, autoIndexing, explicitIndexStore ); - this.token = token; } /** @@ -705,7 +704,7 @@ public Write dataWrite() throws InvalidTransactionTypeKernelException @Override public Token token() { - return token; + return operations.token(); } @Override @@ -739,6 +738,12 @@ public StatementLocks locks() return statementLocks; } + @Override + public CursorFactory cursors() + { + return operations.cursors(); + } + public LockTracer lockTracer() { return currentStatement.lockTracer(); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacade.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacade.java index abbcc35cf7b19..fa787b02fa15b 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacade.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacade.java @@ -58,7 +58,6 @@ import org.neo4j.helpers.collection.ResourceClosingIterator; import org.neo4j.internal.kernel.api.IndexQuery; 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.InvalidTransactionTypeKernelException; import org.neo4j.internal.kernel.api.exceptions.KernelException; @@ -96,7 +95,6 @@ import org.neo4j.kernel.impl.coreapi.StandardRelationshipActions; import org.neo4j.kernel.impl.coreapi.TopLevelTransaction; 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.TransactionalContext; import org.neo4j.kernel.impl.query.TransactionalContextFactory; @@ -137,7 +135,6 @@ public class GraphDatabaseFacade implements GraphDatabaseAPI private SPI spi; private TransactionalContextFactory contextFactory; 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 @@ -334,10 +331,10 @@ public Node getNodeById( long id ) new EntityNotFoundException( EntityType.NODE, id ) ); } - Read read = spi.currentTransaction().dataRead(); - try ( NodeCursor nodeCursor = cursors.allocateNodeCursor() ) + KernelTransaction ktx = spi.currentTransaction(); + try ( NodeCursor nodeCursor = ktx.cursors().allocateNodeCursor() ) { - read.singleNode( id, nodeCursor ); + ktx.dataRead().singleNode( id, nodeCursor ); if ( !nodeCursor.next() ) { throw new NotFoundException( format( "Node %d not found", id ), @@ -465,8 +462,9 @@ public ResourceIterable getAllNodes() assertTransactionOpen(); return () -> { - NodeCursor cursor = cursors.allocateNodeCursor(); - spi.currentTransaction().dataRead().allNodesScan( cursor ); + KernelTransaction ktx = spi.currentTransaction(); + NodeCursor cursor = ktx.cursors().allocateNodeCursor(); + ktx.dataRead().allNodesScan( cursor ); return new PrefetchingResourceIterator() { @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Operations.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Operations.java index 2aa3d2dc2fc95..926efdae78fcf 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Operations.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Operations.java @@ -25,6 +25,7 @@ import org.neo4j.graphdb.NotInTransactionException; import org.neo4j.graphdb.TransactionTerminatedException; 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.ExplicitIndexWrite; import org.neo4j.internal.kernel.api.IndexOrder; @@ -41,6 +42,7 @@ import org.neo4j.internal.kernel.api.RelationshipTraversalCursor; import org.neo4j.internal.kernel.api.Scan; 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.exceptions.EntityNotFoundException; import org.neo4j.internal.kernel.api.exceptions.KernelException; @@ -50,8 +52,8 @@ import org.neo4j.kernel.api.explicitindex.AutoIndexing; import org.neo4j.kernel.impl.api.KernelTransactionImplementation; 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.locking.ResourceTypes; import org.neo4j.storageengine.api.EntityType; import org.neo4j.storageengine.api.StorageEngine; import org.neo4j.storageengine.api.StorageStatement; @@ -73,6 +75,7 @@ public class Operations implements Read, ExplicitIndexRead, SchemaRead, Write, E private org.neo4j.kernel.impl.newapi.NodeCursor nodeCursor; private final IndexTxStateUpdater updater; private final PropertyCursor propertyCursor; + private final Cursors cursors; public Operations( StorageEngine engine, @@ -87,6 +90,7 @@ public Operations( this.nodeCursor = cursors.allocateNodeCursor(); this.propertyCursor = cursors.allocatePropertyCursor(); this.updater = new IndexTxStateUpdater( engine.storeReadLayer(), allStoreHolder ); + this.cursors = cursors; } // READ @@ -615,4 +619,14 @@ private Value readProperty( long node, int propertyKey ) throws EntityNotFoundEx } return existingValue; } + + public CursorFactory cursors() + { + return cursors; + } + + public Token token() + { + return allStoreHolder; + } } diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/StoreReadLayer.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/StoreReadLayer.java index 945851e9ff995..661b1c537c039 100644 --- a/community/kernel/src/main/java/org/neo4j/storageengine/api/StoreReadLayer.java +++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/StoreReadLayer.java @@ -30,9 +30,9 @@ import org.neo4j.cursor.Cursor; import org.neo4j.internal.kernel.api.IndexCapability; 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.exceptions.LabelNotFoundKernelException; -import org.neo4j.kernel.api.exceptions.PropertyKeyIdNotFoundKernelException; import org.neo4j.kernel.api.exceptions.RelationshipTypeIdNotFoundKernelException; import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException; import org.neo4j.kernel.api.exceptions.schema.SchemaRuleNotFoundException; diff --git a/community/kernel/src/test/java/org/neo4j/kernel/builtinprocs/StubKernelTransaction.java b/community/kernel/src/test/java/org/neo4j/kernel/builtinprocs/StubKernelTransaction.java index 531b4c5d0a60b..d1ce5879e592c 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/builtinprocs/StubKernelTransaction.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/builtinprocs/StubKernelTransaction.java @@ -21,6 +21,7 @@ import java.util.Optional; +import org.neo4j.internal.kernel.api.CursorFactory; import org.neo4j.internal.kernel.api.ExplicitIndexRead; import org.neo4j.internal.kernel.api.ExplicitIndexWrite; import org.neo4j.internal.kernel.api.Locks; @@ -111,6 +112,12 @@ public Locks locks() throw new UnsupportedOperationException( "not implemented" ); } + @Override + public CursorFactory cursors() + { + throw new UnsupportedOperationException( "not implemented" ); + } + @Override public long closeTransaction() throws TransactionFailureException { diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/constraints/ConstraintIndexCreatorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/constraints/ConstraintIndexCreatorTest.java index 5a33609866704..ee1bed40a98f0 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/constraints/ConstraintIndexCreatorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/constraints/ConstraintIndexCreatorTest.java @@ -435,6 +435,12 @@ public Locks locks() throw new UnsupportedOperationException( "not implemented" ); } + @Override + public CursorFactory cursors() + { + throw new UnsupportedOperationException( "not implemented" ); + } + @Override public long closeTransaction() throws TransactionFailureException { diff --git a/community/neo4j/src/test/java/org/neo4j/locking/QueryExecutionLocksIT.java b/community/neo4j/src/test/java/org/neo4j/locking/QueryExecutionLocksIT.java index b47f5a36d29ae..24efa4e44eedb 100644 --- a/community/neo4j/src/test/java/org/neo4j/locking/QueryExecutionLocksIT.java +++ b/community/neo4j/src/test/java/org/neo4j/locking/QueryExecutionLocksIT.java @@ -47,6 +47,7 @@ import org.neo4j.graphdb.Transaction; import org.neo4j.internal.kernel.api.IndexQuery; 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.security.SecurityContext; import org.neo4j.kernel.GraphDatabaseQueryService; @@ -57,7 +58,6 @@ import org.neo4j.kernel.api.dbms.DbmsOperations; import org.neo4j.kernel.api.exceptions.LabelNotFoundKernelException; 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.index.IndexNotApplicableKernelException; import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException;