diff --git a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/CapableIndexReference.java b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/CapableIndexReference.java new file mode 100644 index 0000000000000..c0f48172abdb3 --- /dev/null +++ b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/CapableIndexReference.java @@ -0,0 +1,41 @@ +package org.neo4j.internal.kernel.api; + +import org.neo4j.values.storable.ValueGroup; + +public interface CapableIndexReference extends IndexReference, IndexCapability +{ + CapableIndexReference NO_INDEX = new CapableIndexReference() + { + IndexReference noIndexReference = IndexReference.NO_INDEX; + + @Override + public IndexOrderCapability[] order( ValueGroup... valueGroups ) + { + return new IndexOrderCapability[0]; + } + + @Override + public IndexValueCapability value( ValueGroup... valueGroups ) + { + return IndexValueCapability.NO; + } + + @Override + public boolean isUnique() + { + return noIndexReference.isUnique(); + } + + @Override + public int label() + { + return noIndexReference.label(); + } + + @Override + public int[] properties() + { + return noIndexReference.properties(); + } + }; +} diff --git a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/IndexCapability.java b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/IndexCapability.java new file mode 100644 index 0000000000000..a479e9e7661e4 --- /dev/null +++ b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/IndexCapability.java @@ -0,0 +1,74 @@ +/* + * 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 . + */ +package org.neo4j.internal.kernel.api; + +import org.neo4j.values.storable.ValueGroup; + +/** + * Capabilities of an index. + * Capabilities of an index can not change during the indexes lifetimes. + * Caching of IndexCapability is allowed. + * It does NOT describe the capabilities of the index at some given moment. For example it does not describe + * index state. Rather it describe the functionality that index provide given that it is available. + */ +public interface IndexCapability +{ + /** + * What possible orderings is this index capable to provide for a query on given combination of {@link ValueGroup}. + * Ordering of ValueGroup correspond to ordering of related {@link IndexReference#properties()}. + * + * @param valueGroups Ordered array of {@link ValueGroup ValueGroups} for which index should be queried. Note that valueGroup + * must correspond to related {@link IndexReference#properties()}. A {@code null} value in the array + * ({@code new ValueGroup[]{null}}) is interpreted as a wildcard for any {@link ValueGroup}. Note that this is not the same as + * {@code order(null)} which is undefined. + * @return {@link IndexOrderCapability} array containing all possible orderings for provided value groups or empty array if no explicit + * ordering is possible or if length of {@code valueGroups} and {@link IndexReference#properties()} differ. + */ + IndexOrderCapability[] order( ValueGroup... valueGroups ); + + /** + * Is the index capable of providing values for a query on given combination of {@link ValueGroup}. + * Ordering of ValueGroup correspond to ordering of {@code properties} in related {@link IndexReference}. + * + * @param valueGroups Ordered array of {@link ValueGroup ValueGroups} for which index should be queried. Note that valueGroup + * must correspond to related {@link IndexReference#properties()}. A {@code null} value in the array + * ({@code new ValueGroup[]{null}}) is interpreted as a wildcard for any {@link ValueGroup}. Note that this is not the same as + * {@code order(null)} which is undefined. + * @return {@link IndexValueCapability#YES} if index is capable of providing values for query on provided array of value groups, + * {@link IndexValueCapability#NO} if not or {@link IndexValueCapability#MAYBE} for some results. If length of + * {@code valueGroups} and {@link IndexReference#properties()} differ {@link IndexValueCapability#NO} is returned. + */ + IndexValueCapability value( ValueGroup... valueGroups ); + + IndexCapability NO_CAPABILITY = new IndexCapability() + { + @Override + public IndexOrderCapability[] order( ValueGroup... valueGroups ) + { + return new IndexOrderCapability[0]; + } + + @Override + public IndexValueCapability value( ValueGroup... valueGroups ) + { + return IndexValueCapability.NO; + } + }; +} diff --git a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/IndexOrderCapability.java b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/IndexOrderCapability.java new file mode 100644 index 0000000000000..204593fd05e4a --- /dev/null +++ b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/IndexOrderCapability.java @@ -0,0 +1,25 @@ +/* + * 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 . + */ +package org.neo4j.internal.kernel.api; + +public enum IndexOrderCapability +{ + ASCENDING, DESCENDING +} diff --git a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/IndexValueCapability.java b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/IndexValueCapability.java new file mode 100644 index 0000000000000..16143a5b94d5d --- /dev/null +++ b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/IndexValueCapability.java @@ -0,0 +1,25 @@ +/* + * 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 . + */ +package org.neo4j.internal.kernel.api; + +public enum IndexValueCapability +{ + YES, NO, MAYBE +} diff --git a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/SchemaRead.java b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/SchemaRead.java index 12da69930dad3..314a0b4bde93d 100644 --- a/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/SchemaRead.java +++ b/community/kernel-api/src/main/java/org/neo4j/internal/kernel/api/SchemaRead.java @@ -31,5 +31,5 @@ public interface SchemaRead * @param properties the index properties * @return the IndexReference, or {@link IndexReference#NO_INDEX} if such an index does not exist. */ - IndexReference index( int label, int... properties ); + CapableIndexReference index( int label, int... properties ); } diff --git a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/NodeValueIndexCursorTestBase.java b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/NodeValueIndexCursorTestBase.java index c29f96a1c6228..64ffef51fc82d 100644 --- a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/NodeValueIndexCursorTestBase.java +++ b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/NodeValueIndexCursorTestBase.java @@ -300,9 +300,9 @@ public void shouldGetNoIndex() throws Exception int badLabel = token.nodeLabel( "BAD_LABEL" ); int badProp = token.propertyKey( "badProp" ); - assertEquals( "bad label", IndexReference.NO_INDEX, schemaRead.index( badLabel, prop ) ); - assertEquals( "bad prop", IndexReference.NO_INDEX, schemaRead.index( label, badProp ) ); - assertEquals( "just bad", IndexReference.NO_INDEX, schemaRead.index( badLabel, badProp ) ); + assertEquals( "bad label", CapableIndexReference.NO_INDEX, schemaRead.index( badLabel, prop ) ); + assertEquals( "bad prop", CapableIndexReference.NO_INDEX, schemaRead.index( label, badProp ) ); + assertEquals( "just bad", CapableIndexReference.NO_INDEX, schemaRead.index( badLabel, badProp ) ); } private long nodeWithProp( GraphDatabaseService graphDb, Object value ) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/api/index/SchemaIndexProvider.java b/community/kernel/src/main/java/org/neo4j/kernel/api/index/SchemaIndexProvider.java index 95c8fe6815992..2e15ff003c4f2 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/api/index/SchemaIndexProvider.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/api/index/SchemaIndexProvider.java @@ -25,6 +25,7 @@ import org.neo4j.graphdb.ResourceIterator; import org.neo4j.helpers.collection.Iterators; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.api.schema.index.IndexDescriptor; @@ -141,6 +142,12 @@ public InternalIndexState getInitialState( long indexId, IndexDescriptor descrip return InternalIndexState.POPULATING; } + @Override + public IndexCapability getCapability( IndexDescriptor indexDescriptor ) + { + return IndexCapability.NO_CAPABILITY; + } + @Override public StoreMigrationParticipant storeMigrationParticipant( FileSystemAbstraction fs, PageCache pageCache ) @@ -208,6 +215,13 @@ public abstract IndexAccessor getOnlineAccessor( long indexId, IndexDescriptor d */ public abstract InternalIndexState getInitialState( long indexId, IndexDescriptor descriptor ); + /** + * Return {@link IndexCapability} for this index provider for a given {@link IndexDescriptor}. + * + * @param indexDescriptor {@link IndexDescriptor} to get IndexCapability for. + */ + public abstract IndexCapability getCapability( IndexDescriptor indexDescriptor ); + /** * @return a description of this index provider */ diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/AbstractDelegatingIndexProxy.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/AbstractDelegatingIndexProxy.java index 48488ed168dbc..84ea458e3b737 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/AbstractDelegatingIndexProxy.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/AbstractDelegatingIndexProxy.java @@ -24,6 +24,7 @@ import java.util.concurrent.Future; import org.neo4j.graphdb.ResourceIterator; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.kernel.api.exceptions.index.IndexActivationFailedKernelException; import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException; @@ -66,6 +67,12 @@ public InternalIndexState getState() return getDelegate().getState(); } + @Override + public IndexCapability getIndexCapability() + { + return getDelegate().getIndexCapability(); + } + @Override public IndexDescriptor getDescriptor() { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/AbstractSwallowingIndexProxy.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/AbstractSwallowingIndexProxy.java index a4caa235d2656..94cbe0626680f 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/AbstractSwallowingIndexProxy.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/AbstractSwallowingIndexProxy.java @@ -21,6 +21,7 @@ import java.util.concurrent.Future; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.kernel.api.index.IndexUpdater; import org.neo4j.kernel.api.index.SchemaIndexProvider; import org.neo4j.kernel.api.schema.LabelSchemaDescriptor; @@ -34,14 +35,18 @@ public abstract class AbstractSwallowingIndexProxy implements IndexProxy { private final IndexDescriptor descriptor; + private final IndexCapability indexCapability; private final SchemaIndexProvider.Descriptor providerDescriptor; private final IndexPopulationFailure populationFailure; - public AbstractSwallowingIndexProxy( IndexDescriptor descriptor, - SchemaIndexProvider.Descriptor providerDescriptor, IndexPopulationFailure populationFailure ) + AbstractSwallowingIndexProxy( IndexDescriptor descriptor, + SchemaIndexProvider.Descriptor providerDescriptor, + IndexCapability indexCapability, + IndexPopulationFailure populationFailure ) { this.descriptor = descriptor; this.providerDescriptor = providerDescriptor; + this.indexCapability = indexCapability; this.populationFailure = populationFailure; } @@ -75,6 +80,12 @@ public void force() { } + @Override + public IndexCapability getIndexCapability() + { + return indexCapability; + } + @Override public IndexDescriptor getDescriptor() { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/FailedIndexProxy.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/FailedIndexProxy.java index 04298befd4ebf..01221bec7c664 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/FailedIndexProxy.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/FailedIndexProxy.java @@ -24,6 +24,7 @@ import java.util.concurrent.Future; import org.neo4j.graphdb.ResourceIterator; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.kernel.api.exceptions.index.IndexPopulationFailedKernelException; import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.InternalIndexState; @@ -42,15 +43,16 @@ public class FailedIndexProxy extends AbstractSwallowingIndexProxy private final IndexCountsRemover indexCountsRemover; private final Log log; - public FailedIndexProxy( IndexDescriptor descriptor, - SchemaIndexProvider.Descriptor providerDescriptor, - String indexUserDescription, - IndexPopulator populator, - IndexPopulationFailure populationFailure, - IndexCountsRemover indexCountsRemover, - LogProvider logProvider ) + FailedIndexProxy( IndexDescriptor descriptor, + SchemaIndexProvider.Descriptor providerDescriptor, + IndexCapability indexCapability, + String indexUserDescription, + IndexPopulator populator, + IndexPopulationFailure populationFailure, + IndexCountsRemover indexCountsRemover, + LogProvider logProvider ) { - super( descriptor, providerDescriptor, populationFailure ); + super( descriptor, providerDescriptor, indexCapability, populationFailure ); this.populator = populator; this.indexUserDescription = indexUserDescription; this.indexCountsRemover = indexCountsRemover; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/FailedPopulatingIndexProxyFactory.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/FailedPopulatingIndexProxyFactory.java index adefc07b034b4..669d89dcedf9b 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/FailedPopulatingIndexProxyFactory.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/FailedPopulatingIndexProxyFactory.java @@ -19,6 +19,7 @@ */ package org.neo4j.kernel.impl.api.index; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.SchemaIndexProvider; import org.neo4j.kernel.api.schema.index.IndexDescriptor; @@ -30,6 +31,7 @@ public class FailedPopulatingIndexProxyFactory implements FailedIndexProxyFactor { private final IndexDescriptor descriptor; private final SchemaIndexProvider.Descriptor providerDescriptor; + private final IndexCapability indexCapability; private final IndexPopulator populator; private final String indexUserDescription; private final IndexCountsRemover indexCountsRemover; @@ -37,6 +39,7 @@ public class FailedPopulatingIndexProxyFactory implements FailedIndexProxyFactor FailedPopulatingIndexProxyFactory( IndexDescriptor descriptor, SchemaIndexProvider.Descriptor providerDescriptor, + IndexCapability indexCapability, IndexPopulator populator, String indexUserDescription, IndexCountsRemover indexCountsRemover, @@ -44,6 +47,7 @@ public class FailedPopulatingIndexProxyFactory implements FailedIndexProxyFactor { this.descriptor = descriptor; this.providerDescriptor = providerDescriptor; + this.indexCapability = indexCapability; this.populator = populator; this.indexUserDescription = indexUserDescription; this.indexCountsRemover = indexCountsRemover; @@ -53,9 +57,7 @@ public class FailedPopulatingIndexProxyFactory implements FailedIndexProxyFactor @Override public IndexProxy create( Throwable failure ) { - return - new FailedIndexProxy( - descriptor, providerDescriptor, - indexUserDescription, populator, failure( failure ), indexCountsRemover, logProvider ); + return new FailedIndexProxy( descriptor, providerDescriptor, indexCapability, indexUserDescription, populator, failure( failure ), + indexCountsRemover, logProvider ); } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/FlippableIndexProxy.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/FlippableIndexProxy.java index 9aa6f26707099..5e2f2c84bd529 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/FlippableIndexProxy.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/FlippableIndexProxy.java @@ -28,6 +28,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import org.neo4j.graphdb.ResourceIterator; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.kernel.api.exceptions.index.ExceptionDuringFlipKernelException; import org.neo4j.kernel.api.exceptions.index.FlipFailedKernelException; import org.neo4j.kernel.api.exceptions.index.IndexActivationFailedKernelException; @@ -254,6 +255,20 @@ public InternalIndexState getState() } } + @Override + public IndexCapability getIndexCapability() + { + lock.readLock().lock(); + try + { + return delegate.getIndexCapability(); + } + finally + { + lock.readLock().unlock(); + } + } + @Override public Future close() throws IOException { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexPopulationJob.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexPopulationJob.java index ca12561859152..f1a31f8178f0b 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexPopulationJob.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexPopulationJob.java @@ -23,6 +23,7 @@ import java.util.concurrent.Future; import org.neo4j.function.Suppliers; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.kernel.api.exceptions.index.IndexPopulationFailedKernelException; import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.index.IndexPopulator; @@ -37,8 +38,8 @@ /** * A background job for initially populating one or more index over existing data in the database. * Use provided store view to scan store. Participating {@link IndexPopulator} are added with - * {@link #addPopulator(IndexPopulator, long, IndexDescriptor, org.neo4j.kernel.api.index.SchemaIndexProvider.Descriptor, - * String, FlippableIndexProxy, FailedIndexProxyFactory)} + * {@link #addPopulator(IndexPopulator, long, IndexDescriptor, SchemaIndexProvider.Descriptor, IndexCapability, String, + * FlippableIndexProxy, FailedIndexProxyFactory)} * before {@link #run() running} this job. */ public class IndexPopulationJob implements Runnable @@ -65,21 +66,23 @@ public IndexPopulationJob( MultipleIndexPopulator multiPopulator, IndexingServic * @param populator {@link IndexPopulator} to participate. * @param descriptor {@link IndexDescriptor} describing the index. * @param providerDescriptor provider of this index. + * @param indexCapability capability of this index. * @param indexUserDescription user description of this index. * @param flipper {@link FlippableIndexProxy} to call after a successful population. * @param failedIndexProxyFactory {@link FailedIndexProxyFactory} to use after an unsuccessful population. */ - public void addPopulator( IndexPopulator populator, + void addPopulator( IndexPopulator populator, long indexId, IndexDescriptor descriptor, SchemaIndexProvider.Descriptor providerDescriptor, - String indexUserDescription , + IndexCapability indexCapability, + String indexUserDescription, FlippableIndexProxy flipper, FailedIndexProxyFactory failedIndexProxyFactory ) { assert storeScan == null : "Population have already started, too late to add populators at this point"; - this.multiPopulator.addPopulator( populator, indexId, descriptor, providerDescriptor, flipper, - failedIndexProxyFactory, indexUserDescription ); + this.multiPopulator.addPopulator( populator, indexId, descriptor, providerDescriptor, indexCapability, + flipper, failedIndexProxyFactory, indexUserDescription ); } /** @@ -134,7 +137,7 @@ private void indexAllNodes() throws IndexPopulationFailedKernelException storeScan.run(); } - public PopulationProgress getPopulationProgress() + PopulationProgress getPopulationProgress() { if ( storeScan == null ) { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexProxy.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexProxy.java index 53c368ac957ad..cb9aebca83547 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexProxy.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexProxy.java @@ -24,6 +24,7 @@ import java.util.concurrent.Future; import org.neo4j.graphdb.ResourceIterator; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.kernel.api.exceptions.index.IndexActivationFailedKernelException; import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException; @@ -87,6 +88,8 @@ public interface IndexProxy extends LabelSchemaSupplier InternalIndexState getState(); + IndexCapability getIndexCapability(); + /** * @return failure message. Expect a call to it if {@link #getState()} returns {@link InternalIndexState#FAILED}. */ diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexProxyCreator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexProxyCreator.java index 2ec0630e7e2d2..18ec8888a7494 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexProxyCreator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexProxyCreator.java @@ -21,6 +21,7 @@ import java.io.IOException; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.internal.kernel.api.TokenNameLookup; import org.neo4j.kernel.api.index.IndexAccessor; import org.neo4j.kernel.api.index.IndexPopulator; @@ -34,7 +35,7 @@ /** * Helper class of {@link IndexingService}. Used mainly as factory of index proxies. */ -public class IndexProxyCreator +class IndexProxyCreator { private final IndexSamplingConfig samplingConfig; private final IndexStoreView storeView; @@ -42,11 +43,11 @@ public class IndexProxyCreator private final TokenNameLookup tokenNameLookup; private final LogProvider logProvider; - public IndexProxyCreator( IndexSamplingConfig samplingConfig, - IndexStoreView storeView, - SchemaIndexProviderMap providerMap, - TokenNameLookup tokenNameLookup, - LogProvider logProvider ) + IndexProxyCreator( IndexSamplingConfig samplingConfig, + IndexStoreView storeView, + SchemaIndexProviderMap providerMap, + TokenNameLookup tokenNameLookup, + LogProvider logProvider ) { this.samplingConfig = samplingConfig; this.storeView = storeView; @@ -55,33 +56,34 @@ public IndexProxyCreator( IndexSamplingConfig samplingConfig, this.logProvider = logProvider; } - public IndexProxy createPopulatingIndexProxy( final long ruleId, - final IndexDescriptor descriptor, - final SchemaIndexProvider.Descriptor providerDescriptor, - final boolean flipToTentative, - final IndexingService.Monitor monitor, - final IndexPopulationJob populationJob ) throws IOException + IndexProxy createPopulatingIndexProxy( final long ruleId, + final IndexDescriptor descriptor, + final SchemaIndexProvider.Descriptor providerDescriptor, + final boolean flipToTentative, + final IndexingService.Monitor monitor, + final IndexPopulationJob populationJob ) throws IOException { final FlippableIndexProxy flipper = new FlippableIndexProxy(); // TODO: This is here because there is a circular dependency from PopulatingIndexProxy to FlippableIndexProxy final String indexUserDescription = indexUserDescription( descriptor, providerDescriptor ); IndexPopulator populator = populatorFromProvider( providerDescriptor, ruleId, descriptor, samplingConfig ); + IndexCapability indexCapability = indexCapabilityFromProvider( providerDescriptor, descriptor ); FailedIndexProxyFactory failureDelegateFactory = new FailedPopulatingIndexProxyFactory( descriptor, providerDescriptor, + indexCapability, populator, indexUserDescription, new IndexCountsRemover( storeView, ruleId ), - logProvider - ); + logProvider ); PopulatingIndexProxy populatingIndex = - new PopulatingIndexProxy( descriptor, providerDescriptor, populationJob ); + new PopulatingIndexProxy( descriptor, providerDescriptor, indexCapability, populationJob ); - populationJob.addPopulator( populator, ruleId, descriptor, providerDescriptor, indexUserDescription, - flipper, failureDelegateFactory ); + populationJob.addPopulator( populator, ruleId, descriptor, providerDescriptor, indexCapability, + indexUserDescription, flipper, failureDelegateFactory ); flipper.flipTo( populatingIndex ); @@ -93,9 +95,11 @@ public IndexProxy createPopulatingIndexProxy( final long ruleId, new OnlineIndexProxy( ruleId, descriptor, + providerDescriptor, + indexCapabilityFromProvider( providerDescriptor, descriptor ), onlineAccessorFromProvider( providerDescriptor, ruleId, descriptor, samplingConfig ), storeView, - providerDescriptor, true ); + true ); if ( flipToTentative ) { return new TentativeConstraintIndexProxy( flipper, onlineProxy ); @@ -106,24 +110,26 @@ public IndexProxy createPopulatingIndexProxy( final long ruleId, return new ContractCheckingIndexProxy( flipper, false ); } - public IndexProxy createRecoveringIndexProxy( IndexDescriptor descriptor, - SchemaIndexProvider.Descriptor providerDescriptor ) + IndexProxy createRecoveringIndexProxy( IndexDescriptor descriptor, + SchemaIndexProvider.Descriptor providerDescriptor ) { - IndexProxy proxy = new RecoveringIndexProxy( descriptor, providerDescriptor ); + IndexCapability indexCapability = indexCapabilityFromProvider( providerDescriptor, descriptor ); + IndexProxy proxy = new RecoveringIndexProxy( descriptor, providerDescriptor, indexCapability ); return new ContractCheckingIndexProxy( proxy, true ); } - public IndexProxy createOnlineIndexProxy( long ruleId, - IndexDescriptor descriptor, - SchemaIndexProvider.Descriptor providerDescriptor ) + IndexProxy createOnlineIndexProxy( long ruleId, + IndexDescriptor descriptor, + SchemaIndexProvider.Descriptor providerDescriptor ) { // TODO Hook in version verification/migration calls to the SchemaIndexProvider here try { IndexAccessor onlineAccessor = onlineAccessorFromProvider( providerDescriptor, ruleId, descriptor, samplingConfig ); + IndexCapability indexCapability = indexCapabilityFromProvider( providerDescriptor, descriptor ); IndexProxy proxy; - proxy = new OnlineIndexProxy( ruleId, descriptor, onlineAccessor, storeView, providerDescriptor, false ); + proxy = new OnlineIndexProxy( ruleId, descriptor, providerDescriptor, indexCapability, onlineAccessor, storeView, false ); proxy = new ContractCheckingIndexProxy( proxy, true ); return proxy; } @@ -136,24 +142,23 @@ public IndexProxy createOnlineIndexProxy( long ruleId, } } - public IndexProxy createFailedIndexProxy( long ruleId, - IndexDescriptor descriptor, - SchemaIndexProvider.Descriptor providerDescriptor, - IndexPopulationFailure populationFailure ) + IndexProxy createFailedIndexProxy( long ruleId, + IndexDescriptor descriptor, + SchemaIndexProvider.Descriptor providerDescriptor, + IndexPopulationFailure populationFailure ) { - IndexPopulator indexPopulator = - populatorFromProvider( providerDescriptor, ruleId, descriptor, samplingConfig ); + IndexPopulator indexPopulator = populatorFromProvider( providerDescriptor, ruleId, descriptor, samplingConfig ); + IndexCapability indexCapability = indexCapabilityFromProvider( providerDescriptor, descriptor ); String indexUserDescription = indexUserDescription( descriptor, providerDescriptor ); IndexProxy proxy; proxy = new FailedIndexProxy( descriptor, - providerDescriptor, + providerDescriptor, indexCapability, indexUserDescription, indexPopulator, populationFailure, new IndexCountsRemover( storeView, ruleId ), - logProvider - ); + logProvider ); proxy = new ContractCheckingIndexProxy( proxy, true ); return proxy; } @@ -179,4 +184,10 @@ private IndexAccessor onlineAccessorFromProvider( SchemaIndexProvider.Descriptor SchemaIndexProvider indexProvider = providerMap.apply( providerDescriptor ); return indexProvider.getOnlineAccessor( ruleId, descriptor, samplingConfig ); } + + private IndexCapability indexCapabilityFromProvider( SchemaIndexProvider.Descriptor providerDescriptor, + IndexDescriptor indexDescriptor ) + { + return providerMap.apply( providerDescriptor ).getCapability( indexDescriptor ); + } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/MultipleIndexPopulator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/MultipleIndexPopulator.java index 505bba0d27158..3ef6b30c0f57c 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/MultipleIndexPopulator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/MultipleIndexPopulator.java @@ -35,6 +35,7 @@ import org.neo4j.function.ThrowingConsumer; import org.neo4j.helpers.collection.Pair; import org.neo4j.helpers.collection.Visitor; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.kernel.api.exceptions.index.FlipFailedKernelException; import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; import org.neo4j.kernel.api.exceptions.index.IndexPopulationFailedKernelException; @@ -75,7 +76,7 @@ * Usage of this class should be something like: *
    *
  1. Instantiation.
  2. - *
  3. One or more calls to {@link #addPopulator(IndexPopulator, long, IndexDescriptor, Descriptor, + *
  4. One or more calls to {@link #addPopulator(IndexPopulator, long, IndexDescriptor, Descriptor, IndexCapability, * FlippableIndexProxy, FailedIndexProxyFactory, String)}.
  5. *
  6. Call to {@link #create()} to create data structures and files to start accepting updates.
  7. *
  8. Call to {@link #indexAllNodes()} (blocking call).
  9. @@ -112,30 +113,31 @@ public MultipleIndexPopulator( IndexStoreView storeView, LogProvider logProvider this.log = logProvider.getLog( IndexPopulationJob.class ); } - public IndexPopulation addPopulator( + IndexPopulation addPopulator( IndexPopulator populator, long indexId, IndexDescriptor descriptor, Descriptor providerDescriptor, + IndexCapability indexCapability, FlippableIndexProxy flipper, FailedIndexProxyFactory failedIndexProxyFactory, String indexUserDescription ) { - IndexPopulation population = createPopulation( populator, indexId, descriptor, providerDescriptor, flipper, - failedIndexProxyFactory, indexUserDescription ); + IndexPopulation population = createPopulation( populator, indexId, descriptor, providerDescriptor, indexCapability, + flipper, failedIndexProxyFactory, indexUserDescription ); populations.add( population ); return population; } protected IndexPopulation createPopulation( IndexPopulator populator, long indexId, IndexDescriptor descriptor, - Descriptor providerDescriptor, FlippableIndexProxy flipper, + Descriptor providerDescriptor, IndexCapability indexCapability, FlippableIndexProxy flipper, FailedIndexProxyFactory failedIndexProxyFactory, String indexUserDescription ) { - return new IndexPopulation( populator, indexId, descriptor, providerDescriptor, flipper, failedIndexProxyFactory, - indexUserDescription ); + return new IndexPopulation( populator, indexId, descriptor, providerDescriptor, indexCapability, flipper, + failedIndexProxyFactory, indexUserDescription ); } - public boolean hasPopulators() + boolean hasPopulators() { return !populations.isEmpty(); } @@ -297,7 +299,7 @@ public void replaceIndexCounts( long uniqueElements, long maxUniqueElements, lon storeView.replaceIndexCounts( population.indexId, uniqueElements, maxUniqueElements, indexSize ) ); } - public void flipAfterPopulation() + void flipAfterPopulation() { for ( IndexPopulation population : populations ) { @@ -352,7 +354,7 @@ protected void populateFromQueue( long currentlyIndexedNodeId ) populateFromQueueIfAvailable( currentlyIndexedNodeId ); } - protected void flushAll() + void flushAll() { populations.forEach( this::flush ); } @@ -472,6 +474,7 @@ public class IndexPopulation implements LabelSchemaSupplier final IndexDescriptor descriptor; final SchemaIndexProvider.Descriptor providerDescriptor; final IndexCountsRemover indexCountsRemover; + private final IndexCapability indexCapability; final FlippableIndexProxy flipper; final FailedIndexProxyFactory failedIndexProxyFactory; final String indexUserDescription; @@ -483,6 +486,7 @@ public class IndexPopulation implements LabelSchemaSupplier long indexId, IndexDescriptor descriptor, Descriptor providerDescriptor, + IndexCapability indexCapability, FlippableIndexProxy flipper, FailedIndexProxyFactory failedIndexProxyFactory, String indexUserDescription ) @@ -491,6 +495,7 @@ public class IndexPopulation implements LabelSchemaSupplier this.indexId = indexId; this.descriptor = descriptor; this.providerDescriptor = providerDescriptor; + this.indexCapability = indexCapability; this.flipper = flipper; this.failedIndexProxyFactory = failedIndexProxyFactory; this.indexUserDescription = indexUserDescription; @@ -500,9 +505,8 @@ public class IndexPopulation implements LabelSchemaSupplier private void flipToFailed( Throwable t ) { - flipper.flipTo( new FailedIndexProxy( descriptor, - providerDescriptor, indexUserDescription, - populator, failure( t ), indexCountsRemover, logProvider ) ); + flipper.flipTo( new FailedIndexProxy( descriptor, providerDescriptor, indexCapability, + indexUserDescription, populator, failure( t ), indexCountsRemover, logProvider ) ); } private void onUpdate( IndexEntryUpdate update ) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/OnlineIndexProxy.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/OnlineIndexProxy.java index c5ea92be89491..4a5fa85893604 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/OnlineIndexProxy.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/OnlineIndexProxy.java @@ -24,6 +24,7 @@ import java.util.concurrent.Future; import org.neo4j.graphdb.ResourceIterator; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; import org.neo4j.kernel.api.exceptions.index.IndexPopulationFailedKernelException; import org.neo4j.kernel.api.index.IndexAccessor; @@ -46,6 +47,7 @@ public class OnlineIndexProxy implements IndexProxy final IndexAccessor accessor; private final IndexStoreView storeView; private final SchemaIndexProvider.Descriptor providerDescriptor; + private final IndexCapability indexCapability; private final IndexCountsRemover indexCountsRemover; private boolean started; @@ -75,15 +77,20 @@ public class OnlineIndexProxy implements IndexProxy // slightly more costly, but shouldn't make that big of a difference hopefully. private final boolean forcedIdempotentMode; - public OnlineIndexProxy( long indexId, IndexDescriptor descriptor, - IndexAccessor accessor, IndexStoreView storeView, SchemaIndexProvider.Descriptor providerDescriptor, + OnlineIndexProxy( long indexId, + IndexDescriptor descriptor, + SchemaIndexProvider.Descriptor providerDescriptor, + IndexCapability indexCapability, + IndexAccessor accessor, + IndexStoreView storeView, boolean forcedIdempotentMode ) { this.indexId = indexId; this.descriptor = descriptor; + this.accessor = accessor; this.storeView = storeView; this.providerDescriptor = providerDescriptor; - this.accessor = accessor; + this.indexCapability = indexCapability; this.forcedIdempotentMode = forcedIdempotentMode; this.indexCountsRemover = new IndexCountsRemover( storeView, indexId ); } @@ -138,6 +145,12 @@ public InternalIndexState getState() return InternalIndexState.ONLINE; } + @Override + public IndexCapability getIndexCapability() + { + return indexCapability; + } + @Override public void force() throws IOException { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/PopulatingIndexProxy.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/PopulatingIndexProxy.java index 04323f8ff8fff..e0fc06cf9cc92 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/PopulatingIndexProxy.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/PopulatingIndexProxy.java @@ -24,6 +24,7 @@ import java.util.concurrent.Future; import org.neo4j.graphdb.ResourceIterator; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.kernel.api.exceptions.index.IndexActivationFailedKernelException; import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException; @@ -42,15 +43,18 @@ public class PopulatingIndexProxy implements IndexProxy { private final IndexDescriptor descriptor; + private final IndexCapability indexCapability; private final SchemaIndexProvider.Descriptor providerDescriptor; private final IndexPopulationJob job; - public PopulatingIndexProxy( IndexDescriptor descriptor, - SchemaIndexProvider.Descriptor providerDescriptor, - IndexPopulationJob job ) + PopulatingIndexProxy( IndexDescriptor descriptor, + SchemaIndexProvider.Descriptor providerDescriptor, + IndexCapability indexCapability, + IndexPopulationJob job ) { this.descriptor = descriptor; this.providerDescriptor = providerDescriptor; + this.indexCapability = indexCapability; this.job = job; } @@ -116,6 +120,12 @@ public InternalIndexState getState() return InternalIndexState.POPULATING; } + @Override + public IndexCapability getIndexCapability() + { + return indexCapability; + } + @Override public void force() { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/RecoveringIndexProxy.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/RecoveringIndexProxy.java index b9bec43628c1b..1ea1837836c1c 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/RecoveringIndexProxy.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/RecoveringIndexProxy.java @@ -23,6 +23,7 @@ import java.util.concurrent.Future; import org.neo4j.graphdb.ResourceIterator; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.kernel.api.exceptions.index.IndexPopulationFailedKernelException; import org.neo4j.kernel.api.index.InternalIndexState; import org.neo4j.kernel.api.index.SchemaIndexProvider; @@ -33,9 +34,11 @@ public class RecoveringIndexProxy extends AbstractSwallowingIndexProxy { - public RecoveringIndexProxy( IndexDescriptor descriptor, SchemaIndexProvider.Descriptor providerDescriptor ) + RecoveringIndexProxy( IndexDescriptor descriptor, + SchemaIndexProvider.Descriptor providerDescriptor, + IndexCapability indexCapability ) { - super( descriptor, providerDescriptor, null ); + super( descriptor, providerDescriptor, indexCapability, null ); } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/store/StorageLayer.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/store/StorageLayer.java index 01fce1c41e7fd..68ef998fcf0c9 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/store/StorageLayer.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/store/StorageLayer.java @@ -30,6 +30,7 @@ import org.neo4j.cursor.Cursor; import org.neo4j.graphdb.TransactionFailureException; import org.neo4j.helpers.collection.Iterators; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.kernel.api.AssertOpen; import org.neo4j.kernel.api.ReadOperations; import org.neo4j.kernel.api.exceptions.EntityNotFoundException; @@ -240,6 +241,12 @@ public SchemaIndexProvider.Descriptor indexGetProviderDescriptor( IndexDescripto return indexService.getIndexProxy( descriptor.schema() ).getProviderDescriptor(); } + @Override + public IndexCapability indexGetCapability( IndexDescriptor descriptor ) throws IndexNotFoundKernelException + { + return indexService.getIndexProxy( descriptor.schema() ).getIndexCapability(); + } + @Override public PopulationProgress indexGetPopulationProgress( LabelSchemaDescriptor descriptor ) throws IndexNotFoundKernelException diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexProvider.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexProvider.java index bec76d04fa996..fc2ae97e533ba 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexProvider.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexProvider.java @@ -25,6 +25,7 @@ import org.neo4j.index.internal.gbptree.GBPTree; import org.neo4j.index.internal.gbptree.Layout; import org.neo4j.index.internal.gbptree.RecoveryCleanupWorkCollector; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.api.index.IndexAccessor; @@ -163,6 +164,12 @@ public InternalIndexState getInitialState( long indexId, IndexDescriptor descrip } } + @Override + public IndexCapability getCapability( IndexDescriptor indexDescriptor ) + { + return IndexCapability.NO_CAPABILITY; + } + @Override public StoreMigrationParticipant storeMigrationParticipant( FileSystemAbstraction fs, PageCache pageCache ) { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/FusionSchemaIndexProvider.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/FusionSchemaIndexProvider.java index fa4e6562905b4..8b34d1e1b6571 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/FusionSchemaIndexProvider.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/FusionSchemaIndexProvider.java @@ -21,6 +21,7 @@ import java.io.IOException; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.api.index.IndexAccessor; @@ -30,6 +31,7 @@ import org.neo4j.kernel.api.index.SchemaIndexProvider; import org.neo4j.kernel.api.schema.index.IndexDescriptor; import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingConfig; +import org.neo4j.kernel.impl.newapi.UnionIndexCapability; import org.neo4j.kernel.impl.storemigration.StoreMigrationParticipant; import org.neo4j.storageengine.api.schema.IndexSample; import org.neo4j.values.storable.Value; @@ -125,6 +127,14 @@ public InternalIndexState getInitialState( long indexId, IndexDescriptor descrip return nativeState; } + @Override + public IndexCapability getCapability( IndexDescriptor indexDescriptor ) + { + IndexCapability nativeCapability = nativeProvider.getCapability( indexDescriptor ); + IndexCapability luceneCapability = luceneProvider.getCapability( indexDescriptor ); + return new UnionIndexCapability( nativeCapability, luceneCapability ); + } + @Override public StoreMigrationParticipant storeMigrationParticipant( FileSystemAbstraction fs, PageCache pageCache ) { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/AllStoreHolder.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/AllStoreHolder.java index b200080bec3b8..4ad453dd3710a 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/AllStoreHolder.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/AllStoreHolder.java @@ -25,7 +25,8 @@ import org.neo4j.function.Suppliers; import org.neo4j.function.Suppliers.Lazy; -import org.neo4j.internal.kernel.api.IndexReference; +import org.neo4j.internal.kernel.api.CapableIndexReference; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.internal.kernel.api.Token; import org.neo4j.internal.kernel.api.exceptions.KernelException; import org.neo4j.io.pagecache.PageCursor; @@ -140,10 +141,22 @@ ExplicitIndex explicitRelationshipIndex( String indexName ) } @Override - public IndexReference index( int label, int... properties ) + public CapableIndexReference index( int label, int... properties ) { - IndexDescriptor desc = read.indexGetForSchema( new LabelSchemaDescriptor( label, properties ) ); - return desc == null ? IndexReference.NO_INDEX : desc; + IndexDescriptor indexDescriptor = read.indexGetForSchema( new LabelSchemaDescriptor( label, properties ) ); + if ( indexDescriptor == null ) + { + return CapableIndexReference.NO_INDEX; + } + try + { + IndexCapability indexCapability = read.indexGetCapability( indexDescriptor ); + return new IndexReference( indexDescriptor.type() == IndexDescriptor.Type.UNIQUE, indexCapability, label, properties ); + } + catch ( IndexNotFoundKernelException e ) + { + throw new IllegalStateException( e ); + } } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/IndexReference.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/IndexReference.java new file mode 100644 index 0000000000000..76f9be2275160 --- /dev/null +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/IndexReference.java @@ -0,0 +1,71 @@ +/* + * 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 . + */ +package org.neo4j.kernel.impl.newapi; + +import org.neo4j.internal.kernel.api.IndexCapability; +import org.neo4j.internal.kernel.api.IndexOrderCapability; +import org.neo4j.internal.kernel.api.IndexValueCapability; +import org.neo4j.values.storable.ValueGroup; + +class IndexReference implements org.neo4j.internal.kernel.api.CapableIndexReference +{ + private final int label; + private final int[] properties; + private final boolean unique; + private final IndexCapability capability; + + IndexReference( boolean unique, IndexCapability indexCapability, int label, int... properties ) + { + this.unique = unique; + this.capability = indexCapability; + this.label = label; + this.properties = properties; + } + + @Override + public boolean isUnique() + { + return unique; + } + + @Override + public int label() + { + return label; + } + + @Override + public int[] properties() + { + return properties; + } + + @Override + public IndexOrderCapability[] order( ValueGroup... valueGroups ) + { + return capability.order( valueGroups ); + } + + @Override + public IndexValueCapability value( ValueGroup... valueGroups ) + { + return capability.value( valueGroups ); + } +} diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Read.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Read.java index 7d9e7b32471cf..22ecec756af59 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Read.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/Read.java @@ -22,8 +22,8 @@ import java.util.Arrays; import org.neo4j.collection.primitive.PrimitiveLongIterator; +import org.neo4j.internal.kernel.api.CapableIndexReference; import org.neo4j.internal.kernel.api.IndexQuery; -import org.neo4j.internal.kernel.api.IndexReference; import org.neo4j.internal.kernel.api.NodeExplicitIndexCursor; import org.neo4j.internal.kernel.api.RelationshipExplicitIndexCursor; import org.neo4j.internal.kernel.api.Scan; @@ -377,7 +377,7 @@ public final void futureRelationshipPropertyReferenceRead( long reference ) abstract ExplicitIndex explicitRelationshipIndex( String indexName ); @Override - public abstract IndexReference index( int label, int... properties ); + public abstract CapableIndexReference index( int label, int... properties ); abstract PageCursor nodePage( long reference ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/UnionIndexCapability.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/UnionIndexCapability.java new file mode 100644 index 0000000000000..42260c423807c --- /dev/null +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/UnionIndexCapability.java @@ -0,0 +1,66 @@ +/* + * 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 . + */ +package org.neo4j.kernel.impl.newapi; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +import org.neo4j.internal.kernel.api.IndexCapability; +import org.neo4j.internal.kernel.api.IndexOrder; +import org.neo4j.values.storable.ValueGroup; + +/** + * Present the union of multiple index capabilities. + * If one of the internal capabilities has a capability, the union has the capability. + */ +public class UnionIndexCapability implements IndexCapability +{ + private final IndexCapability[] capabilities; + + public UnionIndexCapability( IndexCapability... capabilities ) + { + this.capabilities = capabilities; + } + + @Override + public IndexOrder[] order( ValueGroup... valueGroups ) + { + Set orderCapability = new HashSet<>(); + for ( IndexCapability capability : capabilities ) + { + Arrays.stream( capability.order( valueGroups ) ).forEach( orderCapability::add ); + } + return orderCapability.toArray( new IndexOrder[orderCapability.size()] ); + } + + @Override + public boolean value( ValueGroup... valueGroups ) + { + for ( IndexCapability capability : capabilities ) + { + if ( capability.value( valueGroups ) ) + { + return true; + } + } + return false; + } +} diff --git a/community/kernel/src/main/java/org/neo4j/storageengine/api/StoreReadLayer.java b/community/kernel/src/main/java/org/neo4j/storageengine/api/StoreReadLayer.java index 7612da328dd3e..bc043f2ce5b90 100644 --- a/community/kernel/src/main/java/org/neo4j/storageengine/api/StoreReadLayer.java +++ b/community/kernel/src/main/java/org/neo4j/storageengine/api/StoreReadLayer.java @@ -27,6 +27,7 @@ import org.neo4j.collection.primitive.PrimitiveIntSet; import org.neo4j.collection.primitive.PrimitiveLongIterator; import org.neo4j.cursor.Cursor; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.kernel.api.AssertOpen; import org.neo4j.kernel.api.exceptions.EntityNotFoundException; import org.neo4j.kernel.api.exceptions.LabelNotFoundKernelException; @@ -157,6 +158,15 @@ long indexGetCommittedId( IndexDescriptor index ) */ SchemaIndexProvider.Descriptor indexGetProviderDescriptor( IndexDescriptor descriptor ) throws IndexNotFoundKernelException; + /** + * Return capability of stored index. + * + * @param descriptor {@link LabelSchemaDescriptor} to get capability for. + * @return {@link IndexCapability} for index. + * @throws IndexNotFoundKernelException if index not found. + */ + IndexCapability indexGetCapability( IndexDescriptor descriptor ) throws IndexNotFoundKernelException; + /** * @param descriptor {@link LabelSchemaDescriptor} to get population progress for. * @return progress of index population, which is the initial state of an index when it's created. diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/BatchingMultipleIndexPopulatorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/BatchingMultipleIndexPopulatorTest.java index 723f574193901..276c0a79825b8 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/BatchingMultipleIndexPopulatorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/BatchingMultipleIndexPopulatorTest.java @@ -58,6 +58,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.neo4j.internal.kernel.api.IndexCapability.NO_CAPABILITY; import static org.neo4j.kernel.api.index.IndexQueryHelper.add; import static org.neo4j.kernel.impl.api.index.BatchingMultipleIndexPopulator.AWAIT_TIMEOUT_MINUTES_NAME; import static org.neo4j.kernel.impl.api.index.BatchingMultipleIndexPopulator.BATCH_SIZE_NAME; @@ -349,7 +350,7 @@ private static IndexPopulator addPopulator( BatchingMultipleIndexPopulator batch batchingPopulator.addPopulator( populator, descriptor.schema().getLabelId(), descriptor, - new SchemaIndexProvider.Descriptor( "foo", "1" ), + new SchemaIndexProvider.Descriptor( "foo", "1" ), NO_CAPABILITY, flipper, failedIndexProxyFactory, "testIndex" ); return populator; diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/ControlledPopulationSchemaIndexProvider.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/ControlledPopulationSchemaIndexProvider.java index f3d5ddd3926a8..3430146986897 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/ControlledPopulationSchemaIndexProvider.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/ControlledPopulationSchemaIndexProvider.java @@ -23,6 +23,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicInteger; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.api.index.IndexAccessor; @@ -109,6 +110,12 @@ public InternalIndexState getInitialState( long indexId, IndexDescriptor descrip return initialIndexState; } + @Override + public IndexCapability getCapability( IndexDescriptor indexDescriptor ) + { + return IndexCapability.NO_CAPABILITY; + } + public void setInitialIndexState( InternalIndexState initialIndexState ) { this.initialIndexState = initialIndexState; diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/FailedIndexProxyTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/FailedIndexProxyTest.java index 22fb2d742fc79..e095eafe8057e 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/FailedIndexProxyTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/FailedIndexProxyTest.java @@ -23,6 +23,7 @@ import java.io.IOException; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.SchemaIndexProvider; import org.neo4j.kernel.api.schema.index.IndexDescriptorFactory; @@ -37,6 +38,7 @@ public class FailedIndexProxyTest { private final SchemaIndexProvider.Descriptor providerDescriptor = mock( SchemaIndexProvider.Descriptor.class ); + private final IndexCapability indexCapability = mock( IndexCapability.class ); private final String userDescription = "description"; private final IndexPopulator indexPopulator = mock( IndexPopulator.class ); private final IndexPopulationFailure indexPopulationFailure = mock( IndexPopulationFailure.class ); @@ -47,8 +49,8 @@ public void shouldRemoveIndexCountsWhenTheIndexItselfIsDropped() throws IOExcept { // given FailedIndexProxy index = new FailedIndexProxy( - IndexDescriptorFactory.forLabel( 1, 2 ), providerDescriptor, userDescription, - indexPopulator, indexPopulationFailure, indexCountsRemover, NullLogProvider.getInstance() ); + IndexDescriptorFactory.forLabel( 1, 2 ), providerDescriptor, indexCapability, + userDescription, indexPopulator, indexPopulationFailure, indexCountsRemover, NullLogProvider.getInstance() ); // when index.drop(); @@ -66,10 +68,9 @@ public void shouldLogReasonForDroppingIndex() throws IOException AssertableLogProvider logProvider = new AssertableLogProvider(); // when - new FailedIndexProxy( IndexDescriptorFactory.forLabel( 0, 0 ), - new SchemaIndexProvider.Descriptor( "foo", "bar" ), "foo", - mock( IndexPopulator.class ), IndexPopulationFailure.failure( "it broke" ), indexCountsRemover, - logProvider ).drop(); + new FailedIndexProxy( IndexDescriptorFactory.forLabel( 0, 0 ), new SchemaIndexProvider.Descriptor( "foo", "bar" ), indexCapability, + "foo", mock( IndexPopulator.class ), IndexPopulationFailure.failure( "it broke" ), + indexCountsRemover, logProvider ).drop(); // then logProvider.assertAtLeastOnce( diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexPopulationJobTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexPopulationJobTest.java index 6cf4a9b9b9090..9c6d6787d176c 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexPopulationJobTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexPopulationJobTest.java @@ -96,6 +96,7 @@ import static org.neo4j.helpers.collection.Iterators.asSet; import static org.neo4j.helpers.collection.MapUtil.genericMap; import static org.neo4j.helpers.collection.MapUtil.map; +import static org.neo4j.internal.kernel.api.IndexCapability.NO_CAPABILITY; import static org.neo4j.kernel.api.index.IndexEntryUpdate.add; import static org.neo4j.kernel.api.security.SecurityContext.AUTH_DISABLED; import static org.neo4j.kernel.impl.api.index.IndexingService.NO_MONITOR; @@ -617,7 +618,7 @@ private IndexPopulationJob newIndexPopulationJob( FailedIndexProxyFactory failur MultipleIndexPopulator multiPopulator = new MultipleIndexPopulator( storeView, logProvider ); IndexPopulationJob job = new IndexPopulationJob( multiPopulator, NO_MONITOR, stateHolder ); - job.addPopulator( populator, indexId, descriptor, PROVIDER_DESCRIPTOR, + job.addPopulator( populator, indexId, descriptor, PROVIDER_DESCRIPTOR, NO_CAPABILITY, format( ":%s(%s)", FIRST.name(), name ), flipper, failureDelegateFactory ); return job; } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexProxyAdapter.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexProxyAdapter.java index 823568459c11f..46d9cc98d3468 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexProxyAdapter.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexProxyAdapter.java @@ -23,6 +23,7 @@ import java.util.concurrent.Future; import org.neo4j.graphdb.ResourceIterator; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.kernel.api.index.IndexUpdater; import org.neo4j.kernel.api.index.InternalIndexState; import org.neo4j.kernel.api.index.SchemaIndexProvider; @@ -60,6 +61,12 @@ public InternalIndexState getState() throw new UnsupportedOperationException(); } + @Override + public IndexCapability getIndexCapability() + { + return null; + } + @Override public void force() { diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/MultipleIndexPopulatorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/MultipleIndexPopulatorTest.java index af01e8720a83e..ddcc46f24797f 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/MultipleIndexPopulatorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/MultipleIndexPopulatorTest.java @@ -61,6 +61,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; +import static org.neo4j.internal.kernel.api.IndexCapability.NO_CAPABILITY; import static org.neo4j.kernel.api.index.IndexQueryHelper.add; @RunWith( MockitoJUnitRunner.class ) @@ -432,8 +433,8 @@ private IndexPopulation addPopulator( MultipleIndexPopulator multipleIndexPopula FlippableIndexProxy flippableIndexProxy, FailedIndexProxyFactory failedIndexProxyFactory ) { return multipleIndexPopulator.addPopulator( indexPopulator, indexId, descriptor, - mock( SchemaIndexProvider.Descriptor.class ), flippableIndexProxy, - failedIndexProxyFactory, "userIndexDescription" ); + mock( SchemaIndexProvider.Descriptor.class ), NO_CAPABILITY, + flippableIndexProxy, failedIndexProxyFactory, "userIndexDescription" ); } private IndexPopulation addPopulator( IndexPopulator indexPopulator, int id ) diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/MultipleIndexPopulatorUpdatesTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/MultipleIndexPopulatorUpdatesTest.java index ac1fc30f9e5f8..6c5a121b4de66 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/MultipleIndexPopulatorUpdatesTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/MultipleIndexPopulatorUpdatesTest.java @@ -58,6 +58,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.when; +import static org.neo4j.internal.kernel.api.IndexCapability.NO_CAPABILITY; @RunWith( MockitoJUnitRunner.class ) public class MultipleIndexPopulatorUpdatesTest @@ -125,7 +126,7 @@ private MultipleIndexPopulator.IndexPopulation addPopulator( MultipleIndexPopula FlippableIndexProxy flippableIndexProxy, FailedIndexProxyFactory failedIndexProxyFactory ) { return multipleIndexPopulator.addPopulator( indexPopulator, indexId, descriptor, - mock( SchemaIndexProvider.Descriptor.class ), + mock( SchemaIndexProvider.Descriptor.class ), NO_CAPABILITY, flippableIndexProxy, failedIndexProxyFactory, "userIndexDescription" ); } @@ -167,7 +168,7 @@ public StoreScan visitNodes( int[] labelIds boolean forceStoreScan ) { - return new ListenableNodeScanViewNodeStoreScan( nodeStore, locks, propertyStore, labelUpdateVisitor, + return new ListenableNodeScanViewNodeStoreScan<>( nodeStore, locks, propertyStore, labelUpdateVisitor, propertyUpdatesVisitor, labelIds, propertyKeyIdFilter, processListener ); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/OnlineIndexProxyTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/OnlineIndexProxyTest.java index aac97998834fe..421bc55218967 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/OnlineIndexProxyTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/OnlineIndexProxyTest.java @@ -31,6 +31,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.neo4j.internal.kernel.api.IndexCapability.NO_CAPABILITY; public class OnlineIndexProxyTest { @@ -44,8 +45,8 @@ public class OnlineIndexProxyTest public void shouldRemoveIndexCountsWhenTheIndexItselfIsDropped() throws IOException { // given - OnlineIndexProxy index = new OnlineIndexProxy( indexId, descriptor, accessor, - storeView, providerDescriptor, false ); + OnlineIndexProxy index = new OnlineIndexProxy( indexId, descriptor, providerDescriptor, NO_CAPABILITY, accessor, + storeView, false ); // when index.drop(); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/inmemory/InMemoryIndexProvider.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/inmemory/InMemoryIndexProvider.java index adb16e338fdac..b1afb5c5327e3 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/inmemory/InMemoryIndexProvider.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/inmemory/InMemoryIndexProvider.java @@ -21,6 +21,7 @@ import java.util.Map; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.api.index.IndexAccessor; @@ -62,6 +63,12 @@ public InternalIndexState getInitialState( long indexId, IndexDescriptor descrip return index != null ? index.getState() : InternalIndexState.POPULATING; } + @Override + public IndexCapability getCapability( IndexDescriptor indexDescriptor ) + { + return IndexCapability.NO_CAPABILITY; + } + @Override public StoreMigrationParticipant storeMigrationParticipant( FileSystemAbstraction fs, PageCache pageCache ) { diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/inmemory/UpdateCapturingIndexProvider.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/inmemory/UpdateCapturingIndexProvider.java index 3135325cd50e2..f06a4da4e6ac6 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/inmemory/UpdateCapturingIndexProvider.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/inmemory/UpdateCapturingIndexProvider.java @@ -25,6 +25,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.api.index.IndexAccessor; @@ -75,6 +76,12 @@ public InternalIndexState getInitialState( long indexId, IndexDescriptor descrip return actual.getInitialState( indexId, descriptor ); } + @Override + public IndexCapability getCapability( IndexDescriptor indexDescriptor ) + { + return actual.getCapability( indexDescriptor ); + } + @Override public StoreMigrationParticipant storeMigrationParticipant( FileSystemAbstraction fs, PageCache pageCache ) { diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/MockStore.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/MockStore.java index 3332f8ece4704..1cc7a422949ec 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/MockStore.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/MockStore.java @@ -25,6 +25,7 @@ import org.neo4j.collection.primitive.Primitive; import org.neo4j.collection.primitive.PrimitiveLongObjectMap; +import org.neo4j.internal.kernel.api.CapableIndexReference; import org.neo4j.io.pagecache.PageCursor; import org.neo4j.kernel.api.ExplicitIndex; import org.neo4j.kernel.api.schema.index.IndexDescriptor; @@ -342,7 +343,7 @@ ArrayValue array( PropertyCursor cursor, long reference, PageCursor page ) } @Override - public IndexDescriptor index( int label, int... properties ) + public CapableIndexReference index( int label, int... properties ) { throw new UnsupportedOperationException( "not implemented" ); } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/storeview/LabelScanViewNodeStoreScanTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/storeview/LabelScanViewNodeStoreScanTest.java index 2f46cba185e53..53aa35dc66c4b 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/storeview/LabelScanViewNodeStoreScanTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/storeview/LabelScanViewNodeStoreScanTest.java @@ -30,6 +30,7 @@ import org.neo4j.collection.primitive.PrimitiveLongIterator; import org.neo4j.collection.primitive.PrimitiveLongResourceIterator; import org.neo4j.helpers.collection.Visitor; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.SchemaIndexProvider; import org.neo4j.kernel.api.labelscan.LabelScanStore; @@ -49,6 +50,7 @@ import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.neo4j.internal.kernel.api.IndexCapability.NO_CAPABILITY; public class LabelScanViewNodeStoreScanTest { @@ -86,7 +88,7 @@ public void iterateOverLabeledNodeIds() throws Exception private MultipleIndexPopulator.IndexPopulation getPopulation( LabelScanTestMultipleIndexPopulator indexPopulator ) { - return indexPopulator.createPopulation( mock( IndexPopulator.class ), 1, null, null, null, null, null ); + return indexPopulator.createPopulation( mock( IndexPopulator.class ), 1, null, null, NO_CAPABILITY, null, null, null ); } private LabelScanViewNodeStoreScan getLabelScanViewStoreScan( int[] labelIds ) @@ -105,10 +107,10 @@ private class LabelScanTestMultipleIndexPopulator extends MultipleIndexPopulator @Override public IndexPopulation createPopulation( IndexPopulator populator, long indexId, IndexDescriptor descriptor, SchemaIndexProvider.Descriptor providerDescriptor, - FlippableIndexProxy flipper, FailedIndexProxyFactory failedIndexProxyFactory, + IndexCapability indexCapability, FlippableIndexProxy flipper, FailedIndexProxyFactory failedIndexProxyFactory, String indexUserDescription ) { - return super.createPopulation( populator, indexId, descriptor, providerDescriptor, flipper, + return super.createPopulation( populator, indexId, descriptor, providerDescriptor, indexCapability, flipper, failedIndexProxyFactory, indexUserDescription ); } } diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/LuceneSchemaIndexProvider.java b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/LuceneSchemaIndexProvider.java index 1f88051ac4647..fbfeed9f742f0 100644 --- a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/LuceneSchemaIndexProvider.java +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/LuceneSchemaIndexProvider.java @@ -23,6 +23,7 @@ import java.io.IOException; import org.neo4j.graphdb.factory.GraphDatabaseSettings; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.api.impl.index.IndexWriterConfigs; @@ -142,6 +143,12 @@ public InternalIndexState getInitialState( long indexId, IndexDescriptor descrip } } + @Override + public IndexCapability getCapability( IndexDescriptor indexDescriptor ) + { + return IndexCapability.NO_CAPABILITY; + } + @Override public StoreMigrationParticipant storeMigrationParticipant( final FileSystemAbstraction fs, PageCache pageCache ) { diff --git a/enterprise/ha/src/test/java/org/neo4j/kernel/api/SchemaIndexHaIT.java b/enterprise/ha/src/test/java/org/neo4j/kernel/api/SchemaIndexHaIT.java index 35504549f5b39..6c73b313e3546 100644 --- a/enterprise/ha/src/test/java/org/neo4j/kernel/api/SchemaIndexHaIT.java +++ b/enterprise/ha/src/test/java/org/neo4j/kernel/api/SchemaIndexHaIT.java @@ -46,6 +46,7 @@ import org.neo4j.graphdb.schema.Schema.IndexState; import org.neo4j.helpers.collection.Iterables; import org.neo4j.index.internal.gbptree.RecoveryCleanupWorkCollector; +import org.neo4j.internal.kernel.api.IndexCapability; import org.neo4j.io.fs.DefaultFileSystemAbstraction; import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.pagecache.PageCache; @@ -520,6 +521,12 @@ public InternalIndexState getInitialState( long indexId, IndexDescriptor descrip return delegate.getInitialState( indexId, descriptor ); } + @Override + public IndexCapability getCapability( IndexDescriptor indexDescriptor ) + { + return delegate.getCapability( indexDescriptor ); + } + @Override public StoreMigrationParticipant storeMigrationParticipant( FileSystemAbstraction fs, PageCache pageCache ) {