Skip to content

Commit

Permalink
Acquire IndexReader in the StorageLayer
Browse files Browse the repository at this point in the history
  • Loading branch information
davidegrohmann committed May 8, 2017
1 parent 59fd133 commit 290af31
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 44 deletions.
Expand Up @@ -737,45 +737,44 @@ public long nodeGetFromUniqueIndexSeek(
} }


@Override @Override
public PrimitiveLongIterator indexQuery( KernelStatement state, IndexDescriptor index, IndexQuery... predicates ) public PrimitiveLongIterator indexQuery( KernelStatement statement, IndexDescriptor index,
throws IndexNotFoundKernelException, IndexNotApplicableKernelException IndexQuery... predicates ) throws IndexNotFoundKernelException, IndexNotApplicableKernelException
{ {
StorageStatement storeStatement = state.getStoreStatement(); IndexReader reader = storeLayer.indexGetReader( statement.getStoreStatement(), index );
IndexReader reader = storeStatement.getIndexReader( index );
PrimitiveLongIterator committed = reader.query( predicates ); PrimitiveLongIterator committed = reader.query( predicates );
PrimitiveLongIterator exactMatches = LookupFilter.exactIndexMatches( this, state, committed, predicates ); PrimitiveLongIterator exactMatches = LookupFilter.exactIndexMatches( this, statement, committed, predicates );


IndexQuery firstPredicate = predicates[0]; IndexQuery firstPredicate = predicates[0];
switch ( firstPredicate.type() ) switch ( firstPredicate.type() )
{ {
case exact: case exact:
IndexQuery.ExactPredicate[] exactPreds = assertOnlyExactPredicates( predicates ); IndexQuery.ExactPredicate[] exactPreds = assertOnlyExactPredicates( predicates );
return filterIndexStateChangesForSeek( state, exactMatches, index, OrderedPropertyValues.of( exactPreds ) ); return filterIndexStateChangesForSeek( statement, exactMatches, index, OrderedPropertyValues.of( exactPreds ) );
case stringSuffix: case stringSuffix:
case stringContains: case stringContains:
case exists: case exists:
return filterIndexStateChangesForScan( state, exactMatches, index ); return filterIndexStateChangesForScan( statement, exactMatches, index );


case rangeNumeric: case rangeNumeric:
{ {
assertSinglePredicate( predicates ); assertSinglePredicate( predicates );
IndexQuery.NumberRangePredicate numPred = (IndexQuery.NumberRangePredicate) firstPredicate; IndexQuery.NumberRangePredicate numPred = (IndexQuery.NumberRangePredicate) firstPredicate;
return filterIndexStateChangesForRangeSeekByNumber( state, index, numPred.from(), return filterIndexStateChangesForRangeSeekByNumber( statement, index, numPred.from(),
numPred.fromInclusive(), numPred.to(), numPred.toInclusive(), exactMatches ); numPred.fromInclusive(), numPred.to(), numPred.toInclusive(), exactMatches );
} }
case rangeString: case rangeString:
{ {
assertSinglePredicate( predicates ); assertSinglePredicate( predicates );
IndexQuery.StringRangePredicate strPred = (IndexQuery.StringRangePredicate) firstPredicate; IndexQuery.StringRangePredicate strPred = (IndexQuery.StringRangePredicate) firstPredicate;
return filterIndexStateChangesForRangeSeekByString( return filterIndexStateChangesForRangeSeekByString(
state, index, strPred.from(), strPred.fromInclusive(), strPred.to(), statement, index, strPred.from(), strPred.fromInclusive(), strPred.to(),
strPred.toInclusive(), committed ); strPred.toInclusive(), committed );
} }
case stringPrefix: case stringPrefix:
{ {
assertSinglePredicate( predicates ); assertSinglePredicate( predicates );
IndexQuery.StringPrefixPredicate strPred = (IndexQuery.StringPrefixPredicate) firstPredicate; IndexQuery.StringPrefixPredicate strPred = (IndexQuery.StringPrefixPredicate) firstPredicate;
return filterIndexStateChangesForRangeSeekByPrefix( state, index, strPred.prefix(), committed ); return filterIndexStateChangesForRangeSeekByPrefix( statement, index, strPred.prefix(), committed );
} }
default: default:
throw new UnsupportedOperationException( "Query not supported: " + Arrays.toString( predicates ) ); throw new UnsupportedOperationException( "Query not supported: " + Arrays.toString( predicates ) );
Expand Down Expand Up @@ -821,7 +820,7 @@ private void assertSinglePredicate( IndexQuery[] predicates )
public long nodesCountIndexed( KernelStatement statement, IndexDescriptor index, long nodeId, Object value ) public long nodesCountIndexed( KernelStatement statement, IndexDescriptor index, long nodeId, Object value )
throws IndexNotFoundKernelException, IndexBrokenKernelException throws IndexNotFoundKernelException, IndexBrokenKernelException
{ {
IndexReader reader = statement.getStoreStatement().getIndexReader( index ); IndexReader reader = storeLayer.indexGetReader( statement.getStoreStatement(), index );
return reader.countIndexedNodes( nodeId, value ); return reader.countIndexedNodes( nodeId, value );
} }


Expand Down
Expand Up @@ -76,6 +76,7 @@
import org.neo4j.storageengine.api.StorageStatement; import org.neo4j.storageengine.api.StorageStatement;
import org.neo4j.storageengine.api.StoreReadLayer; import org.neo4j.storageengine.api.StoreReadLayer;
import org.neo4j.storageengine.api.Token; import org.neo4j.storageengine.api.Token;
import org.neo4j.storageengine.api.schema.IndexReader;
import org.neo4j.storageengine.api.schema.PopulationProgress; import org.neo4j.storageengine.api.schema.PopulationProgress;
import org.neo4j.storageengine.api.schema.SchemaRule; import org.neo4j.storageengine.api.schema.SchemaRule;
import org.neo4j.storageengine.api.txstate.PropertyContainerState; import org.neo4j.storageengine.api.txstate.PropertyContainerState;
Expand Down Expand Up @@ -261,6 +262,13 @@ public String indexGetFailure( LabelSchemaDescriptor descriptor ) throws IndexNo
return indexService.getIndexProxy( descriptor ).getPopulationFailure().asString(); return indexService.getIndexProxy( descriptor ).getPopulationFailure().asString();
} }


@Override
public IndexReader indexGetReader( StorageStatement statement, IndexDescriptor index )
throws IndexNotFoundKernelException
{
return statement.getIndexReader( index );
}

@Override @Override
public Iterator<ConstraintDescriptor> constraintsGetForSchema( SchemaDescriptor descriptor ) public Iterator<ConstraintDescriptor> constraintsGetForSchema( SchemaDescriptor descriptor )
{ {
Expand Down
Expand Up @@ -42,6 +42,7 @@
import org.neo4j.kernel.impl.api.RelationshipVisitor; import org.neo4j.kernel.impl.api.RelationshipVisitor;
import org.neo4j.kernel.impl.api.store.RelationshipIterator; import org.neo4j.kernel.impl.api.store.RelationshipIterator;
import org.neo4j.register.Register.DoubleLongRegister; import org.neo4j.register.Register.DoubleLongRegister;
import org.neo4j.storageengine.api.schema.IndexReader;
import org.neo4j.storageengine.api.schema.PopulationProgress; import org.neo4j.storageengine.api.schema.PopulationProgress;
import org.neo4j.storageengine.api.txstate.PropertyContainerState; import org.neo4j.storageengine.api.txstate.PropertyContainerState;
import org.neo4j.storageengine.api.txstate.ReadableTransactionState; import org.neo4j.storageengine.api.txstate.ReadableTransactionState;
Expand Down Expand Up @@ -166,6 +167,9 @@ long indexGetCommittedId( IndexDescriptor index )
*/ */
String indexGetFailure( LabelSchemaDescriptor descriptor ) throws IndexNotFoundKernelException; String indexGetFailure( LabelSchemaDescriptor descriptor ) throws IndexNotFoundKernelException;


IndexReader indexGetReader( StorageStatement statement, IndexDescriptor index )
throws IndexNotFoundKernelException;

/** /**
* @param labelName name of label. * @param labelName name of label.
* @return token id of label. * @return token id of label.
Expand Down
Expand Up @@ -93,12 +93,13 @@ public void before() throws Exception
when( store.indexesGetAll() ).then( answerAsIteratorFrom( indexes ) ); when( store.indexesGetAll() ).then( answerAsIteratorFrom( indexes ) );
when( store.indexesGetRelatedToProperty( propertyKeyId ) ).then( answerAsIteratorFrom( indexes ) ); when( store.indexesGetRelatedToProperty( propertyKeyId ) ).then( answerAsIteratorFrom( indexes ) );
when( store.constraintsGetForLabel( labelId ) ).thenReturn( Collections.emptyIterator() ); when( store.constraintsGetForLabel( labelId ) ).thenReturn( Collections.emptyIterator() );
when( store.indexGetForSchema( indexDescriptor.schema() ) ).thenReturn( indexDescriptor );


when( store.indexGetForSchema( indexDescriptor.schema() ) ).thenReturn( indexDescriptor );
indexReader = mock( IndexReader.class );
when( store.indexGetReader( any( StorageStatement.class ), eq( indexDescriptor ) ) )
.thenReturn( indexReader );
StoreStatement statement = mock( StoreStatement.class ); StoreStatement statement = mock( StoreStatement.class );
when( state.getStoreStatement() ).thenReturn( statement ); when( state.getStoreStatement() ).thenReturn( statement );
indexReader = mock( IndexReader.class );
when( statement.getIndexReader( indexDescriptor ) ).thenReturn( indexReader );
when( statement.getFreshIndexReader( indexDescriptor ) ).thenReturn( indexReader ); when( statement.getFreshIndexReader( indexDescriptor ) ).thenReturn( indexReader );


StateHandlingStatementOperations stateHandlingOperations = new StateHandlingStatementOperations( StateHandlingStatementOperations stateHandlingOperations = new StateHandlingStatementOperations(
Expand Down
Expand Up @@ -224,7 +224,7 @@ public void shouldConsiderTransactionStateDuringIndexScanWithIndexQuery() throws
); );


StoreReadLayer storeReadLayer = mock( StoreReadLayer.class ); StoreReadLayer storeReadLayer = mock( StoreReadLayer.class );
IndexReader indexReader = addMockedIndexReader( statement ); IndexReader indexReader = addMockedIndexReader( storeReadLayer );
IndexQuery query = IndexQuery.exists( index.schema().getPropertyId() ); IndexQuery query = IndexQuery.exists( index.schema().getPropertyId() );
when( indexReader.query( query ) ).thenReturn( when( indexReader.query( query ) ).thenReturn(
PrimitiveLongCollections.resourceIterator( PrimitiveLongCollections.iterator( 43L, 44L, 46L ), null ) PrimitiveLongCollections.resourceIterator( PrimitiveLongCollections.iterator( 43L, 44L, 46L ), null )
Expand Down Expand Up @@ -255,7 +255,7 @@ public void shouldConsiderTransactionStateDuringIndexSeekWithIndexQuery() throws
); );


StoreReadLayer storeReadLayer = mock( StoreReadLayer.class ); StoreReadLayer storeReadLayer = mock( StoreReadLayer.class );
IndexReader indexReader = addMockedIndexReader( statement ); IndexReader indexReader = addMockedIndexReader( storeReadLayer );
IndexQuery.ExactPredicate query = IndexQuery.exact( index.schema().getPropertyId(), "value" ); IndexQuery.ExactPredicate query = IndexQuery.exact( index.schema().getPropertyId(), "value" );
when( indexReader.query( query ) ).thenReturn( when( indexReader.query( query ) ).thenReturn(
PrimitiveLongCollections.resourceIterator( PrimitiveLongCollections.iterator( 43L, 44L, 46L ), null ) ); PrimitiveLongCollections.resourceIterator( PrimitiveLongCollections.iterator( 43L, 44L, 46L ), null ) );
Expand Down Expand Up @@ -285,7 +285,7 @@ public void shouldConsiderTransactionStateDuringIndexRangeSeekByPrefix() throws
); );


StoreReadLayer storeReadLayer = mock( StoreReadLayer.class ); StoreReadLayer storeReadLayer = mock( StoreReadLayer.class );
IndexReader indexReader = addMockedIndexReader( statement ); IndexReader indexReader = addMockedIndexReader( storeReadLayer );
IndexQuery.StringPrefixPredicate query = IndexQuery.stringPrefix( index.schema().getPropertyId(), "prefix" ); IndexQuery.StringPrefixPredicate query = IndexQuery.stringPrefix( index.schema().getPropertyId(), "prefix" );
when( indexReader.query( query ) ) when( indexReader.query( query ) )
.thenReturn( PrimitiveLongCollections.resourceIterator( PrimitiveLongCollections.iterator( 43L, 44L, 46L ), null ) ); .thenReturn( PrimitiveLongCollections.resourceIterator( PrimitiveLongCollections.iterator( 43L, 44L, 46L ), null ) );
Expand Down Expand Up @@ -315,7 +315,7 @@ public void shouldConsiderTransactionStateDuringIndexRangeSeekByPrefixWithIndexQ
); );


StoreReadLayer storeReadLayer = mock( StoreReadLayer.class ); StoreReadLayer storeReadLayer = mock( StoreReadLayer.class );
IndexReader indexReader = addMockedIndexReader( statement ); IndexReader indexReader = addMockedIndexReader( storeReadLayer );
IndexQuery.StringPrefixPredicate indexQuery = IndexQuery.stringPrefix( index.schema().getPropertyId(), "prefix" ); IndexQuery.StringPrefixPredicate indexQuery = IndexQuery.stringPrefix( index.schema().getPropertyId(), "prefix" );
when( indexReader.query( indexQuery ) ).thenReturn( when( indexReader.query( indexQuery ) ).thenReturn(
PrimitiveLongCollections.resourceIterator( PrimitiveLongCollections.iterator( 43L, 44L, 46L ), null ) ); PrimitiveLongCollections.resourceIterator( PrimitiveLongCollections.iterator( 43L, 44L, 46L ), null ) );
Expand Down Expand Up @@ -345,7 +345,7 @@ public void shouldConsiderTransactionStateDuringIndexRangeSeekByContainsWithInde
); );


StoreReadLayer storeReadLayer = mock( StoreReadLayer.class ); StoreReadLayer storeReadLayer = mock( StoreReadLayer.class );
IndexReader indexReader = addMockedIndexReader( statement ); IndexReader indexReader = addMockedIndexReader( storeReadLayer );
IndexQuery.StringContainsPredicate indexQuery = IndexQuery.stringContains( index.schema().getPropertyId(), "contains" ); IndexQuery.StringContainsPredicate indexQuery = IndexQuery.stringContains( index.schema().getPropertyId(), "contains" );
when( indexReader.query( indexQuery ) ).thenReturn( when( indexReader.query( indexQuery ) ).thenReturn(
PrimitiveLongCollections.resourceIterator( PrimitiveLongCollections.iterator( 43L, 44L, 46L ), null ) ); PrimitiveLongCollections.resourceIterator( PrimitiveLongCollections.iterator( 43L, 44L, 46L ), null ) );
Expand Down Expand Up @@ -375,7 +375,7 @@ public void shouldConsiderTransactionStateDuringIndexRangeSeekBySuffixWithIndexQ
); );


StoreReadLayer storeReadLayer = mock( StoreReadLayer.class ); StoreReadLayer storeReadLayer = mock( StoreReadLayer.class );
IndexReader indexReader = addMockedIndexReader( statement ); IndexReader indexReader = addMockedIndexReader( storeReadLayer );
IndexQuery.StringSuffixPredicate indexQuery = IndexQuery.stringSuffix( index.schema().getPropertyId(), "suffix" ); IndexQuery.StringSuffixPredicate indexQuery = IndexQuery.stringSuffix( index.schema().getPropertyId(), "suffix" );
when( indexReader.query( indexQuery ) ).thenReturn( when( indexReader.query( indexQuery ) ).thenReturn(
PrimitiveLongCollections.resourceIterator( PrimitiveLongCollections.iterator( 43L, 44L, 46L ), null ) ); PrimitiveLongCollections.resourceIterator( PrimitiveLongCollections.iterator( 43L, 44L, 46L ), null ) );
Expand Down Expand Up @@ -403,8 +403,6 @@ public void shouldConsiderTransactionStateDuringIndexBetweenRangeSeekByNumberWit
KernelStatement statement = mock( KernelStatement.class ); KernelStatement statement = mock( KernelStatement.class );
when( statement.hasTxStateWithChanges() ).thenReturn( true ); when( statement.hasTxStateWithChanges() ).thenReturn( true );
when( statement.txState() ).thenReturn( txState ); when( statement.txState() ).thenReturn( txState );
StorageStatement storageStatement = mock( StorageStatement.class );
when( statement.getStoreStatement() ).thenReturn( storageStatement );
when( txState.indexUpdatesForRangeSeekByNumber( index, lower, true, upper, false ) ).thenReturn( when( txState.indexUpdatesForRangeSeekByNumber( index, lower, true, upper, false ) ).thenReturn(
new DiffSets<>( Collections.singleton( 42L ), Collections.singleton( 44L ) ) new DiffSets<>( Collections.singleton( 42L ), Collections.singleton( 44L ) )
); );
Expand All @@ -413,7 +411,7 @@ public void shouldConsiderTransactionStateDuringIndexBetweenRangeSeekByNumberWit
); );
StoreReadLayer storeReadLayer = mock( StoreReadLayer.class ); StoreReadLayer storeReadLayer = mock( StoreReadLayer.class );


IndexReader indexReader = addMockedIndexReader( storageStatement ); IndexReader indexReader = addMockedIndexReader( storeReadLayer );
IndexQuery.NumberRangePredicate indexQuery = IndexQuery.NumberRangePredicate indexQuery =
IndexQuery.range( index.schema().getPropertyId(), lower, true, upper, false ); IndexQuery.range( index.schema().getPropertyId(), lower, true, upper, false );
when( indexReader.query( indexQuery ) ).thenReturn( when( indexReader.query( indexQuery ) ).thenReturn(
Expand All @@ -424,8 +422,8 @@ public void shouldConsiderTransactionStateDuringIndexBetweenRangeSeekByNumberWit
{ {
long nodeId = (long) invocationOnMock.getArguments()[1]; long nodeId = (long) invocationOnMock.getArguments()[1];
when( storeReadLayer when( storeReadLayer
.nodeGetProperty( eq( storageStatement ), any( NodeItem.class ), eq( propertyKey ), eq( null ) ) ) .nodeGetProperty( any( StorageStatement.class ), any( NodeItem.class ), eq( propertyKey ),
.thenReturn( asPropertyCursor( intProperty( propertyKey, inRange ) ) ); eq( null ) ) ).thenReturn( asPropertyCursor( intProperty( propertyKey, inRange ) ) );
return asNodeCursor( nodeId, nodeId + 20000 ); return asNodeCursor( nodeId, nodeId + 20000 );
} ); } );


Expand Down Expand Up @@ -454,7 +452,7 @@ public void shouldConsiderTransactionStateDuringIndexBetweenRangeSeekByStringWit
); );


StoreReadLayer storeReadLayer = mock( StoreReadLayer.class ); StoreReadLayer storeReadLayer = mock( StoreReadLayer.class );
IndexReader indexReader = addMockedIndexReader( statement ); IndexReader indexReader = addMockedIndexReader( storeReadLayer );
IndexQuery.StringRangePredicate rangePredicate = IndexQuery.StringRangePredicate rangePredicate =
IndexQuery.range( index.schema().getPropertyId(), "Anne", true, "Bill", false ); IndexQuery.range( index.schema().getPropertyId(), "Anne", true, "Bill", false );
when( indexReader.query( rangePredicate ) ).thenReturn( when( indexReader.query( rangePredicate ) ).thenReturn(
Expand Down Expand Up @@ -532,21 +530,17 @@ public void shouldNotRecordRelationshipSetPropertyOnSameValue() throws Exception
long relationshipId = 0; long relationshipId = 0;
String value = "The value"; String value = "The value";
KernelStatement kernelStatement = mock( KernelStatement.class ); KernelStatement kernelStatement = mock( KernelStatement.class );
StoreStatement storeStatement = mock( StoreStatement.class ); StoreReadLayer storeReadLayer = mock( StoreReadLayer.class );
Cursor<RelationshipItem> ourRelationship = relationshipCursorWithProperty( propertyKeyId ); Cursor<RelationshipItem> ourRelationship = relationshipCursorWithProperty( propertyKeyId );
when( storeStatement when( storeReadLayer.relationshipCursor( any( StorageStatement.class ), eq( relationshipId ),
.acquireSingleRelationshipCursor( eq( relationshipId ), any( ReadableTransactionState.class ) ) ) any( ReadableTransactionState.class ) ) ).thenReturn( ourRelationship );
.thenReturn( ourRelationship );
when( kernelStatement.getStoreStatement() ).thenReturn( storeStatement );
InternalAutoIndexing autoIndexing = mock( InternalAutoIndexing.class ); InternalAutoIndexing autoIndexing = mock( InternalAutoIndexing.class );
AutoIndexOperations autoIndexOps = mock( AutoIndexOperations.class ); AutoIndexOperations autoIndexOps = mock( AutoIndexOperations.class );
when( autoIndexing.nodes() ).thenReturn( AutoIndexOperations.UNSUPPORTED ); when( autoIndexing.nodes() ).thenReturn( AutoIndexOperations.UNSUPPORTED );
when( autoIndexing.relationships() ).thenReturn( autoIndexOps ); when( autoIndexing.relationships() ).thenReturn( autoIndexOps );
StoreReadLayer storeReadLayer = mock( StoreReadLayer.class );
Cursor<PropertyItem> propertyItemCursor = propertyCursor( propertyKeyId, value ); Cursor<PropertyItem> propertyItemCursor = propertyCursor( propertyKeyId, value );
when( storeReadLayer when( storeReadLayer.relationshipGetProperty( any( StorageStatement.class ), any( RelationshipItem.class ),
.relationshipGetProperty( eq( storeStatement ), any( RelationshipItem.class ), eq( propertyKeyId ), eq( propertyKeyId ), any( PropertyContainerState.class ) ) ).thenReturn( propertyItemCursor );
any( PropertyContainerState.class ) ) ).thenReturn( propertyItemCursor );
StateHandlingStatementOperations operations = newTxStateOps( storeReadLayer, autoIndexing ); StateHandlingStatementOperations operations = newTxStateOps( storeReadLayer, autoIndexing );


// WHEN // WHEN
Expand Down Expand Up @@ -614,18 +608,12 @@ autoIndexing, mock( ConstraintIndexCreator.class ),
mock( LegacyIndexStore.class ) ); mock( LegacyIndexStore.class ) );
} }


private IndexReader addMockedIndexReader( KernelStatement kernelStatement ) throws IndexNotFoundKernelException private IndexReader addMockedIndexReader( StoreReadLayer storeReadLayer )
{
StorageStatement storageStatement = mock( StorageStatement.class );
when( kernelStatement.getStoreStatement() ).thenReturn( storageStatement );
return addMockedIndexReader( storageStatement );
}

private IndexReader addMockedIndexReader( StorageStatement storeStatement )
throws IndexNotFoundKernelException throws IndexNotFoundKernelException
{ {
IndexReader indexReader = mock( IndexReader.class ); IndexReader indexReader = mock( IndexReader.class );
when( storeStatement.getIndexReader( any( IndexDescriptor.class ) ) ).thenReturn( indexReader ); when( storeReadLayer.indexGetReader( any( StorageStatement.class ), any( IndexDescriptor.class ) ) )
.thenReturn( indexReader );
return indexReader; return indexReader;
} }
} }

0 comments on commit 290af31

Please sign in to comment.