Skip to content

Commit

Permalink
PR comment: Extract shared code in index provider factories into Abst…
Browse files Browse the repository at this point in the history
…ractIndexProviderFactory
  • Loading branch information
burqen committed Jul 27, 2018
1 parent 8c2d23a commit d64c89b
Show file tree
Hide file tree
Showing 6 changed files with 149 additions and 135 deletions.
@@ -0,0 +1,91 @@
/*
* Copyright (c) 2002-2018 "Neo4j,"
* Neo4j Sweden AB [http://neo4j.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.index.schema;

import java.io.File;

import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import org.neo4j.index.internal.gbptree.RecoveryCleanupWorkCollector;
import org.neo4j.io.fs.FileSystemAbstraction;
import org.neo4j.io.pagecache.PageCache;
import org.neo4j.kernel.api.index.IndexProvider;
import org.neo4j.kernel.api.index.LoggingMonitor;
import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.extension.ExtensionType;
import org.neo4j.kernel.extension.KernelExtensionFactory;
import org.neo4j.kernel.impl.factory.OperationalMode;
import org.neo4j.kernel.impl.logging.LogService;
import org.neo4j.kernel.impl.spi.KernelContext;
import org.neo4j.kernel.lifecycle.Lifecycle;
import org.neo4j.kernel.monitoring.Monitors;
import org.neo4j.logging.Log;

public abstract class AbstractIndexProviderFactory extends KernelExtensionFactory<GenericNativeIndexProviderFactory.Dependencies>
{
protected AbstractIndexProviderFactory( String key )
{
super( ExtensionType.DATABASE, key );
}

@Override
public Lifecycle newInstance( KernelContext context, Dependencies dependencies )
{
PageCache pageCache = dependencies.pageCache();
File databaseDir = context.directory();
FileSystemAbstraction fs = dependencies.fileSystem();
Log log = dependencies.getLogService().getInternalLogProvider().getLog( loggingClass() );
Monitors monitors = dependencies.monitors();
monitors.addMonitorListener( new LoggingMonitor( log ), descriptorString() );
IndexProvider.Monitor monitor = monitors.newMonitor( IndexProvider.Monitor.class, descriptorString() );
Config config = dependencies.getConfig();
OperationalMode operationalMode = context.databaseInfo().operationalMode;
RecoveryCleanupWorkCollector recoveryCleanupWorkCollector = dependencies.recoveryCleanupWorkCollector();
return internalCreate( pageCache, databaseDir, fs, monitor, config, operationalMode, recoveryCleanupWorkCollector );
}

protected static int adjustPriorityForConfig( int basePriority, GraphDatabaseSettings.SchemaIndex target, Config config )
{
String defaultSchemaProvider = config.get( GraphDatabaseSettings.default_schema_provider );
return target.providerIdentifier().equals( defaultSchemaProvider ) ? 100 : basePriority;
}

protected abstract Class loggingClass();

protected abstract String descriptorString();

protected abstract IndexProvider internalCreate( PageCache pageCache, File storeDir, FileSystemAbstraction fs,
IndexProvider.Monitor monitor, Config config, OperationalMode operationalMode,
RecoveryCleanupWorkCollector recoveryCleanupWorkCollector );

public interface Dependencies
{
PageCache pageCache();

FileSystemAbstraction fileSystem();

LogService getLogService();

Monitors monitors();

Config getConfig();

RecoveryCleanupWorkCollector recoveryCleanupWorkCollector();
}
}
Expand Up @@ -28,70 +28,45 @@
import org.neo4j.io.pagecache.PageCache; import org.neo4j.io.pagecache.PageCache;
import org.neo4j.kernel.api.index.IndexDirectoryStructure; import org.neo4j.kernel.api.index.IndexDirectoryStructure;
import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.api.index.IndexProvider;
import org.neo4j.kernel.api.index.LoggingMonitor;
import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.extension.ExtensionType;
import org.neo4j.kernel.extension.KernelExtensionFactory; import org.neo4j.kernel.extension.KernelExtensionFactory;
import org.neo4j.kernel.impl.factory.OperationalMode; import org.neo4j.kernel.impl.factory.OperationalMode;
import org.neo4j.kernel.impl.index.schema.fusion.FusionIndexProvider;
import org.neo4j.kernel.impl.logging.LogService;
import org.neo4j.kernel.impl.spi.KernelContext;
import org.neo4j.kernel.monitoring.Monitors;
import org.neo4j.logging.Log;


import static org.neo4j.kernel.api.index.IndexDirectoryStructure.directoriesByProvider; import static org.neo4j.kernel.api.index.IndexDirectoryStructure.directoriesByProvider;
import static org.neo4j.kernel.impl.index.schema.GenericNativeIndexProvider.DESCRIPTOR;


@Service.Implementation( KernelExtensionFactory.class ) @Service.Implementation( KernelExtensionFactory.class )
public class GenericNativeIndexProviderFactory extends KernelExtensionFactory<GenericNativeIndexProviderFactory.Dependencies> public class GenericNativeIndexProviderFactory extends AbstractIndexProviderFactory
{ {
private static final int PRIORITY = 0; // TODO: Zero because should not be default yet. private static final int PRIORITY = 0; // TODO: Zero because should not be default yet.


public GenericNativeIndexProviderFactory() public GenericNativeIndexProviderFactory()
{ {
super( ExtensionType.DATABASE, GenericNativeIndexProvider.KEY ); super( GenericNativeIndexProvider.KEY );
} }


public interface Dependencies @Override
protected Class loggingClass()
{ {
PageCache pageCache(); return GenericNativeIndexProvider.class;

}
FileSystemAbstraction fileSystem();

LogService getLogService();

Monitors monitors();

Config getConfig();


RecoveryCleanupWorkCollector recoveryCleanupWorkCollector(); @Override
protected String descriptorString()
{
return GenericNativeIndexProvider.DESCRIPTOR.toString();
} }


@Override @Override
public GenericNativeIndexProvider newInstance( KernelContext context, Dependencies dependencies ) protected GenericNativeIndexProvider internalCreate( PageCache pageCache, File storeDir, FileSystemAbstraction fs, IndexProvider.Monitor monitor, Config config,
OperationalMode operationalMode, RecoveryCleanupWorkCollector recoveryCleanupWorkCollector )
{ {
PageCache pageCache = dependencies.pageCache();
File storeDir = context.storeDir();
FileSystemAbstraction fs = dependencies.fileSystem();
Log log = dependencies.getLogService().getInternalLogProvider().getLog( FusionIndexProvider.class );
Monitors monitors = dependencies.monitors();
monitors.addMonitorListener( new LoggingMonitor( log ), DESCRIPTOR.toString() );
IndexProvider.Monitor monitor = monitors.newMonitor( IndexProvider.Monitor.class, DESCRIPTOR.toString() );
Config config = dependencies.getConfig();
OperationalMode operationalMode = context.databaseInfo().operationalMode;
RecoveryCleanupWorkCollector recoveryCleanupWorkCollector = dependencies.recoveryCleanupWorkCollector();
return create( pageCache, storeDir, fs, monitor, config, operationalMode, recoveryCleanupWorkCollector ); return create( pageCache, storeDir, fs, monitor, config, operationalMode, recoveryCleanupWorkCollector );
} }


public static GenericNativeIndexProvider create( PageCache pageCache, File storeDir, FileSystemAbstraction fs, IndexProvider.Monitor monitor, Config config, public static GenericNativeIndexProvider create( PageCache pageCache, File storeDir, FileSystemAbstraction fs, IndexProvider.Monitor monitor, Config config,
OperationalMode mode, RecoveryCleanupWorkCollector recoveryCleanupWorkCollector ) OperationalMode mode, RecoveryCleanupWorkCollector recoveryCleanupWorkCollector )
{ {
String selectedSchemaProvider = config.get( GraphDatabaseSettings.default_schema_provider ); int priority = adjustPriorityForConfig( PRIORITY, GraphDatabaseSettings.SchemaIndex.NATIVE_GBPTREE10, config );
int priority = PRIORITY;
if ( GraphDatabaseSettings.SchemaIndex.NATIVE_GBPTREE10.providerIdentifier().equals( selectedSchemaProvider ) )
{
priority = 100;
}


IndexDirectoryStructure.Factory directoryStructure = directoriesByProvider( storeDir ); IndexDirectoryStructure.Factory directoryStructure = directoriesByProvider( storeDir );
boolean readOnly = config.get( GraphDatabaseSettings.read_only ) && (OperationalMode.single == mode); boolean readOnly = config.get( GraphDatabaseSettings.read_only ) && (OperationalMode.single == mode);
Expand Down
Expand Up @@ -28,67 +28,48 @@
import org.neo4j.io.pagecache.PageCache; import org.neo4j.io.pagecache.PageCache;
import org.neo4j.kernel.api.index.IndexDirectoryStructure; import org.neo4j.kernel.api.index.IndexDirectoryStructure;
import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.api.index.IndexProvider;
import org.neo4j.kernel.api.index.LoggingMonitor;
import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.extension.ExtensionType;
import org.neo4j.kernel.extension.KernelExtensionFactory; import org.neo4j.kernel.extension.KernelExtensionFactory;
import org.neo4j.kernel.impl.factory.OperationalMode; import org.neo4j.kernel.impl.factory.OperationalMode;
import org.neo4j.kernel.impl.index.schema.AbstractIndexProviderFactory;
import org.neo4j.kernel.impl.index.schema.SpatialIndexProvider; import org.neo4j.kernel.impl.index.schema.SpatialIndexProvider;
import org.neo4j.kernel.impl.index.schema.TemporalIndexProvider; import org.neo4j.kernel.impl.index.schema.TemporalIndexProvider;
import org.neo4j.kernel.impl.index.schema.fusion.FusionIndexProvider; import org.neo4j.kernel.impl.index.schema.fusion.FusionIndexProvider;
import org.neo4j.kernel.impl.index.schema.fusion.FusionSlotSelector00; import org.neo4j.kernel.impl.index.schema.fusion.FusionSlotSelector00;
import org.neo4j.kernel.impl.logging.LogService;
import org.neo4j.kernel.impl.spi.KernelContext;
import org.neo4j.kernel.monitoring.Monitors;
import org.neo4j.logging.Log;


import static org.neo4j.kernel.api.index.IndexDirectoryStructure.directoriesByProvider; import static org.neo4j.kernel.api.index.IndexDirectoryStructure.directoriesByProvider;
import static org.neo4j.kernel.api.index.IndexDirectoryStructure.directoriesByProviderKey; import static org.neo4j.kernel.api.index.IndexDirectoryStructure.directoriesByProviderKey;
import static org.neo4j.kernel.api.index.IndexProvider.EMPTY; import static org.neo4j.kernel.api.index.IndexProvider.EMPTY;


@Service.Implementation( KernelExtensionFactory.class ) @Service.Implementation( KernelExtensionFactory.class )
public class LuceneIndexProviderFactory extends public class LuceneIndexProviderFactory extends AbstractIndexProviderFactory
KernelExtensionFactory<LuceneIndexProviderFactory.Dependencies>
{ {
public static final String KEY = "lucene"; public static final String KEY = GraphDatabaseSettings.SchemaIndex.LUCENE10.providerName();
public static final String VERSION = GraphDatabaseSettings.SchemaIndex.LUCENE10.providerVersion();
public static final IndexProvider.Descriptor PROVIDER_DESCRIPTOR = new IndexProvider.Descriptor( KEY, VERSION );


public static final IndexProvider.Descriptor PROVIDER_DESCRIPTOR = public LuceneIndexProviderFactory()
new IndexProvider.Descriptor( KEY, "1.0" );

public interface Dependencies
{ {
PageCache pageCache(); super( KEY );

}
RecoveryCleanupWorkCollector recoveryCleanupWorkCollector();

Config getConfig();

Monitors monitors();

LogService getLogService();


FileSystemAbstraction fileSystem(); @Override
protected Class loggingClass()
{
return LuceneIndexProvider.class;
} }


public LuceneIndexProviderFactory() @Override
protected String descriptorString()
{ {
super( ExtensionType.DATABASE, KEY ); return PROVIDER_DESCRIPTOR.toString();
} }


@Override @Override
public IndexProvider newInstance( KernelContext context, Dependencies dependencies ) protected IndexProvider internalCreate( PageCache pageCache, File storeDir, FileSystemAbstraction fs, IndexProvider.Monitor monitor, Config config,
OperationalMode operationalMode, RecoveryCleanupWorkCollector recoveryCleanupWorkCollector )
{ {
PageCache pageCache = dependencies.pageCache(); return newInstance( pageCache, storeDir, fs, monitor, config, operationalMode, recoveryCleanupWorkCollector );
File databaseDirectory = context.directory();
FileSystemAbstraction fs = dependencies.fileSystem();
Monitors monitors = dependencies.monitors();
Log log = dependencies.getLogService().getInternalLogProvider().getLog( LuceneIndexProvider.class );
monitors.addMonitorListener( new LoggingMonitor( log ), PROVIDER_DESCRIPTOR.toString() );
IndexProvider.Monitor monitor = monitors.newMonitor( IndexProvider.Monitor.class, KEY );
Config config = dependencies.getConfig();
OperationalMode operationalMode = context.databaseInfo().operationalMode;
RecoveryCleanupWorkCollector recoveryCleanupWorkCollector = dependencies.recoveryCleanupWorkCollector();
return newInstance( pageCache, databaseDirectory, fs, monitor, config, operationalMode, recoveryCleanupWorkCollector );
} }


public static FusionIndexProvider newInstance( PageCache pageCache, File databaseDirectory, FileSystemAbstraction fs, public static FusionIndexProvider newInstance( PageCache pageCache, File databaseDirectory, FileSystemAbstraction fs,
Expand All @@ -106,12 +87,7 @@ public static FusionIndexProvider newInstance( PageCache pageCache, File databas
SpatialIndexProvider spatial = SpatialIndexProvider spatial =
IndexProviderFactoryUtil.spatialProvider( pageCache, fs, childDirectoryStructure, monitor, recoveryCleanupWorkCollector, readOnly, config ); IndexProviderFactoryUtil.spatialProvider( pageCache, fs, childDirectoryStructure, monitor, recoveryCleanupWorkCollector, readOnly, config );


String defaultSchemaProvider = config.get( GraphDatabaseSettings.default_schema_provider ); int priority = adjustPriorityForConfig( LuceneIndexProvider.PRIORITY, GraphDatabaseSettings.SchemaIndex.LUCENE10, config );
int priority = LuceneIndexProvider.PRIORITY;
if ( GraphDatabaseSettings.SchemaIndex.LUCENE10.providerIdentifier().equals( defaultSchemaProvider ) )
{
priority = 100;
}
return new FusionIndexProvider( EMPTY, EMPTY, spatial, temporal, lucene, new FusionSlotSelector00(), return new FusionIndexProvider( EMPTY, EMPTY, spatial, temporal, lucene, new FusionSlotSelector00(),
PROVIDER_DESCRIPTOR, priority, directoriesByProvider( databaseDirectory ), fs, archiveFailedIndex ); PROVIDER_DESCRIPTOR, priority, directoriesByProvider( databaseDirectory ), fs, archiveFailedIndex );
} }
Expand Down
Expand Up @@ -23,17 +23,23 @@


import org.neo4j.kernel.api.index.IndexDirectoryStructure; import org.neo4j.kernel.api.index.IndexDirectoryStructure;
import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.api.index.IndexProvider;
import org.neo4j.kernel.extension.ExtensionType; import org.neo4j.kernel.impl.index.schema.AbstractIndexProviderFactory;
import org.neo4j.kernel.extension.KernelExtensionFactory; import org.neo4j.kernel.impl.index.schema.fusion.FusionIndexProvider;


import static org.neo4j.kernel.api.index.IndexDirectoryStructure.directoriesByProvider; import static org.neo4j.kernel.api.index.IndexDirectoryStructure.directoriesByProvider;
import static org.neo4j.kernel.api.index.IndexDirectoryStructure.directoriesBySubProvider; import static org.neo4j.kernel.api.index.IndexDirectoryStructure.directoriesBySubProvider;


abstract class NativeLuceneFusionIndexProviderFactory<DEPENDENCIES> extends KernelExtensionFactory<DEPENDENCIES> abstract class NativeLuceneFusionIndexProviderFactory extends AbstractIndexProviderFactory
{ {
NativeLuceneFusionIndexProviderFactory( String key ) NativeLuceneFusionIndexProviderFactory( String key )
{ {
super( ExtensionType.DATABASE, key ); super( key );
}

@Override
protected Class loggingClass()
{
return FusionIndexProvider.class;
} }


public static IndexDirectoryStructure.Factory subProviderDirectoryStructure( File databaseDirectory, IndexProvider.Descriptor descriptor ) public static IndexDirectoryStructure.Factory subProviderDirectoryStructure( File databaseDirectory, IndexProvider.Descriptor descriptor )
Expand Down
Expand Up @@ -28,7 +28,6 @@
import org.neo4j.io.pagecache.PageCache; import org.neo4j.io.pagecache.PageCache;
import org.neo4j.kernel.api.index.IndexDirectoryStructure; import org.neo4j.kernel.api.index.IndexDirectoryStructure;
import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.api.index.IndexProvider;
import org.neo4j.kernel.api.index.LoggingMonitor;
import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.extension.KernelExtensionFactory; import org.neo4j.kernel.extension.KernelExtensionFactory;
import org.neo4j.kernel.impl.factory.OperationalMode; import org.neo4j.kernel.impl.factory.OperationalMode;
Expand All @@ -37,16 +36,12 @@
import org.neo4j.kernel.impl.index.schema.TemporalIndexProvider; import org.neo4j.kernel.impl.index.schema.TemporalIndexProvider;
import org.neo4j.kernel.impl.index.schema.fusion.FusionIndexProvider; import org.neo4j.kernel.impl.index.schema.fusion.FusionIndexProvider;
import org.neo4j.kernel.impl.index.schema.fusion.FusionSlotSelector10; import org.neo4j.kernel.impl.index.schema.fusion.FusionSlotSelector10;
import org.neo4j.kernel.impl.spi.KernelContext;
import org.neo4j.kernel.monitoring.Monitors;
import org.neo4j.logging.Log;


import static org.neo4j.kernel.api.index.IndexDirectoryStructure.directoriesByProvider; import static org.neo4j.kernel.api.index.IndexDirectoryStructure.directoriesByProvider;
import static org.neo4j.kernel.api.index.IndexProvider.EMPTY; import static org.neo4j.kernel.api.index.IndexProvider.EMPTY;


@Service.Implementation( KernelExtensionFactory.class ) @Service.Implementation( KernelExtensionFactory.class )
public class NativeLuceneFusionIndexProviderFactory10 extends public class NativeLuceneFusionIndexProviderFactory10 extends NativeLuceneFusionIndexProviderFactory
NativeLuceneFusionIndexProviderFactory<NativeLuceneFusionIndexProviderFactory10.Dependencies>
{ {
public static final String KEY = GraphDatabaseSettings.SchemaIndex.NATIVE10.providerName(); public static final String KEY = GraphDatabaseSettings.SchemaIndex.NATIVE10.providerName();
public static final String VERSION = GraphDatabaseSettings.SchemaIndex.NATIVE10.providerVersion(); public static final String VERSION = GraphDatabaseSettings.SchemaIndex.NATIVE10.providerVersion();
Expand All @@ -58,24 +53,17 @@ public NativeLuceneFusionIndexProviderFactory10()
super( KEY ); super( KEY );
} }


public interface Dependencies extends LuceneIndexProviderFactory.Dependencies @Override
protected String descriptorString()
{ {
return DESCRIPTOR.toString();
} }


@Override @Override
public FusionIndexProvider newInstance( KernelContext context, Dependencies dependencies ) protected IndexProvider internalCreate( PageCache pageCache, File storeDir, FileSystemAbstraction fs, IndexProvider.Monitor monitor, Config config,
OperationalMode operationalMode, RecoveryCleanupWorkCollector recoveryCleanupWorkCollector )
{ {
PageCache pageCache = dependencies.pageCache(); return create( pageCache, storeDir, fs, monitor, config, operationalMode, recoveryCleanupWorkCollector );
File databaseDirectory = context.directory();
FileSystemAbstraction fs = dependencies.fileSystem();
Log log = dependencies.getLogService().getInternalLogProvider().getLog( FusionIndexProvider.class );
Monitors monitors = dependencies.monitors();
monitors.addMonitorListener( new LoggingMonitor( log ), DESCRIPTOR.toString() );
IndexProvider.Monitor monitor = monitors.newMonitor( IndexProvider.Monitor.class, DESCRIPTOR.toString() );
Config config = dependencies.getConfig();
OperationalMode operationalMode = context.databaseInfo().operationalMode;
RecoveryCleanupWorkCollector recoveryCleanupWorkCollector = dependencies.recoveryCleanupWorkCollector();
return create( pageCache, databaseDirectory, fs, monitor, config, operationalMode, recoveryCleanupWorkCollector );
} }


public static FusionIndexProvider create( PageCache pageCache, File databaseDirectory, FileSystemAbstraction fs, public static FusionIndexProvider create( PageCache pageCache, File databaseDirectory, FileSystemAbstraction fs,
Expand All @@ -94,12 +82,7 @@ public static FusionIndexProvider create( PageCache pageCache, File databaseDire
IndexProviderFactoryUtil.temporalProvider( pageCache, fs, childDirectoryStructure, monitor, recoveryCleanupWorkCollector, readOnly ); IndexProviderFactoryUtil.temporalProvider( pageCache, fs, childDirectoryStructure, monitor, recoveryCleanupWorkCollector, readOnly );
LuceneIndexProvider lucene = IndexProviderFactoryUtil.luceneProvider( fs, childDirectoryStructure, monitor, config, operationalMode ); LuceneIndexProvider lucene = IndexProviderFactoryUtil.luceneProvider( fs, childDirectoryStructure, monitor, config, operationalMode );


String defaultSchemaProvider = config.get( GraphDatabaseSettings.default_schema_provider ); int priority = adjustPriorityForConfig( PRIORITY, GraphDatabaseSettings.SchemaIndex.NATIVE10, config );
int priority = PRIORITY;
if ( GraphDatabaseSettings.SchemaIndex.NATIVE10.providerIdentifier().equals( defaultSchemaProvider ) )
{
priority = 100;
}
return new FusionIndexProvider( EMPTY, number, spatial, temporal, lucene, new FusionSlotSelector10(), return new FusionIndexProvider( EMPTY, number, spatial, temporal, lucene, new FusionSlotSelector10(),
DESCRIPTOR, priority, directoriesByProvider( databaseDirectory ), fs, archiveFailedIndex ); DESCRIPTOR, priority, directoriesByProvider( databaseDirectory ), fs, archiveFailedIndex );
} }
Expand Down

0 comments on commit d64c89b

Please sign in to comment.