Skip to content

Commit

Permalink
Pulls out Scanner from RecordStore
Browse files Browse the repository at this point in the history
  • Loading branch information
tinwelint committed Mar 8, 2016
1 parent 75a5514 commit 53de60c
Show file tree
Hide file tree
Showing 5 changed files with 104 additions and 57 deletions.
Expand Up @@ -39,7 +39,7 @@
import org.neo4j.helpers.progress.ProgressMonitorFactory;
import org.neo4j.kernel.api.labelscan.LabelScanStore;
import org.neo4j.kernel.impl.store.RecordStore;
import org.neo4j.kernel.impl.store.RecordStore.Scanner;
import org.neo4j.kernel.impl.store.Scanner;
import org.neo4j.kernel.impl.store.SchemaStorage;
import org.neo4j.kernel.impl.store.StoreAccess;
import org.neo4j.kernel.impl.store.record.AbstractBaseRecord;
Expand Down
Expand Up @@ -29,7 +29,7 @@
import org.neo4j.kernel.impl.store.record.AbstractBaseRecord;

import static org.neo4j.consistency.checking.full.CloningRecordIterator.cloned;
import static org.neo4j.kernel.impl.store.RecordStore.Scanner.scan;
import static org.neo4j.kernel.impl.store.Scanner.scan;
import static org.neo4j.kernel.impl.store.record.RecordLoad.FORCE;

public class IterableStore<RECORD extends AbstractBaseRecord> implements BoundedIterable<RECORD>
Expand Down
Expand Up @@ -47,7 +47,7 @@
import static org.neo4j.consistency.checking.cache.DefaultCacheAccess.DEFAULT_QUEUE_SIZE;
import static org.neo4j.consistency.checking.full.CloningRecordIterator.cloned;
import static org.neo4j.consistency.checking.full.RecordDistributor.distributeRecords;
import static org.neo4j.kernel.impl.store.RecordStore.Scanner.scan;
import static org.neo4j.kernel.impl.store.Scanner.scan;

/**
* Full check works by spawning StoreProcessorTasks that call StoreProcessor. StoreProcessor.applyFiltered()
Expand Down
Expand Up @@ -23,11 +23,9 @@
import java.util.Collection;
import java.util.function.Predicate;

import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.helpers.progress.ProgressListener;
import org.neo4j.graphdb.ResourceIterable;
import org.neo4j.graphdb.ResourceIterator;
import org.neo4j.helpers.collection.PrefetchingResourceIterator;
import org.neo4j.kernel.impl.store.id.IdType;
import org.neo4j.io.pagecache.PageCursor;
import org.neo4j.kernel.impl.store.id.IdSequence;
Expand Down Expand Up @@ -470,58 +468,6 @@ private <R extends AbstractBaseRecord> void apply( RecordStore<R> store, Progres
}
}

class Scanner
{
@SafeVarargs
public static <R extends AbstractBaseRecord> ResourceIterable<R> scan( final RecordStore<R> store,
final Predicate<? super R>... filters )
{
return scan( store, true, filters );
}

@SafeVarargs
public static <R extends AbstractBaseRecord> ResourceIterable<R> scan( final RecordStore<R> store,
final boolean forward, final Predicate<? super R>... filters )
{
return () -> new PrefetchingResourceIterator<R>()
{
final PrimitiveLongIterator ids = new StoreIdIterator( store, forward );
final RecordCursor<R> cursor = store.newRecordCursor( store.newRecord() );
{
store.placeRecordCursor( 0, cursor, RecordLoad.CHECK );
}

@Override
protected R fetchNextOrNull()
{
scan:
while ( ids.hasNext() )
{
if ( cursor.next( ids.next() ) )
{
R record = cursor.get();
for ( Predicate<? super R> filter : filters )
{
if ( !filter.test( record ) )
{
continue scan;
}
}
return record;
}
}
return null;
}

@Override
public void close()
{
cursor.close();
}
};
}
}

/**
* Utility methods for reading records. These are not on the interface itself since it should be
* an explicit choice when to create the record instances passed into it.
Expand Down
@@ -0,0 +1,101 @@
/*
* Copyright (c) 2002-2016 "Neo Technology,"
* Network Engine for Objects in Lund AB [http://neotechnology.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.neo4j.kernel.impl.store;

import java.util.function.Predicate;

import org.neo4j.collection.primitive.PrimitiveLongIterator;
import org.neo4j.graphdb.ResourceIterable;
import org.neo4j.graphdb.ResourceIterator;
import org.neo4j.helpers.collection.PrefetchingResourceIterator;
import org.neo4j.kernel.impl.store.record.AbstractBaseRecord;
import org.neo4j.kernel.impl.store.record.RecordLoad;

/**
* Scans all used records in a store, returned {@link ResourceIterable} must be properly used such that
* its {@link ResourceIterable#iterator() resource iterators} are {@link ResourceIterator#close() closed}
* after use.
*/
public class Scanner
{
@SafeVarargs
public static <R extends AbstractBaseRecord> ResourceIterable<R> scan( final RecordStore<R> store,
final Predicate<? super R>... filters )
{
return scan( store, true, filters );
}

@SafeVarargs
public static <R extends AbstractBaseRecord> ResourceIterable<R> scan( final RecordStore<R> store,
final boolean forward, final Predicate<? super R>... filters )
{
return () -> new Scan<>( store, forward, filters );
}

private static class Scan<R extends AbstractBaseRecord> extends PrefetchingResourceIterator<R>
{
private final PrimitiveLongIterator ids;
private final RecordCursor<R> cursor;
private final Predicate<? super R>[] filters;

public Scan( RecordStore<R> store, boolean forward, final Predicate<? super R>... filters )
{
this.filters = filters;
this.ids = new StoreIdIterator( store, forward );
this.cursor = store.newRecordCursor( store.newRecord() );
store.placeRecordCursor( 0, cursor, RecordLoad.CHECK );
}

@Override
protected R fetchNextOrNull()
{
while ( ids.hasNext() )
{
if ( cursor.next( ids.next() ) )
{
R record = cursor.get();
if ( passesFilters( record ) )
{
return record;
}
}
}
return null;
}

private boolean passesFilters( R record )
{
for ( Predicate<? super R> filter : filters )
{
if ( !filter.test( record ) )
{
return false;
}
}
return true;
}

@Override
public void close()
{
cursor.close();
}
}
}

0 comments on commit 53de60c

Please sign in to comment.