Skip to content

Commit

Permalink
IndexReader return resource iterator
Browse files Browse the repository at this point in the history
So that they can be closed.
  • Loading branch information
burqen committed Nov 22, 2017
1 parent e8c031f commit 564f935
Show file tree
Hide file tree
Showing 16 changed files with 308 additions and 86 deletions.
Expand Up @@ -19,7 +19,7 @@
*/
package org.neo4j.kernel.api.index;

import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.collection.primitive.PrimitiveLongResourceIterator;
import org.neo4j.kernel.api.exceptions.index.IndexNotApplicableKernelException;
import org.neo4j.internal.kernel.api.IndexQuery;
import org.neo4j.storageengine.api.schema.IndexReader;
Expand Down Expand Up @@ -48,7 +48,7 @@ public IndexSampler createSampler()
}

@Override
public PrimitiveLongIterator query( IndexQuery... predicates ) throws IndexNotApplicableKernelException
public PrimitiveLongResourceIterator query( IndexQuery... predicates ) throws IndexNotApplicableKernelException
{
return delegate.query( predicates );
}
Expand Down
Expand Up @@ -27,7 +27,7 @@
import java.util.HashSet;
import java.util.Set;

import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.collection.primitive.PrimitiveLongResourceIterator;
import org.neo4j.cursor.RawCursor;
import org.neo4j.helpers.ArrayUtil;
import org.neo4j.index.internal.gbptree.GBPTree;
Expand Down Expand Up @@ -114,7 +114,7 @@ public long countIndexedNodes( long nodeId, Value... propertyValues )
}

@Override
public PrimitiveLongIterator query( IndexQuery... predicates ) throws IndexNotApplicableKernelException
public PrimitiveLongResourceIterator query( IndexQuery... predicates ) throws IndexNotApplicableKernelException
{
NodeValueIterator nodeValueIterator = new NodeValueIterator();
query( nodeValueIterator, IndexOrder.NONE, predicates );
Expand Down
Expand Up @@ -21,15 +21,15 @@

import org.neo4j.collection.primitive.PrimitiveLongCollections;
import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.graphdb.Resource;
import org.neo4j.collection.primitive.PrimitiveLongResourceIterator;
import org.neo4j.storageengine.api.schema.IndexProgressor;
import org.neo4j.values.storable.Value;

/**
* A {@link IndexProgressor} + {@link IndexProgressor.NodeValueClient} combo presented as a {@link PrimitiveLongIterator}.
*/
public class NodeValueIterator extends PrimitiveLongCollections.PrimitiveLongBaseIterator
implements IndexProgressor.NodeValueClient, Resource
implements IndexProgressor.NodeValueClient, PrimitiveLongResourceIterator
{
private boolean closed;
private IndexProgressor progressor;
Expand Down Expand Up @@ -66,6 +66,7 @@ public void close()
{
closed = true;
progressor.close();
progressor = null;
}
}
}
Expand Up @@ -23,8 +23,8 @@
import java.util.Arrays;
import java.util.Queue;

import org.neo4j.collection.primitive.PrimitiveLongCollections;
import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.collection.primitive.PrimitiveLongResourceCollections;
import org.neo4j.collection.primitive.PrimitiveLongResourceIterator;
import org.neo4j.internal.kernel.api.IndexOrder;
import org.neo4j.internal.kernel.api.IndexQuery;
import org.neo4j.internal.kernel.api.IndexQuery.ExactPredicate;
Expand Down Expand Up @@ -80,7 +80,7 @@ public IndexSampler createSampler()
}

@Override
public PrimitiveLongIterator query( IndexQuery... predicates ) throws IndexNotApplicableKernelException
public PrimitiveLongResourceIterator query( IndexQuery... predicates ) throws IndexNotApplicableKernelException
{
if ( predicates.length > 1 )
{
Expand All @@ -101,9 +101,9 @@ public PrimitiveLongIterator query( IndexQuery... predicates ) throws IndexNotAp
// todo: There will be no ordering of the node ids here. Is this a problem?
if ( predicates[0] instanceof ExistsPredicate )
{
PrimitiveLongIterator nativeResult = nativeReader.query( predicates[0] );
PrimitiveLongIterator luceneResult = luceneReader.query( predicates[0] );
return PrimitiveLongCollections.concat( nativeResult, luceneResult );
PrimitiveLongResourceIterator nativeResult = nativeReader.query( predicates[0] );
PrimitiveLongResourceIterator luceneResult = luceneReader.query( predicates[0] );
return PrimitiveLongResourceCollections.concat( nativeResult, luceneResult );
}

return luceneReader.query( predicates );
Expand Down
Expand Up @@ -19,8 +19,8 @@
*/
package org.neo4j.storageengine.api.schema;

import org.neo4j.collection.primitive.PrimitiveLongCollections;
import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.collection.primitive.PrimitiveLongResourceCollections;
import org.neo4j.collection.primitive.PrimitiveLongResourceIterator;
import org.neo4j.graphdb.Resource;
import org.neo4j.internal.kernel.api.IndexOrder;
import org.neo4j.internal.kernel.api.IndexQuery;
Expand Down Expand Up @@ -48,7 +48,7 @@ public interface IndexReader extends Resource
* @param predicates the predicates to query for.
* @return the matching entity IDs.
*/
PrimitiveLongIterator query( IndexQuery... predicates ) throws IndexNotApplicableKernelException;
PrimitiveLongResourceIterator query( IndexQuery... predicates ) throws IndexNotApplicableKernelException;

/**
* Queries the index for the given {@link IndexQuery} predicates.
Expand Down Expand Up @@ -101,9 +101,9 @@ public IndexSampler createSampler()
}

@Override
public PrimitiveLongIterator query( IndexQuery[] predicates )
public PrimitiveLongResourceIterator query( IndexQuery[] predicates )
{
return PrimitiveLongCollections.emptyIterator();
return PrimitiveLongResourceCollections.emptyIterator();
}

@Override
Expand Down
Expand Up @@ -19,15 +19,15 @@
*/
package org.neo4j.storageengine.api.schema;

import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.graphdb.Resource;
import org.neo4j.collection.primitive.PrimitiveLongResourceIterator;
import org.neo4j.values.storable.Value;

class NodeValueIndexProgressor implements IndexProgressor
{
private final PrimitiveLongIterator ids;
private final PrimitiveLongResourceIterator ids;
private final NodeValueClient client;

NodeValueIndexProgressor( PrimitiveLongIterator ids, NodeValueClient client )
NodeValueIndexProgressor( PrimitiveLongResourceIterator ids, NodeValueClient client )
{
this.ids = ids;
this.client = client;
Expand All @@ -38,7 +38,7 @@ public boolean next()
{
while ( ids.hasNext() )
{
if ( client.acceptNode( ids.next(), null ) )
if ( client.acceptNode( ids.next(), (Value[]) null ) )
{
return true;
}
Expand All @@ -49,9 +49,9 @@ public boolean next()
@Override
public void close()
{
if ( ids instanceof Resource )
if ( ids != null )
{
((Resource) ids).close();
ids.close();
}
}
}
Expand Up @@ -19,11 +19,10 @@
*/
package org.neo4j.kernel.impl.api;

import org.neo4j.collection.primitive.PrimitiveLongCollections;
import org.neo4j.internal.kernel.api.IndexQuery;
import org.neo4j.kernel.api.ReadOperations;
import org.neo4j.kernel.api.exceptions.index.IndexNotApplicableKernelException;
import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException;
import org.neo4j.internal.kernel.api.IndexQuery;
import org.neo4j.kernel.api.txstate.TransactionState;
import org.neo4j.kernel.impl.api.operations.CountsOperations;
import org.neo4j.kernel.impl.api.operations.EntityReadOperations;
Expand All @@ -46,6 +45,7 @@
import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.neo4j.collection.primitive.PrimitiveLongResourceCollections.emptyIterator;

public abstract class StatementOperationsTestHelper
{
Expand Down Expand Up @@ -79,7 +79,7 @@ public static KernelStatement mockedState( final TransactionState txState )
{
IndexReader indexReader = mock( IndexReader.class );
when( indexReader.query( isA( IndexQuery.ExactPredicate.class ) ) )
.thenReturn( PrimitiveLongCollections.emptyIterator() );
.thenReturn( emptyIterator() );
StorageStatement storageStatement = mock( StorageStatement.class );
when( storageStatement.getIndexReader( any() ) ).thenReturn( indexReader );
when( state.getStoreStatement() ).thenReturn( storageStatement );
Expand Down
Expand Up @@ -28,13 +28,15 @@
import java.util.Map;
import java.util.Set;

import org.neo4j.collection.primitive.PrimitiveLongCollections;
import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.collection.primitive.PrimitiveLongResourceIterator;
import org.neo4j.helpers.collection.Iterables;
import org.neo4j.internal.kernel.api.IndexQuery;
import org.neo4j.storageengine.api.schema.IndexSampler;
import org.neo4j.values.storable.Value;

import static org.neo4j.collection.primitive.PrimitiveLongCollections.emptyIterator;
import static org.neo4j.collection.primitive.PrimitiveLongCollections.resourceIterator;
import static org.neo4j.collection.primitive.PrimitiveLongCollections.toPrimitiveIterator;
import static org.neo4j.internal.kernel.api.IndexQuery.IndexQueryType.exact;
import static org.neo4j.kernel.impl.api.PropertyValueComparison.COMPARE_VALUES;
Expand Down Expand Up @@ -73,13 +75,13 @@ synchronized void drop()
}

@Override
synchronized PrimitiveLongIterator doIndexSeek( Object... propertyValues )
synchronized PrimitiveLongResourceIterator doIndexSeek( Object... propertyValues )
{
Set<Long> nodes = data().get( Arrays.asList( propertyValues ) );
return nodes == null ? PrimitiveLongCollections.emptyIterator() : toPrimitiveIterator( nodes.iterator() );
return asResource( nodes == null ? emptyIterator() : toPrimitiveIterator( nodes.iterator() ) );
}

private synchronized PrimitiveLongIterator rangeSeekByNumberInclusive( Number lower, Number upper )
private synchronized PrimitiveLongResourceIterator rangeSeekByNumberInclusive( Number lower, Number upper )
{
Set<Long> nodeIds = new HashSet<>();
for ( Map.Entry<List<Object>,Set<Long>> entry : data.entrySet() )
Expand All @@ -96,10 +98,10 @@ private synchronized PrimitiveLongIterator rangeSeekByNumberInclusive( Number lo
}
}
}
return toPrimitiveIterator( nodeIds.iterator() );
return asResource( toPrimitiveIterator( nodeIds.iterator() ) );
}

private synchronized PrimitiveLongIterator rangeSeekByString( String lower, boolean includeLower, String upper,
private synchronized PrimitiveLongResourceIterator rangeSeekByString( String lower, boolean includeLower, String upper,
boolean includeUpper )
{
Set<Long> nodeIds = new HashSet<>();
Expand Down Expand Up @@ -137,28 +139,28 @@ private synchronized PrimitiveLongIterator rangeSeekByString( String lower, bool
}
}
}
return toPrimitiveIterator( nodeIds.iterator() );
return asResource( toPrimitiveIterator( nodeIds.iterator() ) );
}

private synchronized PrimitiveLongIterator rangeSeekByPrefix( String prefix )
private synchronized PrimitiveLongResourceIterator rangeSeekByPrefix( String prefix )
{
return stringSearch( ( String entry ) -> entry.startsWith( prefix ) );
}

private synchronized PrimitiveLongIterator containsString( String exactTerm )
private synchronized PrimitiveLongResourceIterator containsString( String exactTerm )
{
return stringSearch( ( String entry ) -> entry.contains( exactTerm ) );
}

private PrimitiveLongIterator endsWith( String suffix )
private PrimitiveLongResourceIterator endsWith( String suffix )
{
return stringSearch( ( String entry ) -> entry.endsWith( suffix ) );
}

private synchronized PrimitiveLongIterator scan()
private synchronized PrimitiveLongResourceIterator scan()
{
Iterable<Long> all = Iterables.flattenIterable( data.values() );
return toPrimitiveIterator( all.iterator() );
return asResource( toPrimitiveIterator( all.iterator() ) );
}

@Override
Expand Down Expand Up @@ -245,7 +247,7 @@ public synchronized IndexSampler createSampler()
}

@Override
public PrimitiveLongIterator query( IndexQuery... predicates )
public PrimitiveLongResourceIterator query( IndexQuery... predicates )
{
if ( predicates.length > 1 )
{
Expand Down Expand Up @@ -296,7 +298,7 @@ private interface StringFilter
boolean test( String s );
}

private PrimitiveLongIterator stringSearch( StringFilter filter )
private PrimitiveLongResourceIterator stringSearch( StringFilter filter )
{
Set<Long> nodeIds = new HashSet<>();
for ( Map.Entry<List<Object>,Set<Long>> entry : data.entrySet() )
Expand All @@ -310,7 +312,12 @@ private PrimitiveLongIterator stringSearch( StringFilter filter )
}
}
}
return toPrimitiveIterator( nodeIds.iterator() );
return asResource( toPrimitiveIterator( nodeIds.iterator() ) );
}

private PrimitiveLongResourceIterator asResource( PrimitiveLongIterator iterator )
{
return resourceIterator( iterator, null );
}

@Override
Expand Down
Expand Up @@ -21,7 +21,7 @@

import java.util.Set;

import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.collection.primitive.PrimitiveLongResourceIterator;
import org.neo4j.helpers.collection.BoundedIterable;
import org.neo4j.kernel.api.index.ArrayEncoder;
import org.neo4j.storageengine.api.schema.IndexReader;
Expand All @@ -33,7 +33,7 @@ abstract class InMemoryIndexImplementation implements IndexReader, BoundedIterab

abstract void drop();

public final PrimitiveLongIterator seek( Value... values )
public final PrimitiveLongResourceIterator seek( Value... values )
{
return doIndexSeek( encode( values ) );
}
Expand All @@ -56,7 +56,7 @@ public final long countIndexedNodes( long nodeId, Value... propertyValues )

protected abstract long doCountIndexedNodes( long nodeId, Object... encode );

abstract PrimitiveLongIterator doIndexSeek( Object... propertyValue );
abstract PrimitiveLongResourceIterator doIndexSeek( Object... propertyValue );

abstract boolean doAdd( long nodeId, boolean applyIdempotently, Object... propertyValue );

Expand Down
Expand Up @@ -27,15 +27,16 @@

import org.neo4j.collection.primitive.PrimitiveLongCollections;
import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.collection.primitive.PrimitiveLongResourceCollections;
import org.neo4j.cursor.Cursor;
import org.neo4j.helpers.collection.Iterables;
import org.neo4j.internal.kernel.api.IndexQuery;
import org.neo4j.kernel.api.AssertOpen;
import org.neo4j.kernel.api.DataWriteOperations;
import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException;
import org.neo4j.kernel.api.explicitindex.AutoIndexOperations;
import org.neo4j.kernel.api.explicitindex.AutoIndexing;
import org.neo4j.kernel.api.properties.PropertyKeyValue;
import org.neo4j.internal.kernel.api.IndexQuery;
import org.neo4j.kernel.api.schema.LabelSchemaDescriptor;
import org.neo4j.kernel.api.schema.SchemaDescriptorFactory;
import org.neo4j.kernel.api.schema.constaints.ConstraintDescriptor;
Expand Down Expand Up @@ -488,7 +489,7 @@ public void indexQueryClosesIndexReader() throws Exception
StoreStatement storeStatement = mock( StoreStatement.class );
IndexReader indexReader = mock( IndexReader.class );

when( indexReader.query( any() ) ).thenReturn( PrimitiveLongCollections.emptyIterator() );
when( indexReader.query( any() ) ).thenReturn( PrimitiveLongResourceCollections.emptyIterator() );
when( storeStatement.getFreshIndexReader( any() ) ).thenReturn( indexReader );
when( kernelStatement.getStoreStatement() ).thenReturn( storeStatement );

Expand Down Expand Up @@ -612,7 +613,7 @@ public void shouldNotDecorateNumberQuerResultsWIthLookupFilterIfIndexHasFullNumb
IndexReader indexReader = mock( IndexReader.class );
when( indexReader.hasFullNumberPrecision( any() ) ).thenReturn( true );
when( indexReader.query( any() ) )
.thenAnswer( invocation -> PrimitiveLongCollections.iterator( nodeId ) );
.thenAnswer( invocation -> PrimitiveLongResourceCollections.iterator( null, nodeId ) );
when( storeStatement.getFreshIndexReader( any() ) ).thenReturn( indexReader );
when( storeStatement.getIndexReader( any() ) ).thenReturn( indexReader );

Expand Down

0 comments on commit 564f935

Please sign in to comment.