Commit efc02528 authored by MishaDemianenko's avatar MishaDemianenko
Browse files

Remove statement allocation in TransactionImpl.

parent 38a36ccb
Showing with 29 additions and 52 deletions
+29 -52
......@@ -74,7 +74,6 @@ import org.neo4j.internal.schema.IndexType;
import org.neo4j.internal.schema.SchemaDescriptor;
import org.neo4j.kernel.api.KernelTransaction;
import org.neo4j.kernel.api.SilentTokenNameLookup;
import org.neo4j.kernel.api.Statement;
import org.neo4j.kernel.api.exceptions.Status;
import org.neo4j.kernel.api.exceptions.Status.Classification;
import org.neo4j.kernel.api.exceptions.Status.Code;
......@@ -145,7 +144,7 @@ public class TransactionImpl implements InternalTransaction
public Node createNode()
{
var ktx = kernelTransaction();
try ( Statement ignore = ktx.acquireStatement() )
try
{
return newNodeEntity( ktx.dataWrite().nodeCreate() );
}
......@@ -159,7 +158,7 @@ public class TransactionImpl implements InternalTransaction
public Node createNode( Label... labels )
{
var ktx = kernelTransaction();
try ( Statement ignore = ktx.acquireStatement() )
try
{
TokenWrite tokenWrite = ktx.tokenWrite();
int[] labelIds = new int[labels.length];
......@@ -198,15 +197,12 @@ public class TransactionImpl implements InternalTransaction
}
KernelTransaction ktx = kernelTransaction();
try ( Statement ignore = ktx.acquireStatement() )
if ( !ktx.dataRead().nodeExists( id ) )
{
if ( !ktx.dataRead().nodeExists( id ) )
{
throw new NotFoundException( format( "Node %d not found", id ),
new EntityNotFoundException( EntityType.NODE, id ) );
}
return newNodeEntity( id );
throw new NotFoundException( format( "Node %d not found", id ),
new EntityNotFoundException( EntityType.NODE, id ) );
}
return newNodeEntity( id );
}
@Override
......@@ -251,15 +247,13 @@ public class TransactionImpl implements InternalTransaction
}
KernelTransaction ktx = kernelTransaction();
try ( Statement ignore = ktx.acquireStatement() )
if ( !ktx.dataRead().relationshipExists( id ) )
{
if ( !ktx.dataRead().relationshipExists( id ) )
{
throw new NotFoundException( format( "Relationship %d not found", id ),
new EntityNotFoundException( EntityType.RELATIONSHIP, id ) );
}
return newRelationshipEntity( id );
throw new NotFoundException( format( "Relationship %d not found", id ),
new EntityNotFoundException( EntityType.RELATIONSHIP, id ) );
}
return newRelationshipEntity( id );
}
@Override
......@@ -416,7 +410,6 @@ public class TransactionImpl implements InternalTransaction
KernelTransaction ktx = kernelTransaction();
return () ->
{
Statement statement = ktx.acquireStatement();
NodeCursor cursor = ktx.cursors().allocateNodeCursor();
ktx.dataRead().allNodesScan( cursor );
return new PrefetchingResourceIterator<>()
......@@ -439,7 +432,6 @@ public class TransactionImpl implements InternalTransaction
public void close()
{
cursor.close();
statement.close();
}
};
};
......@@ -451,7 +443,6 @@ public class TransactionImpl implements InternalTransaction
KernelTransaction ktx = kernelTransaction();
return () ->
{
Statement statement = ktx.acquireStatement();
RelationshipScanCursor cursor = ktx.cursors().allocateRelationshipScanCursor();
ktx.dataRead().allRelationshipsScan( cursor );
return new PrefetchingResourceIterator<>()
......@@ -475,7 +466,6 @@ public class TransactionImpl implements InternalTransaction
public void close()
{
cursor.close();
statement.close();
}
};
};
......@@ -636,12 +626,10 @@ public class TransactionImpl implements InternalTransaction
private ResourceIterator<Node> nodesByLabelAndProperty( KernelTransaction transaction, int labelId, IndexQuery query )
{
Statement statement = transaction.acquireStatement();
Read read = transaction.dataRead();
if ( query.propertyKeyId() == TokenRead.NO_TOKEN || labelId == TokenRead.NO_TOKEN )
{
statement.close();
return emptyResourceIterator();
}
Iterator<IndexDescriptor> iterator = transaction.schemaRead().index( SchemaDescriptor.forLabel( labelId, query.propertyKeyId() ) );
......@@ -660,7 +648,7 @@ public class TransactionImpl implements InternalTransaction
IndexReadSession indexSession = read.indexReadSession( index );
read.nodeIndexSeek( indexSession, cursor, IndexOrder.NONE, false, query );
return new NodeCursorResourceIterator<>( cursor, statement, this::newNodeEntity );
return new NodeCursorResourceIterator<>( cursor, this::newNodeEntity );
}
catch ( KernelException e )
{
......@@ -668,7 +656,7 @@ public class TransactionImpl implements InternalTransaction
}
}
return getNodesByLabelAndPropertyWithoutIndex( statement, labelId, query );
return getNodesByLabelAndPropertyWithoutIndex( labelId, query );
}
@Override
......@@ -691,8 +679,7 @@ public class TransactionImpl implements InternalTransaction
return !closed;
}
private ResourceIterator<Node> getNodesByLabelAndPropertyWithoutIndex(
Statement statement, int labelId, IndexQuery... queries )
private ResourceIterator<Node> getNodesByLabelAndPropertyWithoutIndex( int labelId, IndexQuery... queries )
{
KernelTransaction transaction = kernelTransaction();
......@@ -706,7 +693,6 @@ public class TransactionImpl implements InternalTransaction
nodeLabelCursor,
nodeCursor,
propertyCursor,
statement,
this::newNodeEntity,
queries );
}
......@@ -714,12 +700,10 @@ public class TransactionImpl implements InternalTransaction
private ResourceIterator<Node> nodesByLabelAndProperties(
KernelTransaction transaction, int labelId, IndexQuery.ExactPredicate... queries )
{
Statement statement = transaction.acquireStatement();
Read read = transaction.dataRead();
if ( isInvalidQuery( labelId, queries ) )
{
statement.close();
return emptyResourceIterator();
}
......@@ -733,14 +717,14 @@ public class TransactionImpl implements InternalTransaction
NodeValueIndexCursor cursor = transaction.cursors().allocateNodeValueIndexCursor();
IndexReadSession indexSession = read.indexReadSession( index );
read.nodeIndexSeek( indexSession, cursor, IndexOrder.NONE, false, getReorderedIndexQueries( index.schema().getPropertyIds(), queries ) );
return new NodeCursorResourceIterator<>( cursor, statement, this::newNodeEntity );
return new NodeCursorResourceIterator<>( cursor, this::newNodeEntity );
}
catch ( KernelException e )
{
// weird at this point but ignore and fallback to a label scan
}
}
return getNodesByLabelAndPropertyWithoutIndex( statement, labelId, queries );
return getNodesByLabelAndPropertyWithoutIndex( labelId, queries );
}
private static IndexQuery[] getReorderedIndexQueries( int[] indexPropertyIds, IndexQuery[] queries )
......@@ -764,18 +748,16 @@ public class TransactionImpl implements InternalTransaction
private ResourceIterator<Node> allNodesWithLabel( final Label myLabel )
{
KernelTransaction ktx = kernelTransaction();
Statement statement = ktx.acquireStatement();
int labelId = ktx.tokenRead().nodeLabel( myLabel.name() );
if ( labelId == TokenRead.NO_TOKEN )
{
statement.close();
return Iterators.emptyResourceIterator();
}
NodeLabelIndexCursor cursor = ktx.cursors().allocateNodeLabelIndexCursor();
ktx.dataRead().nodeLabelScan( labelId, cursor );
return new NodeCursorResourceIterator<>( cursor, statement, this::newNodeEntity );
return new NodeCursorResourceIterator<>( cursor, this::newNodeEntity );
}
private static IndexDescriptor findMatchingIndex( KernelTransaction transaction, int labelId, int[] propertyIds )
......
......@@ -20,16 +20,16 @@
package org.neo4j.kernel.impl.coreapi.internal;
import org.neo4j.internal.kernel.api.NodeIndexCursor;
import org.neo4j.io.IOUtils;
import org.neo4j.kernel.api.Statement;
import static org.neo4j.io.IOUtils.closeAllSilently;
public class NodeCursorResourceIterator<CURSOR extends NodeIndexCursor> extends PrefetchingNodeResourceIterator
{
private final CURSOR cursor;
public NodeCursorResourceIterator( CURSOR cursor, Statement statement, NodeFactory nodeFactory )
public NodeCursorResourceIterator( CURSOR cursor, NodeFactory nodeFactory )
{
super( statement, nodeFactory );
super( nodeFactory );
this.cursor = cursor;
}
......@@ -48,8 +48,8 @@ public class NodeCursorResourceIterator<CURSOR extends NodeIndexCursor> extends
}
@Override
void closeResources( Statement statement )
void closeResources()
{
IOUtils.closeAllSilently( statement, cursor );
closeAllSilently( cursor );
}
}
......@@ -25,7 +25,6 @@ import org.neo4j.internal.kernel.api.NodeLabelIndexCursor;
import org.neo4j.internal.kernel.api.PropertyCursor;
import org.neo4j.internal.kernel.api.Read;
import org.neo4j.io.IOUtils;
import org.neo4j.kernel.api.Statement;
public class NodeLabelPropertyIterator extends PrefetchingNodeResourceIterator
{
......@@ -40,11 +39,10 @@ public class NodeLabelPropertyIterator extends PrefetchingNodeResourceIterator
NodeLabelIndexCursor nodeLabelCursor,
NodeCursor nodeCursor,
PropertyCursor propertyCursor,
Statement statement,
NodeFactory nodeFactory,
IndexQuery... queries )
{
super( statement, nodeFactory );
super( nodeFactory );
this.read = read;
this.nodeLabelCursor = nodeLabelCursor;
this.nodeCursor = nodeCursor;
......@@ -74,9 +72,9 @@ public class NodeLabelPropertyIterator extends PrefetchingNodeResourceIterator
}
@Override
void closeResources( Statement statement )
void closeResources()
{
IOUtils.closeAllSilently( statement, nodeLabelCursor, nodeCursor, propertyCursor );
IOUtils.closeAllSilently( nodeLabelCursor, nodeCursor, propertyCursor );
}
private boolean hasPropertiesWithValues()
......
......@@ -23,11 +23,9 @@ import java.util.NoSuchElementException;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.ResourceIterator;
import org.neo4j.kernel.api.Statement;
abstract class PrefetchingNodeResourceIterator implements ResourceIterator<Node>
{
private final Statement statement;
private final NodeFactory nodeFactory;
private long next;
private boolean closed;
......@@ -35,9 +33,8 @@ abstract class PrefetchingNodeResourceIterator implements ResourceIterator<Node>
private static final long NOT_INITIALIZED = -2L;
protected static final long NO_ID = -1L;
PrefetchingNodeResourceIterator( Statement statement, NodeFactory nodeFactory )
PrefetchingNodeResourceIterator( NodeFactory nodeFactory )
{
this.statement = statement;
this.nodeFactory = nodeFactory;
this.next = NOT_INITIALIZED;
}
......@@ -71,12 +68,12 @@ abstract class PrefetchingNodeResourceIterator implements ResourceIterator<Node>
if ( !closed )
{
next = NO_ID;
closeResources( statement );
closeResources();
closed = true;
}
}
abstract long fetchNext();
abstract void closeResources( Statement statement );
abstract void closeResources();
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment