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.Pair;
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.kernel.api.ReadOperations;
import org.neo4j.kernel.api.TokenWriteOperations;
import org.neo4j.kernel.api.KernelTransaction;
import org.neo4j.kernel.api.Statement;
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.index.IndexAccessor;
import org.neo4j.kernel.api.index.IndexEntryUpdate;
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.IndexUpdater;
import org.neo4j.kernel.api.labelscan.LabelScanStore;
import org.neo4j.kernel.api.labelscan.LabelScanWriter;
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.configuration.Config;
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.NodeUpdates;
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() )
{
db.schema().indexFor( label( "label3" ) ).on( PROP1 ).create();

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

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 ) );
tx.success();

try ( KernelStatement statement = statementOn( db ) )
KernelTransaction ktx = transactionOn( db );
try ( Statement ignore = ktx.acquireStatement() )
{
ReadOperations readOperations = statement.readOperations();
TokenWriteOperations tokenWriteOperations = statement.tokenWriteOperations();
label1 = readOperations.labelGetForName( "label1" );
label2 = readOperations.labelGetForName( "label2" );
label3 = readOperations.labelGetForName( "label3" );
label4 = readOperations.labelGetForName( "label4" );
draconian = tokenWriteOperations.labelGetOrCreateForName( "draconian" );
key1 = readOperations.propertyKeyGetForName( PROP1 );
mandatory = tokenWriteOperations.propertyKeyGetOrCreateForName( "mandatory" );
C = readOperations.relationshipTypeGetForName( "C" );
T = readOperations.relationshipTypeGetForName( "T" );
M = tokenWriteOperations.relationshipTypeGetOrCreateForName( "M" );
TokenRead tokenRead = ktx.tokenRead();
TokenWrite tokenWrite = ktx.tokenWrite();
label1 = tokenRead.nodeLabel( "label1" );
label2 = tokenRead.nodeLabel( "label2" );
label3 = tokenRead.nodeLabel( "label3" );
label4 = tokenRead.nodeLabel( "label4" );
draconian = tokenWrite.labelGetOrCreateForName( "draconian" );
key1 = tokenRead.propertyKey( PROP1 );
mandatory = tokenWrite.propertyKeyGetOrCreateForName( "mandatory" );
C = tokenRead.relationshipType( "C" );
T = tokenRead.relationshipType( "T" );
M = tokenWrite.relationshipTypeGetOrCreateForName( "M" );
}
}
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();
ThreadToStatementContextBridge bridge = resolver.resolveDependency( ThreadToStatementContextBridge.class );
return (KernelStatement) bridge.get();
return bridge.getKernelTransactionBoundToThisThread( true );
}

private static class Reference<T>
Expand Down
Expand Up @@ -22,11 +22,14 @@
import java.util.Iterator;
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.schema.SchemaDescriptor;
import org.neo4j.internal.kernel.api.schema.constraints.ConstraintDescriptor;
import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException;
import org.neo4j.register.Register;
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.
Expand Down Expand Up @@ -107,6 +110,19 @@ PopulationProgress indexGetPopulationProgress( IndexReference index ) throws
*/
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
*
Expand Down
Expand Up @@ -82,9 +82,39 @@ public interface TokenRead
*/
String propertyKeyName( int propertyKeyId ) throws PropertyKeyIdNotFoundKernelException;

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

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

/**
* Returns all all relationship type tokens
* @return an iterator over all relationship type tokens in the database
*/
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.helpers.collection.MapUtil;
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.RelationshipExplicitIndexCursor;
import org.neo4j.internal.kernel.api.SchemaRead;
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.LabelNotFoundKernelException;
import org.neo4j.internal.kernel.api.exceptions.ProcedureException;
import org.neo4j.kernel.api.KernelTransaction;
import org.neo4j.kernel.api.ReadOperations;
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.index.IndexNotFoundKernelException;
import org.neo4j.kernel.api.index.IndexProvider;
import org.neo4j.kernel.api.schema.index.SchemaIndexDescriptor;
import org.neo4j.kernel.api.schema.SchemaDescriptorFactory;
import org.neo4j.kernel.impl.api.TokenAccess;
import org.neo4j.kernel.impl.api.index.IndexingService;
import org.neo4j.kernel.internal.GraphDatabaseAPI;
Expand All @@ -66,7 +68,6 @@
import org.neo4j.values.storable.Values;

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.WRITE;

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

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

String label = index.schema().keyName( tokens );
String label = tokenRead.nodeLabelName( index.label() );
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,
operations.indexGetState( index ).toString(), type,
indexProviderDescriptorMap( operations.indexGetProviderDescriptor( index ) ) ) );
schemaRead.indexGetState( index ).toString(), type,
indexProviderDescriptorMap( schemaRead.index( index.label(), index.properties() ) ) ) );
}
catch ( IndexNotFoundKernelException e )
{
throw new ProcedureException( Status.Schema.IndexNotFound, e,
"No index on ", index.userDescription( tokens ) );
}
catch ( LabelNotFoundKernelException e )
{
throw new ProcedureException( Status.General.InvalidArguments, e,
"Label not found " );
}
}
return result.stream();
}
Expand Down Expand Up @@ -584,16 +593,16 @@ public Stream<BooleanResult> relationshipManualIndexRemove( @Name( "indexName" )
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(
"key", providerDescriptor.getKey(),
"version", providerDescriptor.getVersion() );
"key", indexReference.providerKey(),
"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 );
for ( int propertyId : propertyIds )
{
Expand Down

0 comments on commit 1602ae4

Please sign in to comment.