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:
*
* - Instantiation.
- * - One or more calls to {@link #addPopulator(IndexPopulator, long, IndexDescriptor, Descriptor,
+ *
- One or more calls to {@link #addPopulator(IndexPopulator, long, IndexDescriptor, Descriptor, IndexCapability,
* FlippableIndexProxy, FailedIndexProxyFactory, String)}.
* - Call to {@link #create()} to create data structures and files to start accepting updates.
* - Call to {@link #indexAllNodes()} (blocking call).
@@ -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 )
{