Skip to content

Commit

Permalink
Support multiple schema index providers
Browse files Browse the repository at this point in the history
Introduce kernel extension for Native+Lucene schema index provider
  • Loading branch information
tinwelint authored and burqen committed Aug 15, 2017
1 parent b6b690b commit f2de192
Show file tree
Hide file tree
Showing 19 changed files with 218 additions and 42 deletions.
Expand Up @@ -45,7 +45,7 @@
import org.neo4j.kernel.api.labelscan.LabelScanStore; import org.neo4j.kernel.api.labelscan.LabelScanStore;
import org.neo4j.kernel.api.legacyindex.AutoIndexing; import org.neo4j.kernel.api.legacyindex.AutoIndexing;
import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.extension.dependency.HighestSelectionStrategy; import org.neo4j.kernel.extension.dependency.AllByPrioritySelectionStrategy;
import org.neo4j.kernel.guard.Guard; import org.neo4j.kernel.guard.Guard;
import org.neo4j.kernel.impl.api.CommitProcessFactory; import org.neo4j.kernel.impl.api.CommitProcessFactory;
import org.neo4j.kernel.impl.api.ConstraintEnforcingEntityOperations; import org.neo4j.kernel.impl.api.ConstraintEnforcingEntityOperations;
Expand All @@ -69,6 +69,7 @@
import org.neo4j.kernel.impl.api.TransactionCommitProcess; import org.neo4j.kernel.impl.api.TransactionCommitProcess;
import org.neo4j.kernel.impl.api.TransactionHooks; import org.neo4j.kernel.impl.api.TransactionHooks;
import org.neo4j.kernel.impl.api.index.IndexingService; import org.neo4j.kernel.impl.api.index.IndexingService;
import org.neo4j.kernel.impl.api.index.SchemaIndexProviderMap;
import org.neo4j.kernel.impl.api.operations.QueryRegistrationOperations; import org.neo4j.kernel.impl.api.operations.QueryRegistrationOperations;
import org.neo4j.kernel.impl.api.state.ConstraintIndexCreator; import org.neo4j.kernel.impl.api.state.ConstraintIndexCreator;
import org.neo4j.kernel.impl.constraints.ConstraintSemantics; import org.neo4j.kernel.impl.constraints.ConstraintSemantics;
Expand Down Expand Up @@ -133,6 +134,7 @@
import org.neo4j.kernel.impl.transaction.log.pruning.LogPruningImpl; import org.neo4j.kernel.impl.transaction.log.pruning.LogPruningImpl;
import org.neo4j.kernel.impl.transaction.log.rotation.LogRotation; import org.neo4j.kernel.impl.transaction.log.rotation.LogRotation;
import org.neo4j.kernel.impl.transaction.log.rotation.LogRotationImpl; import org.neo4j.kernel.impl.transaction.log.rotation.LogRotationImpl;
import org.neo4j.kernel.impl.transaction.state.DefaultSchemaIndexProviderMap;
import org.neo4j.kernel.impl.transaction.state.NeoStoreFileListing; import org.neo4j.kernel.impl.transaction.state.NeoStoreFileListing;
import org.neo4j.kernel.impl.util.Dependencies; import org.neo4j.kernel.impl.util.Dependencies;
import org.neo4j.kernel.impl.util.SynchronizedArrayIdOrderingQueue; import org.neo4j.kernel.impl.util.SynchronizedArrayIdOrderingQueue;
Expand Down Expand Up @@ -267,7 +269,7 @@ boolean applicable( DiagnosticsPhase phase )


private Dependencies dependencies; private Dependencies dependencies;
private LifeSupport life; private LifeSupport life;
private SchemaIndexProvider schemaIndexProvider; private SchemaIndexProviderMap schemaIndexProviderMap;
private File storeDir; private File storeDir;
private boolean readOnly; private boolean readOnly;
private final IdController idController; private final IdController idController;
Expand Down Expand Up @@ -407,9 +409,17 @@ public void start() throws IOException


life.add( recoveryCleanupWorkCollector ); life.add( recoveryCleanupWorkCollector );


schemaIndexProvider = dependencyResolver.resolveDependency( SchemaIndexProvider.class, AllByPrioritySelectionStrategy<SchemaIndexProvider> indexProviderSelection =
HighestSelectionStrategy.getInstance() ); new AllByPrioritySelectionStrategy<>();
dependencies.satisfyDependency( schemaIndexProvider ); SchemaIndexProvider defaultIndexProvider = dependencyResolver.resolveDependency( SchemaIndexProvider.class,
indexProviderSelection );

// todo do we really need to have this dependency?
dependencies.satisfyDependency( defaultIndexProvider );

schemaIndexProviderMap = new DefaultSchemaIndexProviderMap( defaultIndexProvider,
indexProviderSelection.lowerPrioritizedCandidates() );
dependencies.satisfyDependency( schemaIndexProviderMap );


IndexConfigStore indexConfigStore = new IndexConfigStore( storeDir, fs ); IndexConfigStore indexConfigStore = new IndexConfigStore( storeDir, fs );
dependencies.satisfyDependency( lockService ); dependencies.satisfyDependency( lockService );
Expand Down Expand Up @@ -558,7 +568,7 @@ private void upgradeStore( RecordFormats format )
fs, fs,
config, config,
logService, logService,
schemaIndexProvider, schemaIndexProviderMap,
indexProviders, indexProviders,
pageCache, pageCache,
format ).migrate( storeDir ); format ).migrate( storeDir );
Expand All @@ -573,7 +583,7 @@ private StorageEngine buildStorageEngine(
RecordStorageEngine storageEngine = RecordStorageEngine storageEngine =
new RecordStorageEngine( storeDir, config, pageCache, fs, logProvider, propertyKeyTokenHolder, new RecordStorageEngine( storeDir, config, pageCache, fs, logProvider, propertyKeyTokenHolder,
labelTokens, relationshipTypeTokens, schemaState, constraintSemantics, scheduler, labelTokens, relationshipTypeTokens, schemaState, constraintSemantics, scheduler,
tokenNameLookup, lockService, schemaIndexProvider, indexingServiceMonitor, databaseHealth, tokenNameLookup, lockService, schemaIndexProviderMap, indexingServiceMonitor, databaseHealth,
legacyIndexProviderLookup, indexConfigStore, legacyIndexProviderLookup, indexConfigStore,
legacyIndexTransactionOrdering, idGeneratorFactory, idController, monitors, recoveryCleanupWorkCollector, legacyIndexTransactionOrdering, idGeneratorFactory, idController, monitors, recoveryCleanupWorkCollector,
operationalMode ); operationalMode );
Expand Down
Expand Up @@ -212,7 +212,7 @@ public int hashCode()
/** /**
* Get schema index store root directory in specified store. * Get schema index store root directory in specified store.
* @param storeDir store root directory * @param storeDir store root directory
* @return shema index store root directory * @return schema index store root directory
*/ */
public File getSchemaIndexStoreDirectory( File storeDir ) public File getSchemaIndexStoreDirectory( File storeDir )
{ {
Expand Down
@@ -0,0 +1,60 @@
/*
* Copyright (c) 2002-2017 "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.extension.dependency;

import java.util.Collections;
import java.util.List;

import org.neo4j.graphdb.DependencyResolver;
import org.neo4j.helpers.collection.Iterables;

import static org.neo4j.kernel.extension.KernelExtensionUtil.servicesClassPathEntryInformation;

/**
* Selects the candidate with highest priority (assumed to implement {@link Comparable}) and returns
* in {@link #select(Class, Iterable)}, but keeps the others for access too.
*/
public class AllByPrioritySelectionStrategy<T> implements DependencyResolver.SelectionStrategy
{
@SuppressWarnings( "rawtypes" )
private List lowerPrioritizedCandidates = Collections.emptyList();

@SuppressWarnings( {"rawtypes", "unchecked"} )
@Override
public <R> R select( Class<R> type, Iterable<R> candidates ) throws IllegalArgumentException
{
List<Comparable> all = (List<Comparable>) Iterables.asList( candidates );
if ( all.isEmpty() )
{
throw new IllegalArgumentException( "Could not resolve dependency of type: " +
type.getName() + ". " + servicesClassPathEntryInformation() );
}
Collections.sort( all, Collections.reverseOrder() );
R highest = (R) all.remove( 0 );
lowerPrioritizedCandidates = all;
return highest;
}

@SuppressWarnings( "unchecked" )
public Iterable<T> lowerPrioritizedCandidates()
{
return lowerPrioritizedCandidates;
}
}
Expand Up @@ -19,6 +19,7 @@
*/ */
package org.neo4j.kernel.impl.api.index; package org.neo4j.kernel.impl.api.index;


import java.util.function.Consumer;
import java.util.function.Function; import java.util.function.Function;


import org.neo4j.kernel.api.index.SchemaIndexProvider; import org.neo4j.kernel.api.index.SchemaIndexProvider;
Expand All @@ -29,4 +30,6 @@ public interface SchemaIndexProviderMap extends Function<SchemaIndexProvider.Des
SchemaIndexProvider apply( SchemaIndexProvider.Descriptor descriptor ) throws IndexProviderNotFoundException; SchemaIndexProvider apply( SchemaIndexProvider.Descriptor descriptor ) throws IndexProviderNotFoundException;


SchemaIndexProvider getDefaultProvider(); SchemaIndexProvider getDefaultProvider();

void accept( Consumer<SchemaIndexProvider> visitor );
} }
Expand Up @@ -74,6 +74,7 @@ public abstract class NativeSchemaNumberIndexPopulator<KEY extends SchemaNumberK
public synchronized void create() throws IOException public synchronized void create() throws IOException
{ {
GBPTreeUtil.deleteIfPresent( pageCache, storeFile ); GBPTreeUtil.deleteIfPresent( pageCache, storeFile );
pageCache.getCachedFileSystem().mkdirs( storeFile.getParentFile() );
instantiateTree( RecoveryCleanupWorkCollector.IMMEDIATE, new NativeSchemaIndexHeaderWriter( BYTE_POPULATING ) ); instantiateTree( RecoveryCleanupWorkCollector.IMMEDIATE, new NativeSchemaIndexHeaderWriter( BYTE_POPULATING ) );
instantiateWriter(); instantiateWriter();
} }
Expand Down
Expand Up @@ -53,12 +53,12 @@ public class NativeSchemaNumberIndexProvider extends SchemaIndexProvider
private final RecoveryCleanupWorkCollector recoveryCleanupWorkCollector; private final RecoveryCleanupWorkCollector recoveryCleanupWorkCollector;
private final boolean readOnly; private final boolean readOnly;


NativeSchemaNumberIndexProvider( PageCache pageCache, File nativeSchemaIndexBaseDir, LogProvider logging, public NativeSchemaNumberIndexProvider( PageCache pageCache, File storeDir, LogProvider logging,
RecoveryCleanupWorkCollector recoveryCleanupWorkCollector, boolean readOnly ) RecoveryCleanupWorkCollector recoveryCleanupWorkCollector, boolean readOnly )
{ {
super( NATIVE_PROVIDER_DESCRIPTOR, 0 ); super( NATIVE_PROVIDER_DESCRIPTOR, 0 );
this.pageCache = pageCache; this.pageCache = pageCache;
this.nativeSchemaIndexBaseDir = getSchemaIndexStoreDirectory( nativeSchemaIndexBaseDir ); this.nativeSchemaIndexBaseDir = getSchemaIndexStoreDirectory( storeDir );
this.log = logging.getLog( getClass() ); this.log = logging.getLog( getClass() );
this.recoveryCleanupWorkCollector = recoveryCleanupWorkCollector; this.recoveryCleanupWorkCollector = recoveryCleanupWorkCollector;
this.readOnly = readOnly; this.readOnly = readOnly;
Expand Down
Expand Up @@ -50,11 +50,10 @@ public interface Selector
private final SchemaIndexProvider luceneProvider; private final SchemaIndexProvider luceneProvider;
private final Selector selector; private final Selector selector;


public FusionSchemaIndexProvider( SchemaIndexProvider nativeProvider, SchemaIndexProvider luceneProvider, Selector selector ) public FusionSchemaIndexProvider( SchemaIndexProvider nativeProvider, SchemaIndexProvider luceneProvider, Selector selector,
SchemaIndexProvider.Descriptor descriptor, int priority )
{ {
super( new Descriptor( super( descriptor, priority );
nativeProvider.getProviderDescriptor().getKey() + "+" + luceneProvider.getProviderDescriptor().getKey(),
nativeProvider.getProviderDescriptor().getVersion() + "+" + luceneProvider.getProviderDescriptor().getVersion() ), 0 );
this.nativeProvider = nativeProvider; this.nativeProvider = nativeProvider;
this.luceneProvider = luceneProvider; this.luceneProvider = luceneProvider;
this.selector = selector; this.selector = selector;
Expand Down
Expand Up @@ -38,7 +38,6 @@
import org.neo4j.kernel.api.exceptions.TransactionFailureException; import org.neo4j.kernel.api.exceptions.TransactionFailureException;
import org.neo4j.kernel.api.exceptions.schema.ConstraintValidationException; import org.neo4j.kernel.api.exceptions.schema.ConstraintValidationException;
import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException; import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException;
import org.neo4j.kernel.api.index.SchemaIndexProvider;
import org.neo4j.kernel.api.labelscan.LabelScanStore; import org.neo4j.kernel.api.labelscan.LabelScanStore;
import org.neo4j.kernel.api.labelscan.LabelScanWriter; import org.neo4j.kernel.api.labelscan.LabelScanWriter;
import org.neo4j.kernel.api.txstate.TransactionCountingStateVisitor; import org.neo4j.kernel.api.txstate.TransactionCountingStateVisitor;
Expand All @@ -59,6 +58,7 @@
import org.neo4j.kernel.impl.api.index.IndexingServiceFactory; import org.neo4j.kernel.impl.api.index.IndexingServiceFactory;
import org.neo4j.kernel.impl.api.index.IndexingUpdateService; import org.neo4j.kernel.impl.api.index.IndexingUpdateService;
import org.neo4j.kernel.impl.api.index.PropertyPhysicalToLogicalConverter; import org.neo4j.kernel.impl.api.index.PropertyPhysicalToLogicalConverter;
import org.neo4j.kernel.impl.api.index.SchemaIndexProviderMap;
import org.neo4j.kernel.impl.api.scan.FullLabelStream; import org.neo4j.kernel.impl.api.scan.FullLabelStream;
import org.neo4j.kernel.impl.api.store.SchemaCache; import org.neo4j.kernel.impl.api.store.SchemaCache;
import org.neo4j.kernel.impl.api.store.StorageLayer; import org.neo4j.kernel.impl.api.store.StorageLayer;
Expand Down Expand Up @@ -89,7 +89,6 @@
import org.neo4j.kernel.impl.transaction.command.IndexUpdatesWork; import org.neo4j.kernel.impl.transaction.command.IndexUpdatesWork;
import org.neo4j.kernel.impl.transaction.command.LabelUpdateWork; import org.neo4j.kernel.impl.transaction.command.LabelUpdateWork;
import org.neo4j.kernel.impl.transaction.command.NeoStoreBatchTransactionApplier; import org.neo4j.kernel.impl.transaction.command.NeoStoreBatchTransactionApplier;
import org.neo4j.kernel.impl.transaction.state.DefaultSchemaIndexProviderMap;
import org.neo4j.kernel.impl.transaction.state.IntegrityValidator; import org.neo4j.kernel.impl.transaction.state.IntegrityValidator;
import org.neo4j.kernel.impl.transaction.state.Loaders; import org.neo4j.kernel.impl.transaction.state.Loaders;
import org.neo4j.kernel.impl.transaction.state.PropertyCreator; import org.neo4j.kernel.impl.transaction.state.PropertyCreator;
Expand Down Expand Up @@ -144,7 +143,7 @@ public class RecordStorageEngine implements StorageEngine, Lifecycle
private final IntegrityValidator integrityValidator; private final IntegrityValidator integrityValidator;
private final CacheAccessBackDoor cacheAccess; private final CacheAccessBackDoor cacheAccess;
private final LabelScanStore labelScanStore; private final LabelScanStore labelScanStore;
private final DefaultSchemaIndexProviderMap schemaIndexProviderMap; private final SchemaIndexProviderMap schemaIndexProviderMap;
private final LegacyIndexApplierLookup legacyIndexApplierLookup; private final LegacyIndexApplierLookup legacyIndexApplierLookup;
private final SchemaState schemaState; private final SchemaState schemaState;
private final SchemaStorage schemaStorage; private final SchemaStorage schemaStorage;
Expand Down Expand Up @@ -181,7 +180,7 @@ public RecordStorageEngine(
JobScheduler scheduler, JobScheduler scheduler,
TokenNameLookup tokenNameLookup, TokenNameLookup tokenNameLookup,
LockService lockService, LockService lockService,
SchemaIndexProvider indexProvider, SchemaIndexProviderMap indexProviderMap,
IndexingService.Monitor indexingServiceMonitor, IndexingService.Monitor indexingServiceMonitor,
DatabaseHealth databaseHealth, DatabaseHealth databaseHealth,
LegacyIndexProviderLookup legacyIndexProviderLookup, LegacyIndexProviderLookup legacyIndexProviderLookup,
Expand Down Expand Up @@ -220,7 +219,7 @@ public RecordStorageEngine(
readOnly, monitors, recoveryCleanupWorkCollector ); readOnly, monitors, recoveryCleanupWorkCollector );


indexStoreView = new DynamicIndexStoreView( neoStoreIndexStoreView, labelScanStore, lockService, neoStores, logProvider ); indexStoreView = new DynamicIndexStoreView( neoStoreIndexStoreView, labelScanStore, lockService, neoStores, logProvider );
schemaIndexProviderMap = new DefaultSchemaIndexProviderMap( indexProvider ); schemaIndexProviderMap = indexProviderMap;
indexingService = IndexingServiceFactory.createIndexingService( config, scheduler, schemaIndexProviderMap, indexingService = IndexingServiceFactory.createIndexingService( config, scheduler, schemaIndexProviderMap,
indexStoreView, tokenNameLookup, indexStoreView, tokenNameLookup,
Iterators.asList( new SchemaStorage( neoStores.getSchemaStore() ).indexesGetAll() ), logProvider, Iterators.asList( new SchemaStorage( neoStores.getSchemaStore() ).indexesGetAll() ), logProvider,
Expand Down
Expand Up @@ -24,8 +24,8 @@


import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.fs.FileSystemAbstraction;
import org.neo4j.io.pagecache.PageCache; import org.neo4j.io.pagecache.PageCache;
import org.neo4j.kernel.api.index.SchemaIndexProvider;
import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.api.index.SchemaIndexProviderMap;
import org.neo4j.kernel.impl.logging.LogService; import org.neo4j.kernel.impl.logging.LogService;
import org.neo4j.kernel.impl.store.format.RecordFormats; import org.neo4j.kernel.impl.store.format.RecordFormats;
import org.neo4j.kernel.impl.storemigration.monitoring.MigrationProgressMonitor; import org.neo4j.kernel.impl.storemigration.monitoring.MigrationProgressMonitor;
Expand All @@ -49,22 +49,22 @@ public class DatabaseMigrator
private final FileSystemAbstraction fs; private final FileSystemAbstraction fs;
private final Config config; private final Config config;
private final LogService logService; private final LogService logService;
private final SchemaIndexProvider schemaIndexProvider; private final SchemaIndexProviderMap schemaIndexProviderMap;
private final Map<String,IndexImplementation> indexProviders; private final Map<String,IndexImplementation> indexProviders;
private final PageCache pageCache; private final PageCache pageCache;
private final RecordFormats format; private final RecordFormats format;


public DatabaseMigrator( public DatabaseMigrator(
MigrationProgressMonitor progressMonitor, FileSystemAbstraction fs, MigrationProgressMonitor progressMonitor, FileSystemAbstraction fs,
Config config, LogService logService, SchemaIndexProvider schemaIndexProvider, Config config, LogService logService, SchemaIndexProviderMap schemaIndexProviderMap,
Map<String,IndexImplementation> indexProviders, PageCache pageCache, Map<String,IndexImplementation> indexProviders, PageCache pageCache,
RecordFormats format ) RecordFormats format )
{ {
this.progressMonitor = progressMonitor; this.progressMonitor = progressMonitor;
this.fs = fs; this.fs = fs;
this.config = config; this.config = config;
this.logService = logService; this.logService = logService;
this.schemaIndexProvider = schemaIndexProvider; this.schemaIndexProviderMap = schemaIndexProviderMap;
this.indexProviders = indexProviders; this.indexProviders = indexProviders;
this.pageCache = pageCache; this.pageCache = pageCache;
this.format = format; this.format = format;
Expand All @@ -84,13 +84,13 @@ public void migrate( File storeDir )
StoreUpgrader storeUpgrader = new StoreUpgrader( upgradableDatabase, progressMonitor, config, fs, pageCache, StoreUpgrader storeUpgrader = new StoreUpgrader( upgradableDatabase, progressMonitor, config, fs, pageCache,
logProvider ); logProvider );


StoreMigrationParticipant schemaMigrator = schemaIndexProvider.storeMigrationParticipant( fs, pageCache );
LegacyIndexMigrator legacyIndexMigrator = new LegacyIndexMigrator( fs, indexProviders, logProvider ); LegacyIndexMigrator legacyIndexMigrator = new LegacyIndexMigrator( fs, indexProviders, logProvider );
StoreMigrator storeMigrator = new StoreMigrator( fs, pageCache, config, logService ); StoreMigrator storeMigrator = new StoreMigrator( fs, pageCache, config, logService );
NativeLabelScanStoreMigrator nativeLabelScanStoreMigrator = new NativeLabelScanStoreMigrator( fs, pageCache ); NativeLabelScanStoreMigrator nativeLabelScanStoreMigrator = new NativeLabelScanStoreMigrator( fs, pageCache );
CountsMigrator countsMigrator = new CountsMigrator( fs, pageCache, config ); CountsMigrator countsMigrator = new CountsMigrator( fs, pageCache, config );


storeUpgrader.addParticipant( schemaMigrator ); schemaIndexProviderMap.accept(
provider -> storeUpgrader.addParticipant( provider.storeMigrationParticipant( fs, pageCache ) ) );
storeUpgrader.addParticipant( legacyIndexMigrator ); storeUpgrader.addParticipant( legacyIndexMigrator );
storeUpgrader.addParticipant( storeMigrator ); storeUpgrader.addParticipant( storeMigrator );
storeUpgrader.addParticipant( nativeLabelScanStoreMigrator ); storeUpgrader.addParticipant( nativeLabelScanStoreMigrator );
Expand Down
Expand Up @@ -19,34 +19,56 @@
*/ */
package org.neo4j.kernel.impl.transaction.state; package org.neo4j.kernel.impl.transaction.state;


import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;

import org.neo4j.kernel.api.index.SchemaIndexProvider; import org.neo4j.kernel.api.index.SchemaIndexProvider;
import org.neo4j.kernel.impl.api.index.SchemaIndexProviderMap; import org.neo4j.kernel.impl.api.index.SchemaIndexProviderMap;


public class DefaultSchemaIndexProviderMap implements SchemaIndexProviderMap public class DefaultSchemaIndexProviderMap implements SchemaIndexProviderMap
{ {
private final SchemaIndexProvider indexProvider; private final SchemaIndexProvider defaultIndexProvider;
private final Map<SchemaIndexProvider.Descriptor,SchemaIndexProvider> indexProviders = new HashMap<>();

public DefaultSchemaIndexProviderMap( SchemaIndexProvider defaultIndexProvider )
{
this( defaultIndexProvider, Collections.emptyList() );
}


public DefaultSchemaIndexProviderMap( SchemaIndexProvider indexProvider ) public DefaultSchemaIndexProviderMap( SchemaIndexProvider defaultIndexProvider,
Iterable<SchemaIndexProvider> additionalIndexProviders )
{ {
this.indexProvider = indexProvider; this.defaultIndexProvider = defaultIndexProvider;
indexProviders.put( defaultIndexProvider.getProviderDescriptor(), defaultIndexProvider );
additionalIndexProviders.forEach(
provider -> indexProviders.put( provider.getProviderDescriptor(), provider ) );
} }


@Override @Override
public SchemaIndexProvider getDefaultProvider() public SchemaIndexProvider getDefaultProvider()
{ {
return indexProvider; return defaultIndexProvider;
} }


@Override @Override
public SchemaIndexProvider apply( SchemaIndexProvider.Descriptor descriptor ) public SchemaIndexProvider apply( SchemaIndexProvider.Descriptor descriptor )
{ {
if ( indexProvider.getProviderDescriptor().getKey().equals( descriptor.getKey() ) ) SchemaIndexProvider provider = indexProviders.get( descriptor );
if ( provider != null )
{ {
return indexProvider; return provider;
} }


throw new IllegalArgumentException( "Tried to get index provider for an existing index with provider " + throw new IllegalArgumentException( "Tried to get index provider for an existing index with provider " +
descriptor + " whereas the default and only supported provider in this session is " + descriptor + " whereas available providers in this session being " + indexProviders +
indexProvider.getProviderDescriptor() ); ", and default being " + defaultIndexProvider );
}

@Override
public void accept( Consumer<SchemaIndexProvider> visitor )
{
indexProviders.values().forEach( visitor );
} }
} }
Expand Up @@ -51,7 +51,7 @@ protected void configure( GraphDatabaseFactory databaseFactory )
{ {
List<KernelExtensionFactory<?>> extensions; List<KernelExtensionFactory<?>> extensions;
extensions = Collections.singletonList( singleInstanceSchemaIndexProviderFactory( "test", provider ) ); extensions = Collections.singletonList( singleInstanceSchemaIndexProviderFactory( "test", provider ) );
((TestGraphDatabaseFactory) databaseFactory).addKernelExtensions( extensions ); ((TestGraphDatabaseFactory) databaseFactory).setKernelExtensions( extensions );
} }
}; };


Expand Down
Expand Up @@ -168,11 +168,12 @@ private Node createNode( Map<String, Object> properties, Label ... labels )
@Before @Before
public void before() throws Exception public void before() throws Exception
{ {
when( mockedIndexProvider.getProviderDescriptor() ).thenReturn( PROVIDER_DESCRIPTOR );
when( mockedIndexProvider.storeMigrationParticipant( any( FileSystemAbstraction.class ), any( PageCache.class ) ) ) when( mockedIndexProvider.storeMigrationParticipant( any( FileSystemAbstraction.class ), any( PageCache.class ) ) )
.thenReturn( StoreMigrationParticipant.NOT_PARTICIPATING ); .thenReturn( StoreMigrationParticipant.NOT_PARTICIPATING );
TestGraphDatabaseFactory factory = new TestGraphDatabaseFactory(); TestGraphDatabaseFactory factory = new TestGraphDatabaseFactory();
factory.setFileSystem( fs.get() ); factory.setFileSystem( fs.get() );
factory.addKernelExtensions( factory.setKernelExtensions(
Collections.singletonList( mockedIndexProviderFactory ) ); Collections.singletonList( mockedIndexProviderFactory ) );
db = (GraphDatabaseAPI) factory.newImpermanentDatabase(); db = (GraphDatabaseAPI) factory.newImpermanentDatabase();
ctxSupplier = db.getDependencyResolver().resolveDependency( ThreadToStatementContextBridge.class ); ctxSupplier = db.getDependencyResolver().resolveDependency( ThreadToStatementContextBridge.class );
Expand All @@ -184,7 +185,6 @@ private GatheringIndexWriter newWriter() throws IOException
when( mockedIndexProvider.getPopulator( when( mockedIndexProvider.getPopulator(
anyLong(), any( IndexDescriptor.class ), any( IndexSamplingConfig.class ) ) anyLong(), any( IndexDescriptor.class ), any( IndexSamplingConfig.class ) )
).thenReturn( writer ); ).thenReturn( writer );
when( mockedIndexProvider.getProviderDescriptor() ).thenReturn( PROVIDER_DESCRIPTOR );
when( mockedIndexProvider.getOnlineAccessor( when( mockedIndexProvider.getOnlineAccessor(
anyLong(), any( IndexDescriptor.class ), any( IndexSamplingConfig.class ) anyLong(), any( IndexDescriptor.class ), any( IndexSamplingConfig.class )
) ).thenReturn( writer ); ) ).thenReturn( writer );
Expand Down

0 comments on commit f2de192

Please sign in to comment.