Skip to content

Commit

Permalink
Port tests to use Kernel API
Browse files Browse the repository at this point in the history
  • Loading branch information
pontusmelke committed Mar 26, 2018
1 parent f88d6e8 commit 1602ae4
Show file tree
Hide file tree
Showing 43 changed files with 1,003 additions and 880 deletions.
Expand Up @@ -59,17 +59,19 @@
import org.neo4j.helpers.collection.Iterators; import org.neo4j.helpers.collection.Iterators;
import org.neo4j.helpers.collection.Pair; import org.neo4j.helpers.collection.Pair;
import org.neo4j.helpers.progress.ProgressMonitorFactory; import org.neo4j.helpers.progress.ProgressMonitorFactory;
import org.neo4j.internal.kernel.api.TokenRead;
import org.neo4j.internal.kernel.api.TokenWrite;
import org.neo4j.internal.kernel.api.exceptions.KernelException;
import org.neo4j.io.pagecache.IOLimiter; import org.neo4j.io.pagecache.IOLimiter;
import org.neo4j.kernel.api.ReadOperations; import org.neo4j.kernel.api.KernelTransaction;
import org.neo4j.kernel.api.TokenWriteOperations; import org.neo4j.kernel.api.Statement;
import org.neo4j.kernel.api.direct.DirectStoreAccess; import org.neo4j.kernel.api.direct.DirectStoreAccess;
import org.neo4j.internal.kernel.api.exceptions.KernelException;
import org.neo4j.kernel.api.exceptions.TransactionFailureException; import org.neo4j.kernel.api.exceptions.TransactionFailureException;
import org.neo4j.kernel.api.index.IndexAccessor; import org.neo4j.kernel.api.index.IndexAccessor;
import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.index.IndexEntryUpdate;
import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexPopulator;
import org.neo4j.kernel.api.index.IndexUpdater;
import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.api.index.IndexProvider;
import org.neo4j.kernel.api.index.IndexUpdater;
import org.neo4j.kernel.api.labelscan.LabelScanStore; import org.neo4j.kernel.api.labelscan.LabelScanStore;
import org.neo4j.kernel.api.labelscan.LabelScanWriter; import org.neo4j.kernel.api.labelscan.LabelScanWriter;
import org.neo4j.kernel.api.labelscan.NodeLabelUpdate; import org.neo4j.kernel.api.labelscan.NodeLabelUpdate;
Expand All @@ -78,7 +80,6 @@
import org.neo4j.kernel.api.schema.index.SchemaIndexDescriptor; import org.neo4j.kernel.api.schema.index.SchemaIndexDescriptor;
import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.annotations.Documented; import org.neo4j.kernel.impl.annotations.Documented;
import org.neo4j.kernel.impl.api.KernelStatement;
import org.neo4j.kernel.impl.api.index.IndexUpdateMode; import org.neo4j.kernel.impl.api.index.IndexUpdateMode;
import org.neo4j.kernel.impl.api.index.NodeUpdates; import org.neo4j.kernel.impl.api.index.NodeUpdates;
import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingConfig; import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingConfig;
Expand Down Expand Up @@ -220,16 +221,15 @@ protected void generateInitialData( GraphDatabaseService db )
try ( org.neo4j.graphdb.Transaction tx = db.beginTx() ) try ( org.neo4j.graphdb.Transaction tx = db.beginTx() )
{ {
db.schema().indexFor( label( "label3" ) ).on( PROP1 ).create(); db.schema().indexFor( label( "label3" ) ).on( PROP1 ).create();

KernelTransaction ktx = transactionOn( db );
try ( KernelStatement statement = statementOn( db ) ) try ( Statement ignore = ktx.acquireStatement() )
{ {
// the Core API for composite index creation is not quite merged yet // the Core API for composite index creation is not quite merged yet
TokenWriteOperations tokenWriteOperations = statement.tokenWriteOperations(); TokenWrite tokenWrite = ktx.tokenWrite();
key1 = tokenWriteOperations.propertyKeyGetOrCreateForName( PROP1 ); key1 = tokenWrite.propertyKeyGetOrCreateForName( PROP1 );
key2 = tokenWriteOperations.propertyKeyGetOrCreateForName( PROP2 ); key2 = tokenWrite.propertyKeyGetOrCreateForName( PROP2 );
label3 = statement.readOperations().labelGetForName( "label3" ); label3 = ktx.tokenRead().nodeLabel( "label3" );
statement.schemaWriteOperations() ktx.schemaWrite().indexCreate( SchemaDescriptorFactory.forLabel( label3, key1, key2 ) );
.indexCreate( SchemaDescriptorFactory.forLabel( label3, key1, key2 ) );
} }


db.schema().constraintFor( label( "label4" ) ).assertPropertyIsUnique( PROP1 ).create(); db.schema().constraintFor( label( "label4" ) ).assertPropertyIsUnique( PROP1 ).create();
Expand Down Expand Up @@ -259,20 +259,21 @@ protected void generateInitialData( GraphDatabaseService db )
set( db.createNode( label( "label4" ) ), property( PROP1, VALUE1 ) ); set( db.createNode( label( "label4" ) ), property( PROP1, VALUE1 ) );
tx.success(); tx.success();


try ( KernelStatement statement = statementOn( db ) ) KernelTransaction ktx = transactionOn( db );
try ( Statement ignore = ktx.acquireStatement() )
{ {
ReadOperations readOperations = statement.readOperations(); TokenRead tokenRead = ktx.tokenRead();
TokenWriteOperations tokenWriteOperations = statement.tokenWriteOperations(); TokenWrite tokenWrite = ktx.tokenWrite();
label1 = readOperations.labelGetForName( "label1" ); label1 = tokenRead.nodeLabel( "label1" );
label2 = readOperations.labelGetForName( "label2" ); label2 = tokenRead.nodeLabel( "label2" );
label3 = readOperations.labelGetForName( "label3" ); label3 = tokenRead.nodeLabel( "label3" );
label4 = readOperations.labelGetForName( "label4" ); label4 = tokenRead.nodeLabel( "label4" );
draconian = tokenWriteOperations.labelGetOrCreateForName( "draconian" ); draconian = tokenWrite.labelGetOrCreateForName( "draconian" );
key1 = readOperations.propertyKeyGetForName( PROP1 ); key1 = tokenRead.propertyKey( PROP1 );
mandatory = tokenWriteOperations.propertyKeyGetOrCreateForName( "mandatory" ); mandatory = tokenWrite.propertyKeyGetOrCreateForName( "mandatory" );
C = readOperations.relationshipTypeGetForName( "C" ); C = tokenRead.relationshipType( "C" );
T = readOperations.relationshipTypeGetForName( "T" ); T = tokenRead.relationshipType( "T" );
M = tokenWriteOperations.relationshipTypeGetOrCreateForName( "M" ); M = tokenWrite.relationshipTypeGetOrCreateForName( "M" );
} }
} }
catch ( KernelException e ) catch ( KernelException e )
Expand Down Expand Up @@ -2321,11 +2322,11 @@ private void writeToSchemaStore( SchemaStore schemaStore, SchemaRule rule )
} }
} }


private static KernelStatement statementOn( GraphDatabaseService db ) private static KernelTransaction transactionOn( GraphDatabaseService db )
{ {
DependencyResolver resolver = ((GraphDatabaseAPI) db).getDependencyResolver(); DependencyResolver resolver = ((GraphDatabaseAPI) db).getDependencyResolver();
ThreadToStatementContextBridge bridge = resolver.resolveDependency( ThreadToStatementContextBridge.class ); ThreadToStatementContextBridge bridge = resolver.resolveDependency( ThreadToStatementContextBridge.class );
return (KernelStatement) bridge.get(); return bridge.getKernelTransactionBoundToThisThread( true );
} }


private static class Reference<T> private static class Reference<T>
Expand Down
Expand Up @@ -22,11 +22,14 @@
import java.util.Iterator; import java.util.Iterator;
import java.util.function.Function; import java.util.function.Function;


import org.neo4j.internal.kernel.api.exceptions.KernelException;
import org.neo4j.internal.kernel.api.exceptions.schema.SchemaKernelException; import org.neo4j.internal.kernel.api.exceptions.schema.SchemaKernelException;
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.index.IndexNotFoundKernelException; import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException;
import org.neo4j.register.Register;
import org.neo4j.storageengine.api.schema.PopulationProgress; import org.neo4j.storageengine.api.schema.PopulationProgress;
import org.neo4j.values.storable.Value;


/** /**
* Surface for getting schema information, such as fetching specific indexes or constraints. * Surface for getting schema information, such as fetching specific indexes or constraints.
Expand Down Expand Up @@ -107,6 +110,19 @@ PopulationProgress indexGetPopulationProgress( IndexReference index ) throws
*/ */
long indexSize( IndexReference index ) throws IndexNotFoundKernelException; long indexSize( IndexReference index ) throws IndexNotFoundKernelException;


/**
* @param index The index of interest
* @param nodeId node id to match.
* @param value the property value
* @return number of index entries for the given {@code nodeId} and {@code value}.
*/
long nodesCountIndexed( IndexReference index, long nodeId, Value value ) throws KernelException;

Register.DoubleLongRegister indexUpdatesAndSize( IndexReference index, Register.DoubleLongRegister target )
throws IndexNotFoundKernelException;

Register.DoubleLongRegister indexSample( IndexReference index, Register.DoubleLongRegister target )
throws IndexNotFoundKernelException;
/** /**
* Finds all constraints for the given schema * Finds all constraints for the given schema
* *
Expand Down
Expand Up @@ -82,9 +82,39 @@ public interface TokenRead
*/ */
String propertyKeyName( int propertyKeyId ) throws PropertyKeyIdNotFoundKernelException; String propertyKeyName( int propertyKeyId ) throws PropertyKeyIdNotFoundKernelException;


/**
* Returns all all label tokens
* @return an iterator over all label tokens in the database
*/
Iterator<NamedToken> labelsGetAllTokens(); Iterator<NamedToken> labelsGetAllTokens();


/**
* Returns all all property tokens
* @return an iterator over all property tokens in the database
*/
Iterator<NamedToken> propertyKeyGetAllTokens(); Iterator<NamedToken> propertyKeyGetAllTokens();


/**
* Returns all all relationship type tokens
* @return an iterator over all relationship type tokens in the database
*/
Iterator<NamedToken> relationshipTypesGetAllTokens(); Iterator<NamedToken> relationshipTypesGetAllTokens();

/**
* Returns the number of labels in the database
* @return the number of labels in the database
*/
int labelCount( );

/**
* Returns the number of properties in the database
* @return the number of properties in the database
*/
int propertyKeyCount( );

/**
* Returns the number of relationship types in the database
* @return the number of relationship types in the database
*/
int relationshipTypeCount( );
} }
Expand Up @@ -42,20 +42,22 @@
import org.neo4j.graphdb.index.RelationshipIndex; import org.neo4j.graphdb.index.RelationshipIndex;
import org.neo4j.helpers.collection.MapUtil; import org.neo4j.helpers.collection.MapUtil;
import org.neo4j.helpers.collection.PrefetchingResourceIterator; import org.neo4j.helpers.collection.PrefetchingResourceIterator;
import org.neo4j.internal.kernel.api.CapableIndexReference;
import org.neo4j.internal.kernel.api.IndexReference;
import org.neo4j.internal.kernel.api.NodeExplicitIndexCursor; import org.neo4j.internal.kernel.api.NodeExplicitIndexCursor;
import org.neo4j.internal.kernel.api.RelationshipExplicitIndexCursor; import org.neo4j.internal.kernel.api.RelationshipExplicitIndexCursor;
import org.neo4j.internal.kernel.api.SchemaRead; import org.neo4j.internal.kernel.api.SchemaRead;
import org.neo4j.internal.kernel.api.TokenNameLookup; import org.neo4j.internal.kernel.api.TokenNameLookup;
import org.neo4j.internal.kernel.api.TokenRead;
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.ProcedureException; import org.neo4j.internal.kernel.api.exceptions.ProcedureException;
import org.neo4j.kernel.api.KernelTransaction; import org.neo4j.kernel.api.KernelTransaction;
import org.neo4j.kernel.api.ReadOperations;
import org.neo4j.kernel.api.SilentTokenNameLookup; import org.neo4j.kernel.api.SilentTokenNameLookup;
import org.neo4j.kernel.api.Statement; import org.neo4j.kernel.api.Statement;
import org.neo4j.kernel.api.exceptions.Status; import org.neo4j.kernel.api.exceptions.Status;
import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException; import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException;
import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.api.schema.SchemaDescriptorFactory;
import org.neo4j.kernel.api.schema.index.SchemaIndexDescriptor;
import org.neo4j.kernel.impl.api.TokenAccess; import org.neo4j.kernel.impl.api.TokenAccess;
import org.neo4j.kernel.impl.api.index.IndexingService; import org.neo4j.kernel.impl.api.index.IndexingService;
import org.neo4j.kernel.internal.GraphDatabaseAPI; import org.neo4j.kernel.internal.GraphDatabaseAPI;
Expand All @@ -66,7 +68,6 @@
import org.neo4j.values.storable.Values; import org.neo4j.values.storable.Values;


import static org.neo4j.helpers.collection.Iterators.asList; import static org.neo4j.helpers.collection.Iterators.asList;
import static org.neo4j.kernel.api.schema.index.SchemaIndexDescriptor.Type.UNIQUE;
import static org.neo4j.procedure.Mode.READ; import static org.neo4j.procedure.Mode.READ;
import static org.neo4j.procedure.Mode.WRITE; import static org.neo4j.procedure.Mode.WRITE;


Expand Down Expand Up @@ -112,21 +113,22 @@ public Stream<RelationshipTypeResult> listRelationshipTypes()
@Procedure( name = "db.indexes", mode = READ ) @Procedure( name = "db.indexes", mode = READ )
public Stream<IndexResult> listIndexes() throws ProcedureException public Stream<IndexResult> listIndexes() throws ProcedureException
{ {
try ( Statement statement = tx.acquireStatement() ) try ( Statement ignore = tx.acquireStatement() )
{ {
ReadOperations operations = statement.readOperations(); TokenRead tokenRead = tx.tokenRead();
TokenNameLookup tokens = new SilentTokenNameLookup( tx.tokenRead() ); TokenNameLookup tokens = new SilentTokenNameLookup( tokenRead );


List<SchemaIndexDescriptor> indexes = asList( operations.indexesGetAll() ); SchemaRead schemaRead = tx.schemaRead();
List<IndexReference> indexes = asList( schemaRead.indexesGetAll() );
indexes.sort( Comparator.comparing( a -> a.userDescription( tokens ) ) ); indexes.sort( Comparator.comparing( a -> a.userDescription( tokens ) ) );


ArrayList<IndexResult> result = new ArrayList<>(); ArrayList<IndexResult> result = new ArrayList<>();
for ( SchemaIndexDescriptor index : indexes ) for ( IndexReference index : indexes )
{ {
try try
{ {
String type; String type;
if ( index.type() == UNIQUE ) if ( index.isUnique() )
{ {
type = IndexType.NODE_UNIQUE_PROPERTY.typeName(); type = IndexType.NODE_UNIQUE_PROPERTY.typeName();
} }
Expand All @@ -135,18 +137,25 @@ public Stream<IndexResult> listIndexes() throws ProcedureException
type = IndexType.NODE_LABEL_PROPERTY.typeName(); type = IndexType.NODE_LABEL_PROPERTY.typeName();
} }


String label = index.schema().keyName( tokens ); String label = tokenRead.nodeLabelName( index.label() );
List<String> propertyNames = propertyNames( tokens, index ); List<String> propertyNames = propertyNames( tokens, index );
result.add( new IndexResult( "INDEX ON " + index.schema().userDescription( tokens ), label, result.add( new IndexResult( "INDEX ON " +
SchemaDescriptorFactory.forLabel( index.label(), index.properties() )
.userDescription( tokens ), label,
propertyNames, propertyNames,
operations.indexGetState( index ).toString(), type, schemaRead.indexGetState( index ).toString(), type,
indexProviderDescriptorMap( operations.indexGetProviderDescriptor( index ) ) ) ); indexProviderDescriptorMap( schemaRead.index( index.label(), index.properties() ) ) ) );
} }
catch ( IndexNotFoundKernelException e ) catch ( IndexNotFoundKernelException e )
{ {
throw new ProcedureException( Status.Schema.IndexNotFound, e, throw new ProcedureException( Status.Schema.IndexNotFound, e,
"No index on ", index.userDescription( tokens ) ); "No index on ", index.userDescription( tokens ) );
} }
catch ( LabelNotFoundKernelException e )
{
throw new ProcedureException( Status.General.InvalidArguments, e,
"Label not found " );
}
} }
return result.stream(); return result.stream();
} }
Expand Down Expand Up @@ -584,16 +593,16 @@ public Stream<BooleanResult> relationshipManualIndexRemove( @Name( "indexName" )
return Stream.of( new BooleanResult( Boolean.TRUE ) ); return Stream.of( new BooleanResult( Boolean.TRUE ) );
} }


private Map<String,String> indexProviderDescriptorMap( IndexProvider.Descriptor providerDescriptor ) private Map<String,String> indexProviderDescriptorMap( CapableIndexReference indexReference )
{ {
return MapUtil.stringMap( return MapUtil.stringMap(
"key", providerDescriptor.getKey(), "key", indexReference.providerKey(),
"version", providerDescriptor.getVersion() ); "version", indexReference.providerVersion() );
} }


private List<String> propertyNames( TokenNameLookup tokens, SchemaIndexDescriptor index ) private List<String> propertyNames( TokenNameLookup tokens, IndexReference index )
{ {
int[] propertyIds = index.schema().getPropertyIds(); int[] propertyIds = index.properties();
List<String> propertyNames = new ArrayList<>( propertyIds.length ); List<String> propertyNames = new ArrayList<>( propertyIds.length );
for ( int propertyId : propertyIds ) for ( int propertyId : propertyIds )
{ {
Expand Down

0 comments on commit 1602ae4

Please sign in to comment.