Skip to content

Commit

Permalink
Port token access in Core API to use Kernel API
Browse files Browse the repository at this point in the history
  • Loading branch information
pontusmelke committed Mar 2, 2018
1 parent 128918f commit 2d7c614
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 39 deletions.
Expand Up @@ -26,9 +26,11 @@
import org.neo4j.graphdb.Resource; import org.neo4j.graphdb.Resource;
import org.neo4j.graphdb.ResourceIterator; import org.neo4j.graphdb.ResourceIterator;
import org.neo4j.helpers.collection.PrefetchingResourceIterator; import org.neo4j.helpers.collection.PrefetchingResourceIterator;
import org.neo4j.kernel.api.ReadOperations; import org.neo4j.internal.kernel.api.NamedToken;
import org.neo4j.internal.kernel.api.SchemaRead;
import org.neo4j.internal.kernel.api.TokenRead;
import org.neo4j.kernel.api.KernelTransaction;
import org.neo4j.kernel.api.Statement; import org.neo4j.kernel.api.Statement;
import org.neo4j.storageengine.api.Token;


import static org.neo4j.graphdb.Label.label; import static org.neo4j.graphdb.Label.label;
import static org.neo4j.kernel.api.ReadOperations.ANY_LABEL; import static org.neo4j.kernel.api.ReadOperations.ANY_LABEL;
Expand All @@ -38,80 +40,78 @@ public abstract class TokenAccess<R>
public static final TokenAccess<RelationshipType> RELATIONSHIP_TYPES = new TokenAccess<RelationshipType>() public static final TokenAccess<RelationshipType> RELATIONSHIP_TYPES = new TokenAccess<RelationshipType>()
{ {
@Override @Override
Iterator<Token> tokens( ReadOperations read ) Iterator<NamedToken> tokens( TokenRead read )
{ {
return read.relationshipTypesGetAllTokens(); return read.relationshipTypesGetAllTokens();
} }


@Override @Override
RelationshipType token( Token token ) RelationshipType token( NamedToken token )
{ {
if ( token instanceof RelationshipType )
{
return (RelationshipType) token;
}
return RelationshipType.withName( token.name() ); return RelationshipType.withName( token.name() );
} }


@Override @Override
boolean inUse( ReadOperations read, int tokenId ) boolean inUse( KernelTransaction transaction, int tokenId )
{ {
return hasAny( read.constraintsGetForRelationshipType( tokenId ) ) || // used by constraint return hasAny( transaction.schemaRead().constraintsGetForRelationshipType( tokenId ) ) || // used by constraint
read.countsForRelationship( ANY_LABEL, tokenId, ANY_LABEL ) > 0; // used by data transaction.dataRead().countsForRelationship( ANY_LABEL, tokenId, ANY_LABEL ) > 0; // used by data
} }
}; };
public static final TokenAccess<Label> LABELS = new TokenAccess<Label>() public static final TokenAccess<Label> LABELS = new TokenAccess<Label>()
{ {
@Override @Override
Iterator<Token> tokens( ReadOperations read ) Iterator<NamedToken> tokens( TokenRead read )
{ {
return read.labelsGetAllTokens(); return read.labelsGetAllTokens();
} }


@Override @Override
Label token( Token token ) Label token( NamedToken token )
{ {
return label( token.name() ); return label( token.name() );
} }


@Override @Override
boolean inUse( ReadOperations read, int tokenId ) boolean inUse( KernelTransaction transaction, int tokenId )
{ {
return hasAny( read.indexesGetForLabel( tokenId ) ) || // used by index
hasAny( read.constraintsGetForLabel( tokenId ) ) || // used by constraint SchemaRead schemaRead = transaction.schemaRead();
read.countsForNode( tokenId ) > 0; // used by data return hasAny( schemaRead.indexesGetForLabel( tokenId ) ) || // used by index
hasAny( schemaRead.constraintsGetForLabel( tokenId ) ) || // used by constraint
transaction.dataRead().countsForNode( tokenId ) > 0; // used by data
} }
}; };


public static final TokenAccess<String> PROPERTY_KEYS = new TokenAccess<String>() public static final TokenAccess<String> PROPERTY_KEYS = new TokenAccess<String>()
{ {
@Override @Override
Iterator<Token> tokens( ReadOperations read ) Iterator<NamedToken> tokens( TokenRead read )
{ {
return read.propertyKeyGetAllTokens(); return read.propertyKeyGetAllTokens();
} }


@Override @Override
String token( Token token ) String token( NamedToken token )
{ {
return token.name(); return token.name();
} }


@Override @Override
boolean inUse( ReadOperations read, int tokenId ) boolean inUse( KernelTransaction transaction, int tokenId )
{ {
return true; // TODO: add support for telling if a property key is in use or not return true; // TODO: add support for telling if a property key is in use or not
} }
}; };


public final ResourceIterator<R> inUse( Statement statement ) public final ResourceIterator<R> inUse( KernelTransaction transaction )
{ {
return TokenIterator.inUse( statement, this ); return TokenIterator.inUse( transaction, this );
} }


public final ResourceIterator<R> all( Statement statement ) public final ResourceIterator<R> all( KernelTransaction transaction )
{ {
return TokenIterator.all( statement, this ); return TokenIterator.all( transaction, this );
} }


private static boolean hasAny( Iterator<?> iter ) private static boolean hasAny( Iterator<?> iter )
Expand All @@ -131,13 +131,13 @@ private abstract static class TokenIterator<T> extends PrefetchingResourceIterat
{ {
private Statement statement; private Statement statement;
protected final TokenAccess<T> access; protected final TokenAccess<T> access;
protected final Iterator<Token> tokens; protected final Iterator<NamedToken> tokens;


private TokenIterator( Statement statement, TokenAccess<T> access ) private TokenIterator( KernelTransaction transaction, TokenAccess<T> access )
{ {
this.statement = statement;
this.access = access; this.access = access;
this.tokens = access.tokens( statement.readOperations() ); this.statement = transaction.acquireStatement();
this.tokens = access.tokens( transaction.tokenRead() );
} }


@Override @Override
Expand All @@ -150,17 +150,17 @@ public void close()
} }
} }


static <T> ResourceIterator<T> inUse( Statement statement, TokenAccess<T> access ) static <T> ResourceIterator<T> inUse( KernelTransaction transaction, TokenAccess<T> access )
{ {
return new TokenIterator<T>( statement, access ) return new TokenIterator<T>( transaction, access )
{ {
@Override @Override
protected T fetchNextOrNull() protected T fetchNextOrNull()
{ {
while ( tokens.hasNext() ) while ( tokens.hasNext() )
{ {
Token token = tokens.next(); NamedToken token = tokens.next();
if ( this.access.inUse( statement.readOperations(), token.id() ) ) if ( this.access.inUse( transaction, token.id() ) )
{ {
return this.access.token( token ); return this.access.token( token );
} }
Expand All @@ -171,9 +171,9 @@ protected T fetchNextOrNull()
}; };
} }


static <T> ResourceIterator<T> all( Statement statement, TokenAccess<T> access ) static <T> ResourceIterator<T> all( KernelTransaction transaction, TokenAccess<T> access )
{ {
return new TokenIterator<T>( statement, access ) return new TokenIterator<T>( transaction, access )
{ {
@Override @Override
protected T fetchNextOrNull() protected T fetchNextOrNull()
Expand All @@ -192,9 +192,9 @@ protected T fetchNextOrNull()
} }
} }


abstract Iterator<Token> tokens( ReadOperations read ); abstract Iterator<NamedToken> tokens( TokenRead tokenRead );


abstract R token( Token token ); abstract R token( NamedToken token );


abstract boolean inUse( ReadOperations read, int tokenId ); abstract boolean inUse( KernelTransaction transaction, int tokenId );
} }
Expand Up @@ -511,7 +511,7 @@ public ResourceIterable<RelationshipType> getAllRelationshipTypesInUse()
private <T> ResourceIterable<T> allInUse( final TokenAccess<T> tokens ) private <T> ResourceIterable<T> allInUse( final TokenAccess<T> tokens )
{ {
assertTransactionOpen(); assertTransactionOpen();
return () -> tokens.inUse( statementContext.get() ); return () -> tokens.inUse( statementContext.getTopLevelTransactionBoundToThisThread( true ) );
} }


@Override @Override
Expand All @@ -535,7 +535,12 @@ public ResourceIterable<String> getAllPropertyKeys()
private <T> ResourceIterable<T> all( final TokenAccess<T> tokens ) private <T> ResourceIterable<T> all( final TokenAccess<T> tokens )
{ {
assertTransactionOpen(); assertTransactionOpen();
return () -> tokens.all( statementContext.get() ); return () ->
{
KernelTransaction transaction =
statementContext.getKernelTransactionBoundToThisThread( true );
return tokens.all( transaction );
};
} }


@Override @Override
Expand Down

0 comments on commit 2d7c614

Please sign in to comment.