From a2a903f35d52f478e4081b198ebe5813debdbe97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Finn=C3=A9?= Date: Tue, 6 Nov 2018 11:54:53 +0100 Subject: [PATCH] Consults property store for distinguishing distinct spatial values --- .../java/org/neo4j/kernel/RecoveryIT.java | 2 +- .../kernel/impl/api/index/IndexCRUDIT.java | 2 +- .../neo4j/kernel/impl/api/index/IndexIT.java | 2 +- .../api/index/IndexPopulationJobTest.java | 2 +- ...IndexPopulationMissConcurrentUpdateIT.java | 2 +- .../batchinsert/internal/BatchInsertTest.java | 2 +- .../checking/full/PropertyReader.java | 2 +- .../impl/fulltext/FulltextIndexAccessor.java | 2 +- .../impl/fulltext/FulltextIndexPopulator.java | 2 +- .../impl/fulltext/FulltextIndexReader.java | 3 +- .../api}/NodePropertyAccessor.java | 5 +- .../storageengine/api/schema/IndexReader.java | 6 +- .../api/NodeValueIndexCursorTestBase.java | 78 ++++++++++++++++ .../kernel/api/helpers/StubNodeCursor.java | 4 + .../org/neo4j/kernel/NeoStoreDataSource.java | 2 +- .../neo4j/kernel/api/index/IndexAccessor.java | 1 + .../kernel/api/index/IndexPopulator.java | 1 + .../neo4j/kernel/impl/api/LookupFilter.java | 2 +- .../index/AbstractDelegatingIndexProxy.java | 2 +- .../impl/api/index/FlippableIndexProxy.java | 2 +- .../kernel/impl/api/index/IndexProxy.java | 2 +- .../kernel/impl/api/index/IndexStoreView.java | 2 +- .../impl/api/index/IndexingService.java | 2 +- .../api/index/MultipleIndexPopulator.java | 2 +- .../impl/api/index/OnlineIndexProxy.java | 2 +- .../kernel/impl/api/index/PropertyLoader.java | 2 +- .../index/TentativeConstraintIndexProxy.java | 2 +- .../api/state/ConstraintIndexCreator.java | 2 +- .../NativeDistinctValuesProgressor.java | 8 +- .../index/schema/NativeIndexAccessor.java | 2 +- .../index/schema/NativeIndexPopulator.java | 2 +- .../impl/index/schema/NativeIndexReader.java | 7 +- .../schema/ParallelNativeIndexPopulator.java | 2 +- .../PropertyLookupFallbackComparator.java | 67 ++++++++++++++ .../index/schema/SpatialIndexAccessor.java | 2 +- .../index/schema/SpatialIndexPartReader.java | 44 +++++++++ .../schema/SpatialIndexPopulatingUpdater.java | 2 +- .../index/schema/SpatialIndexPopulator.java | 2 +- .../impl/index/schema/SpatialIndexReader.java | 5 +- .../SpatialVerifyDeferredConstraint.java | 2 +- .../index/schema/TemporalIndexAccessor.java | 2 +- .../TemporalIndexPopulatingUpdater.java | 2 +- .../index/schema/TemporalIndexPopulator.java | 2 +- .../index/schema/TemporalIndexReader.java | 5 +- .../WorkSyncedNativeIndexPopulator.java | 2 +- .../schema/fusion/FusionIndexAccessor.java | 2 +- .../schema/fusion/FusionIndexPopulator.java | 2 +- .../schema/fusion/FusionIndexReader.java | 5 +- .../impl/newapi/CursorPropertyAccessor.java | 73 +++++++++++++++ .../org/neo4j/kernel/impl/newapi/Read.java | 5 +- .../api/index/TestNodePropertyAccessor.java | 1 + .../ConstraintIndexCreatorTest.java | 2 +- .../impl/api/index/IndexPopulationTest.java | 2 +- .../api/index/MultipleIndexPopulatorTest.java | 2 +- ...lingGenericNativeIndexProviderFactory.java | 2 +- .../schema/IndexPopulationStressTest.java | 2 +- .../NativeDistinctValuesProgressorTest.java | 2 +- .../schema/NativeIndexPopulatorTests.java | 2 +- .../ParallelNativeIndexPopulatorTest.java | 2 +- .../newapi/CursorPropertyAccessorTest.java | 91 +++++++++++++++++++ .../impl/newapi/OperationsLockTest.java | 6 +- ...woPhaseNodeForRelationshipLockingTest.java | 6 +- .../api/schema/DefaultIndexReaderTest.java | 3 +- .../QueryResultComparingIndexReader.java | 5 +- .../index/AbstractLuceneIndexAccessor.java | 2 +- .../api/impl/schema/LuceneIndexAccessor.java | 2 +- .../api/impl/schema/LuceneSchemaIndex.java | 2 +- .../schema/ReadOnlyDatabaseSchemaIndex.java | 2 +- .../kernel/api/impl/schema/SchemaIndex.java | 2 +- .../schema/WritableDatabaseSchemaIndex.java | 2 +- .../NonUniqueLuceneIndexPopulator.java | 2 +- .../UniqueLuceneIndexPopulatingUpdater.java | 2 +- .../populator/UniqueLuceneIndexPopulator.java | 2 +- .../schema/reader/PartitionedIndexReader.java | 5 +- .../impl/schema/reader/SimpleIndexReader.java | 4 +- .../CompositeDuplicateCheckingCollector.java | 2 +- .../DuplicateCheckingCollector.java | 2 +- .../PartitionedUniquenessVerifier.java | 2 +- .../SimpleUniquenessVerifier.java | 2 +- .../verification/UniquenessVerifier.java | 2 +- ...neSchemaIndexUniquenessVerificationIT.java | 2 +- .../api/impl/index/TestPropertyAccessor.java | 2 +- .../PartitionedUniquenessVerifierTest.java | 2 +- .../SimpleUniquenessVerifierTest.java | 2 +- .../LuceneSchemaIndexPopulatorTest.java | 2 +- ...queDatabaseIndexPopulatingUpdaterTest.java | 2 +- .../UniqueDatabaseIndexPopulatorTest.java | 2 +- .../SimpleIndexReaderDistinctValuesTest.java | 11 ++- 88 files changed, 479 insertions(+), 96 deletions(-) rename community/{kernel/src/main/java/org/neo4j/kernel/api/index => kernel-api/src/main/java/org/neo4j/storageengine/api}/NodePropertyAccessor.java (89%) create mode 100644 community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/PropertyLookupFallbackComparator.java create mode 100644 community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/CursorPropertyAccessor.java create mode 100644 community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/CursorPropertyAccessorTest.java diff --git a/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/RecoveryIT.java b/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/RecoveryIT.java index 2ce7bc303c060..b3832b44785ef 100644 --- a/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/RecoveryIT.java +++ b/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/RecoveryIT.java @@ -72,7 +72,7 @@ import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.extension.KernelExtensionFactory; import org.neo4j.kernel.impl.api.index.IndexUpdateMode; diff --git a/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/impl/api/index/IndexCRUDIT.java b/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/impl/api/index/IndexCRUDIT.java index 6e396a1a1216d..462bb144feff6 100644 --- a/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/impl/api/index/IndexCRUDIT.java +++ b/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/impl/api/index/IndexCRUDIT.java @@ -46,7 +46,7 @@ import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.api.schema.SchemaDescriptorFactory; import org.neo4j.kernel.extension.KernelExtensionFactory; import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingConfig; diff --git a/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/impl/api/index/IndexIT.java b/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/impl/api/index/IndexIT.java index df730db856405..6893c4c4c3f22 100644 --- a/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/impl/api/index/IndexIT.java +++ b/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/impl/api/index/IndexIT.java @@ -44,7 +44,7 @@ import org.neo4j.internal.kernel.api.exceptions.schema.SchemaKernelException; import org.neo4j.internal.kernel.api.schema.LabelSchemaDescriptor; import org.neo4j.internal.kernel.api.schema.SchemaDescriptor; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.api.schema.MultiTokenSchemaDescriptor; import org.neo4j.kernel.api.schema.SchemaDescriptorFactory; import org.neo4j.kernel.api.schema.constraints.IndexBackedConstraintDescriptor; diff --git a/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/impl/api/index/IndexPopulationJobTest.java b/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/impl/api/index/IndexPopulationJobTest.java index 41196a56c58e8..7edd8c3982215 100644 --- a/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/impl/api/index/IndexPopulationJobTest.java +++ b/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/impl/api/index/IndexPopulationJobTest.java @@ -52,7 +52,7 @@ import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.api.labelscan.NodeLabelUpdate; import org.neo4j.kernel.api.schema.SchemaDescriptorFactory; import org.neo4j.kernel.configuration.Config; diff --git a/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/impl/api/index/IndexPopulationMissConcurrentUpdateIT.java b/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/impl/api/index/IndexPopulationMissConcurrentUpdateIT.java index 5662c852105ae..f5794680bb32f 100644 --- a/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/impl/api/index/IndexPopulationMissConcurrentUpdateIT.java +++ b/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/impl/api/index/IndexPopulationMissConcurrentUpdateIT.java @@ -46,7 +46,7 @@ import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.configuration.Settings; import org.neo4j.kernel.extension.ExtensionType; import org.neo4j.kernel.extension.KernelExtensionFactory; diff --git a/community/community-it/kernel-it/src/test/java/org/neo4j/unsafe/batchinsert/internal/BatchInsertTest.java b/community/community-it/kernel-it/src/test/java/org/neo4j/unsafe/batchinsert/internal/BatchInsertTest.java index f7ac8ac5f85e0..1cc0ee6270938 100644 --- a/community/community-it/kernel-it/src/test/java/org/neo4j/unsafe/batchinsert/internal/BatchInsertTest.java +++ b/community/community-it/kernel-it/src/test/java/org/neo4j/unsafe/batchinsert/internal/BatchInsertTest.java @@ -64,7 +64,7 @@ import org.neo4j.kernel.api.index.IndexAccessor; import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexProvider; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.api.labelscan.LabelScanStore; import org.neo4j.kernel.api.schema.index.TestIndexDescriptorFactory; import org.neo4j.kernel.extension.KernelExtensionFactory; diff --git a/community/consistency-check/src/main/java/org/neo4j/consistency/checking/full/PropertyReader.java b/community/consistency-check/src/main/java/org/neo4j/consistency/checking/full/PropertyReader.java index 08c67ea6f63c0..626e7657ebc56 100644 --- a/community/consistency-check/src/main/java/org/neo4j/consistency/checking/full/PropertyReader.java +++ b/community/consistency-check/src/main/java/org/neo4j/consistency/checking/full/PropertyReader.java @@ -27,7 +27,7 @@ import java.util.List; import org.neo4j.helpers.collection.Visitor; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.store.NodeStore; import org.neo4j.kernel.impl.store.PropertyStore; import org.neo4j.kernel.impl.store.StoreAccess; diff --git a/community/fulltext-index/src/main/java/org/neo4j/kernel/api/impl/fulltext/FulltextIndexAccessor.java b/community/fulltext-index/src/main/java/org/neo4j/kernel/api/impl/fulltext/FulltextIndexAccessor.java index 9eb32aa681d09..863ba7f725499 100644 --- a/community/fulltext-index/src/main/java/org/neo4j/kernel/api/impl/fulltext/FulltextIndexAccessor.java +++ b/community/fulltext-index/src/main/java/org/neo4j/kernel/api/impl/fulltext/FulltextIndexAccessor.java @@ -27,7 +27,7 @@ import org.neo4j.helpers.collection.BoundedIterable; import org.neo4j.kernel.api.impl.index.AbstractLuceneIndexAccessor; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.api.index.IndexUpdateMode; import org.neo4j.values.storable.Value; diff --git a/community/fulltext-index/src/main/java/org/neo4j/kernel/api/impl/fulltext/FulltextIndexPopulator.java b/community/fulltext-index/src/main/java/org/neo4j/kernel/api/impl/fulltext/FulltextIndexPopulator.java index 0638e279c1b59..96090561a536a 100644 --- a/community/fulltext-index/src/main/java/org/neo4j/kernel/api/impl/fulltext/FulltextIndexPopulator.java +++ b/community/fulltext-index/src/main/java/org/neo4j/kernel/api/impl/fulltext/FulltextIndexPopulator.java @@ -30,7 +30,7 @@ import org.neo4j.kernel.api.impl.schema.populator.LuceneIndexPopulator; import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.storageengine.api.schema.IndexSample; public class FulltextIndexPopulator extends LuceneIndexPopulator> diff --git a/community/fulltext-index/src/main/java/org/neo4j/kernel/api/impl/fulltext/FulltextIndexReader.java b/community/fulltext-index/src/main/java/org/neo4j/kernel/api/impl/fulltext/FulltextIndexReader.java index 99511c1535ff9..aba55ea089284 100644 --- a/community/fulltext-index/src/main/java/org/neo4j/kernel/api/impl/fulltext/FulltextIndexReader.java +++ b/community/fulltext-index/src/main/java/org/neo4j/kernel/api/impl/fulltext/FulltextIndexReader.java @@ -25,6 +25,7 @@ import org.neo4j.internal.kernel.api.IndexOrder; import org.neo4j.internal.kernel.api.IndexQuery; import org.neo4j.internal.kernel.api.exceptions.schema.IndexNotApplicableKernelException; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.storageengine.api.schema.IndexProgressor; import org.neo4j.storageengine.api.schema.IndexReader; import org.neo4j.storageengine.api.schema.IndexSampler; @@ -59,7 +60,7 @@ public void query( IndexProgressor.NodeValueClient client, IndexOrder indexOrder } @Override - public void distinctValues( IndexProgressor.NodeValueClient client ) + public void distinctValues( IndexProgressor.NodeValueClient client, NodePropertyAccessor propertyAccessor ) { throw new UnsupportedOperationException( "Fulltext indexes does not support distinctValues queries" ); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/api/index/NodePropertyAccessor.java b/community/kernel-api/src/main/java/org/neo4j/storageengine/api/NodePropertyAccessor.java similarity index 89% rename from community/kernel/src/main/java/org/neo4j/kernel/api/index/NodePropertyAccessor.java rename to community/kernel-api/src/main/java/org/neo4j/storageengine/api/NodePropertyAccessor.java index 235adf972c03e..5b000725383ae 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/api/index/NodePropertyAccessor.java +++ b/community/kernel-api/src/main/java/org/neo4j/storageengine/api/NodePropertyAccessor.java @@ -17,14 +17,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.neo4j.kernel.api.index; +package org.neo4j.storageengine.api; import org.neo4j.internal.kernel.api.exceptions.EntityNotFoundException; import org.neo4j.values.storable.Value; -/** - * Used by the {@link IndexPopulator} for verifying constraints, if need be. - */ public interface NodePropertyAccessor { Value getNodePropertyValue( long nodeId, int propertyKeyId ) throws EntityNotFoundException; diff --git a/community/kernel-api/src/main/java/org/neo4j/storageengine/api/schema/IndexReader.java b/community/kernel-api/src/main/java/org/neo4j/storageengine/api/schema/IndexReader.java index d5505cf49486d..0893bd4070ac8 100644 --- a/community/kernel-api/src/main/java/org/neo4j/storageengine/api/schema/IndexReader.java +++ b/community/kernel-api/src/main/java/org/neo4j/storageengine/api/schema/IndexReader.java @@ -25,6 +25,7 @@ import org.neo4j.internal.kernel.api.IndexOrder; import org.neo4j.internal.kernel.api.IndexQuery; import org.neo4j.internal.kernel.api.exceptions.schema.IndexNotApplicableKernelException; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.values.storable.Value; /** @@ -78,8 +79,9 @@ void query( IndexProgressor.NodeValueClient client, IndexOrder indexOrder, boole * regardless of the actual values. * * @param client {@link IndexProgressor.NodeValueClient} to get initialized with this progression. + * @param propertyAccessor used for distinguishing between lossy indexed values. */ - void distinctValues( IndexProgressor.NodeValueClient client ); + void distinctValues( IndexProgressor.NodeValueClient client, NodePropertyAccessor propertyAccessor ); IndexReader EMPTY = new IndexReader() { @@ -120,7 +122,7 @@ public boolean hasFullValuePrecision( IndexQuery... predicates ) } @Override - public void distinctValues( IndexProgressor.NodeValueClient client ) + public void distinctValues( IndexProgressor.NodeValueClient client, NodePropertyAccessor propertyAccessor ) { // do nothing } 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 4bd59f2350d47..e5753e9c653cc 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 @@ -25,8 +25,10 @@ import org.eclipse.collections.impl.set.mutable.primitive.LongHashSet; import org.junit.Test; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ThreadLocalRandom; @@ -37,11 +39,13 @@ import org.neo4j.internal.kernel.api.exceptions.KernelException; import org.neo4j.values.storable.CoordinateReferenceSystem; import org.neo4j.values.storable.DateValue; +import org.neo4j.values.storable.PointValue; import org.neo4j.values.storable.Value; import org.neo4j.values.storable.ValueCategory; import org.neo4j.values.storable.ValueGroup; import org.neo4j.values.storable.Values; +import static java.lang.Math.toIntExact; import static java.util.concurrent.TimeUnit.MINUTES; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; @@ -1444,6 +1448,7 @@ public void shouldCountDistinctValues() throws Exception IndexReference index = schemaRead.index( label, key ); Map> expected = new HashMap<>(); int expectedTotalCount = 100; + List createdNodes = new ArrayList<>(); try ( org.neo4j.internal.kernel.api.Transaction tx = beginTransaction() ) { ThreadLocalRandom random = ThreadLocalRandom.current(); @@ -1455,6 +1460,7 @@ public void shouldCountDistinctValues() throws Exception Value value = Values.of( random.nextBoolean() ? String.valueOf( i % 10 ) : (i % 10) ); write.nodeSetProperty( nodeId, key, value ); expected.computeIfAbsent( value, v -> new HashSet<>() ).add( nodeId ); + createdNodes.add( nodeId ); } tx.success(); } @@ -1490,6 +1496,78 @@ public void shouldCountDistinctValues() throws Exception } assertEquals( expectedTotalCount, totalCount ); } + // the tests in this class share and modify the very same graph, so restore it + deleteNodes( createdNodes ); + } + + @Test + public void shouldCountDistinctButSimilarPointValues() throws Exception + { + // given + int label = token.nodeLabel( "Node" ); + int key = token.propertyKey( "prop2" ); + IndexReference index = schemaRead.index( label, key ); + Value p1 = PointValue.parse( "{latitude: 40.7128, longitude: -74.0060, crs: 'wgs-84'}" ); + Value p2 = PointValue.parse( "{latitude: 40.7128, longitude: -74.006000001, crs: 'wgs-84'}" ); + List createdNodes = new ArrayList<>(); + try ( org.neo4j.internal.kernel.api.Transaction tx = beginTransaction() ) + { + Write write = tx.dataWrite(); + // point 1 + { + long node1 = write.nodeCreate(); + write.nodeAddLabel( node1, label ); + write.nodeSetProperty( node1, key, p1 ); + createdNodes.add( node1 ); + } + // point 2 + { + long node2 = write.nodeCreate(); + write.nodeAddLabel( node2, label ); + write.nodeSetProperty( node2, key, p2 ); + createdNodes.add( node2 ); + } + // point 2 + { + long node3 = write.nodeCreate(); + write.nodeAddLabel( node3, label ); + write.nodeSetProperty( node3, key, p2 ); + createdNodes.add( node3 ); + } + tx.success(); + } + + // when + Map expected = new HashMap<>(); + expected.put( p1, 1 ); + expected.put( p2, 2 ); + try ( org.neo4j.internal.kernel.api.Transaction tx = beginTransaction(); + NodeValueIndexCursor node = cursors.allocateNodeValueIndexCursor() ) + { + tx.dataRead().nodeIndexDistinctValues( index, node ); + + // then + while ( node.next() ) + { + assertTrue( node.hasValue() ); + assertTrue( expected.containsKey( node.propertyValue( 0 ) ) ); + assertEquals( expected.remove( node.propertyValue( 0 ) ).intValue(), toIntExact( node.nodeReference() ) ); + } + assertTrue( expected.isEmpty() ); + } + deleteNodes( createdNodes ); + } + + private void deleteNodes( List createdNodes ) throws Exception + { + try ( org.neo4j.internal.kernel.api.Transaction tx = beginTransaction() ) + { + for ( Long createdNode : createdNodes ) + { + tx.dataWrite().nodeDelete( createdNode ); + } + tx.success(); + } } private long nodeWithProp( GraphDatabaseService graphDb, Object value ) diff --git a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/helpers/StubNodeCursor.java b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/helpers/StubNodeCursor.java index f54fc73d82605..4c78a037edeca 100644 --- a/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/helpers/StubNodeCursor.java +++ b/community/kernel-api/src/test/java/org/neo4j/internal/kernel/api/helpers/StubNodeCursor.java @@ -153,6 +153,10 @@ public boolean isDense() @Override public boolean next() { + if ( offset == Integer.MAX_VALUE ) + { + return false; + } return ++offset < nodes.size(); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java b/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java index a4e944da1e24e..319756ac93153 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java @@ -43,7 +43,7 @@ import org.neo4j.io.pagecache.tracing.cursor.context.VersionContextSupplier; import org.neo4j.kernel.api.InwardKernel; import org.neo4j.kernel.api.explicitindex.AutoIndexing; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.api.labelscan.LabelScanStore; import org.neo4j.kernel.availability.AvailabilityGuard; import org.neo4j.kernel.availability.DatabaseAvailability; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/api/index/IndexAccessor.java b/community/kernel/src/main/java/org/neo4j/kernel/api/index/IndexAccessor.java index d89aa3138fc9f..9e62d2a7a6298 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/api/index/IndexAccessor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/api/index/IndexAccessor.java @@ -30,6 +30,7 @@ import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; import org.neo4j.kernel.impl.api.index.IndexUpdateMode; import org.neo4j.kernel.impl.api.index.updater.SwallowingIndexUpdater; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.storageengine.api.schema.IndexReader; import org.neo4j.values.storable.Value; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/api/index/IndexPopulator.java b/community/kernel/src/main/java/org/neo4j/kernel/api/index/IndexPopulator.java index 543bc4a64ca3a..d948599f57e40 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/api/index/IndexPopulator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/api/index/IndexPopulator.java @@ -26,6 +26,7 @@ import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; import org.neo4j.kernel.impl.api.index.UpdateMode; import org.neo4j.kernel.impl.api.index.updater.SwallowingIndexUpdater; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.storageengine.api.schema.IndexSample; import org.neo4j.storageengine.api.schema.StoreIndexDescriptor; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/LookupFilter.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/LookupFilter.java index d42643faf3cc8..c6ab4e83b7f12 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/LookupFilter.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/LookupFilter.java @@ -27,7 +27,7 @@ import org.neo4j.collection.PrimitiveLongCollections; import org.neo4j.internal.kernel.api.IndexQuery; import org.neo4j.internal.kernel.api.exceptions.EntityNotFoundException; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.values.storable.Value; import org.neo4j.values.storable.ValueGroup; import org.neo4j.values.storable.Values; 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 d4d299cb6fbd3..9778cbc7f1872 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 @@ -31,7 +31,7 @@ import org.neo4j.kernel.api.exceptions.index.IndexPopulationFailedKernelException; import org.neo4j.kernel.api.exceptions.schema.UniquePropertyValueValidationException; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.storageengine.api.schema.CapableIndexDescriptor; import org.neo4j.storageengine.api.schema.IndexReader; import org.neo4j.storageengine.api.schema.PopulationProgress; 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 b006c90d2181f..b51b55900f222 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 @@ -38,7 +38,7 @@ import org.neo4j.kernel.api.exceptions.index.IndexProxyAlreadyClosedKernelException; import org.neo4j.kernel.api.exceptions.schema.UniquePropertyValueValidationException; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.api.index.updater.DelegatingIndexUpdater; import org.neo4j.storageengine.api.schema.CapableIndexDescriptor; import org.neo4j.storageengine.api.schema.IndexReader; 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 d680943a4f84f..52a2c3bcff021 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 @@ -33,7 +33,7 @@ import org.neo4j.kernel.api.index.IndexAccessor; import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.storageengine.api.schema.CapableIndexDescriptor; import org.neo4j.storageengine.api.schema.IndexReader; import org.neo4j.storageengine.api.schema.PopulationProgress; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexStoreView.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexStoreView.java index 560841b695cce..eb855e34b83f0 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexStoreView.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexStoreView.java @@ -25,7 +25,7 @@ import org.neo4j.helpers.collection.Visitor; import org.neo4j.kernel.api.index.IndexEntryUpdate; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.api.labelscan.NodeLabelUpdate; import org.neo4j.register.Register.DoubleLongRegister; import org.neo4j.storageengine.api.EntityType; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexingService.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexingService.java index f785d6b2fb43a..5a62cdc914430 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexingService.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexingService.java @@ -63,7 +63,7 @@ import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.api.SchemaState; import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingController; import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingMode; 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 59986c13f6bc0..883b9ad1eda64 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 @@ -45,7 +45,7 @@ import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.api.SchemaState; import org.neo4j.logging.Log; import org.neo4j.logging.LogProvider; 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 935a8bfabf40f..c7657ab3b73b7 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 @@ -28,7 +28,7 @@ import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; import org.neo4j.kernel.api.index.IndexAccessor; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.api.index.updater.UpdateCountingIndexUpdater; import org.neo4j.storageengine.api.schema.CapableIndexDescriptor; import org.neo4j.storageengine.api.schema.IndexReader; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/PropertyLoader.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/PropertyLoader.java index 8b87963346d66..e27f9d829d06d 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/PropertyLoader.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/PropertyLoader.java @@ -21,7 +21,7 @@ import org.eclipse.collections.api.set.primitive.MutableIntSet; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.storageengine.api.EntityType; import org.neo4j.values.storable.Value; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/TentativeConstraintIndexProxy.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/TentativeConstraintIndexProxy.java index 6f20f296c1bdb..f76bc408cd2ca 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/TentativeConstraintIndexProxy.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/TentativeConstraintIndexProxy.java @@ -33,7 +33,7 @@ import org.neo4j.kernel.api.exceptions.schema.UniquePropertyValueValidationException; import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.api.schema.constraints.ConstraintDescriptorFactory; import org.neo4j.kernel.impl.api.index.updater.DelegatingIndexUpdater; import org.neo4j.kernel.impl.index.schema.DeferredConflictCheckingIndexUpdater; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/ConstraintIndexCreator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/ConstraintIndexCreator.java index 878b127bfd480..9f5d017f40d07 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/ConstraintIndexCreator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/state/ConstraintIndexCreator.java @@ -41,7 +41,7 @@ import org.neo4j.kernel.api.exceptions.schema.AlreadyConstrainedException; import org.neo4j.kernel.api.exceptions.schema.AlreadyIndexedException; import org.neo4j.kernel.api.exceptions.schema.UniquePropertyValueValidationException; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.api.schema.constraints.ConstraintDescriptorFactory; import org.neo4j.kernel.api.schema.constraints.UniquenessConstraintDescriptor; import org.neo4j.kernel.impl.api.KernelTransactionImplementation; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeDistinctValuesProgressor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeDistinctValuesProgressor.java index 48a3f3688cb35..eb2c50e839044 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeDistinctValuesProgressor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeDistinctValuesProgressor.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.io.UncheckedIOException; import java.util.Collection; +import java.util.Comparator; import org.neo4j.cursor.RawCursor; import org.neo4j.index.internal.gbptree.Hit; @@ -30,16 +31,19 @@ public class NativeDistinctValuesProgressor, VAL { private final IndexLayout layout; private final KEY prev; + private final Comparator comparator; private boolean first = true; private long countForCurrentValue; private boolean last; NativeDistinctValuesProgressor( RawCursor,IOException> seeker, NodeValueClient client, - Collection,IOException>> toRemoveFromOnClose, IndexLayout layout ) + Collection,IOException>> toRemoveFromOnClose, IndexLayout layout, + Comparator comparator ) { super( seeker, client, toRemoveFromOnClose ); this.layout = layout; prev = layout.newKey(); + this.comparator = comparator; } @Override @@ -57,7 +61,7 @@ public boolean next() first = false; countForCurrentValue = 1; } - else if ( layout.compareValue( prev, key ) == 0 ) + else if ( comparator.compare( prev, key ) == 0 ) { // same as previous countForCurrentValue++; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeIndexAccessor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeIndexAccessor.java index 71066ddb5a45d..67ef375ca7827 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeIndexAccessor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeIndexAccessor.java @@ -33,7 +33,7 @@ import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; import org.neo4j.kernel.api.index.IndexAccessor; import org.neo4j.kernel.api.index.IndexProvider; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.api.index.IndexUpdateMode; import org.neo4j.storageengine.api.schema.IndexReader; import org.neo4j.storageengine.api.schema.StoreIndexDescriptor; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeIndexPopulator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeIndexPopulator.java index 22fe23230cfe9..b82e386035b65 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeIndexPopulator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeIndexPopulator.java @@ -44,7 +44,7 @@ import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.api.index.sampling.UniqueIndexSampler; import org.neo4j.storageengine.api.schema.IndexSample; import org.neo4j.storageengine.api.schema.StoreIndexDescriptor; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeIndexReader.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeIndexReader.java index 1633a0de65860..b261b61415346 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeIndexReader.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeIndexReader.java @@ -31,6 +31,7 @@ import org.neo4j.internal.kernel.api.IndexOrder; import org.neo4j.internal.kernel.api.IndexQuery; import org.neo4j.io.IOUtils; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.storageengine.api.schema.IndexDescriptor; import org.neo4j.storageengine.api.schema.IndexProgressor; import org.neo4j.storageengine.api.schema.IndexReader; @@ -45,7 +46,7 @@ abstract class NativeIndexReader, VALUE extends protected final IndexDescriptor descriptor; final IndexLayout layout; final Set,IOException>> openSeekers; - private final GBPTree tree; + final GBPTree tree; NativeIndexReader( GBPTree tree, IndexLayout layout, IndexDescriptor descriptor ) { @@ -137,7 +138,7 @@ void initializeFromToKeys( KEY treeKeyFrom, KEY treeKeyTo ) public abstract boolean hasFullValuePrecision( IndexQuery... predicates ); @Override - public void distinctValues( IndexProgressor.NodeValueClient client ) + public void distinctValues( IndexProgressor.NodeValueClient client, NodePropertyAccessor propertyAccessor ) { KEY lowest = layout.newKey(); lowest.initialize( Long.MIN_VALUE ); @@ -148,7 +149,7 @@ public void distinctValues( IndexProgressor.NodeValueClient client ) try { RawCursor,IOException> seeker = tree.seek( lowest, highest ); - client.initialize( descriptor, new NativeDistinctValuesProgressor<>( seeker, client, openSeekers, (IndexLayout) layout ), + client.initialize( descriptor, new NativeDistinctValuesProgressor<>( seeker, client, openSeekers, layout, layout::compareValue ), new IndexQuery[0], IndexOrder.NONE, client.needsValues() ); } catch ( IOException e ) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/ParallelNativeIndexPopulator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/ParallelNativeIndexPopulator.java index 3bd563abdd37e..287089d47a484 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/ParallelNativeIndexPopulator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/ParallelNativeIndexPopulator.java @@ -37,7 +37,7 @@ import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.storageengine.api.schema.IndexSample; import org.neo4j.util.VisibleForTesting; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/PropertyLookupFallbackComparator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/PropertyLookupFallbackComparator.java new file mode 100644 index 0000000000000..ebfdf4f949cdb --- /dev/null +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/PropertyLookupFallbackComparator.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2002-2018 "Neo4j," + * Neo4j Sweden AB [http://neo4j.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.neo4j.kernel.impl.index.schema; + +import java.util.Comparator; + +import org.neo4j.internal.kernel.api.exceptions.EntityNotFoundException; +import org.neo4j.storageengine.api.NodePropertyAccessor; +import org.neo4j.values.storable.Values; + +/** + * Compares {@link NativeIndexKey}, but will consult {@link NodePropertyAccessor} on coming across a comparison of zero. + * This is useful for e.g. spatial keys which are indexed lossily. + * @param type of index key. + */ +class PropertyLookupFallbackComparator,VALUE extends NativeIndexValue> implements Comparator +{ + private final IndexLayout schemaLayout; + private final NodePropertyAccessor propertyAccessor; + private final int propertyKeyId; + + PropertyLookupFallbackComparator( IndexLayout schemaLayout, NodePropertyAccessor propertyAccessor, int propertyKeyId ) + { + this.schemaLayout = schemaLayout; + this.propertyAccessor = propertyAccessor; + this.propertyKeyId = propertyKeyId; + } + + @Override + public int compare( KEY k1, KEY k2 ) + { + int comparison = schemaLayout.compareValue( k1, k2 ); + if ( comparison != 0 ) + { + return comparison; + } + try + { + return Values.COMPARATOR.compare( + propertyAccessor.getNodePropertyValue( k1.getEntityId(), propertyKeyId ), + propertyAccessor.getNodePropertyValue( k2.getEntityId(), propertyKeyId ) ); + } + catch ( EntityNotFoundException e ) + { + // We don't want this operation to fail since it's merely counting distinct values. + // This entity not being there is most likely a result of a concurrent deletion happening as we speak. + return comparison; + } + } +} diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialIndexAccessor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialIndexAccessor.java index b4c79c145072d..99736fbe5b868 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialIndexAccessor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialIndexAccessor.java @@ -39,7 +39,7 @@ import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.api.index.IndexUpdateMode; import org.neo4j.storageengine.api.schema.IndexReader; import org.neo4j.storageengine.api.schema.StoreIndexDescriptor; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialIndexPartReader.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialIndexPartReader.java index e38db43040ac7..51654d581ddec 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialIndexPartReader.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialIndexPartReader.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.io.UncheckedIOException; +import java.util.Comparator; import java.util.List; import org.neo4j.cursor.RawCursor; @@ -32,7 +33,9 @@ import org.neo4j.internal.kernel.api.IndexQuery; import org.neo4j.internal.kernel.api.IndexQuery.ExactPredicate; import org.neo4j.internal.kernel.api.IndexQuery.GeometryRangePredicate; +import org.neo4j.internal.kernel.api.exceptions.EntityNotFoundException; import org.neo4j.kernel.impl.api.schema.BridgingIndexProgressor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.storageengine.api.schema.IndexDescriptor; import org.neo4j.storageengine.api.schema.IndexProgressor; import org.neo4j.values.storable.Value; @@ -106,6 +109,47 @@ public void query( IndexProgressor.NodeValueClient cursor, IndexOrder indexOrder } } + @Override + public void distinctValues( IndexProgressor.NodeValueClient client, NodePropertyAccessor propertyAccessor ) + { + // This is basically a version of the basic implementation, but with added consulting of the PropertyAccessor + // since these are lossy spatial values. + SpatialIndexKey lowest = layout.newKey(); + lowest.initialize( Long.MIN_VALUE ); + lowest.initValuesAsLowest(); + SpatialIndexKey highest = layout.newKey(); + highest.initialize( Long.MAX_VALUE ); + highest.initValuesAsHighest(); + try + { + RawCursor,IOException> seeker = tree.seek( lowest, highest ); + Comparator comparator = + new PropertyLookupFallbackComparator<>( layout, propertyAccessor, descriptor.schema().getPropertyId() ); + NativeDistinctValuesProgressor progressor = + new NativeDistinctValuesProgressor( seeker, client, openSeekers, layout, comparator ) + { + @Override + Value[] extractValues( SpatialIndexKey key ) + { + try + { + return new Value[]{propertyAccessor.getNodePropertyValue( key.getEntityId(), descriptor.schema().getPropertyId() )}; + } + catch ( EntityNotFoundException e ) + { + // We couldn't get the value due to the entity not being there. Concurrently deleted? + return null; + } + } + }; + client.initialize( descriptor, progressor, new IndexQuery[0], IndexOrder.NONE, client.needsValues() ); + } + catch ( IOException e ) + { + throw new UncheckedIOException( e ); + } + } + private void startSeekForExists( SpatialIndexKey treeKeyFrom, SpatialIndexKey treeKeyTo, IndexProgressor.NodeValueClient client, IndexQuery... predicates ) { treeKeyFrom.initValueAsLowest( ValueGroup.GEOMETRY ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialIndexPopulatingUpdater.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialIndexPopulatingUpdater.java index c70573408da2d..e8e53d32ecf9f 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialIndexPopulatingUpdater.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialIndexPopulatingUpdater.java @@ -22,7 +22,7 @@ import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.values.storable.CoordinateReferenceSystem; import org.neo4j.values.storable.PointValue; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialIndexPopulator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialIndexPopulator.java index 05f7e95362979..4183afe092a7c 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialIndexPopulator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialIndexPopulator.java @@ -34,7 +34,7 @@ import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.index.schema.config.SpaceFillingCurveSettings; import org.neo4j.storageengine.api.schema.IndexSample; import org.neo4j.storageengine.api.schema.StoreIndexDescriptor; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialIndexReader.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialIndexReader.java index e9a8946a375dc..78dbb45c3cfaf 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialIndexReader.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialIndexReader.java @@ -29,6 +29,7 @@ import org.neo4j.internal.kernel.api.IndexQuery.ExistsPredicate; import org.neo4j.kernel.impl.api.schema.BridgingIndexProgressor; import org.neo4j.kernel.impl.index.schema.fusion.FusionIndexSampler; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.storageengine.api.schema.IndexDescriptor; import org.neo4j.storageengine.api.schema.IndexProgressor; import org.neo4j.storageengine.api.schema.IndexReader; @@ -147,14 +148,14 @@ public boolean hasFullValuePrecision( IndexQuery... predicates ) } @Override - public void distinctValues( IndexProgressor.NodeValueClient cursor ) + public void distinctValues( IndexProgressor.NodeValueClient cursor, NodePropertyAccessor propertyAccessor ) { loadAll(); BridgingIndexProgressor multiProgressor = new BridgingIndexProgressor( cursor, descriptor.schema().getPropertyIds() ); cursor.initialize( descriptor, multiProgressor, new IndexQuery[0], IndexOrder.NONE, false ); for ( NativeIndexReader reader : this ) { - reader.distinctValues( multiProgressor ); + reader.distinctValues( multiProgressor, propertyAccessor ); } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialVerifyDeferredConstraint.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialVerifyDeferredConstraint.java index d9bd249e26719..c73ff42c24300 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialVerifyDeferredConstraint.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SpatialVerifyDeferredConstraint.java @@ -32,7 +32,7 @@ import org.neo4j.index.internal.gbptree.Hit; import org.neo4j.internal.kernel.api.exceptions.EntityNotFoundException; import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.storageengine.api.schema.StoreIndexDescriptor; import org.neo4j.values.storable.Value; import org.neo4j.values.storable.ValueGroup; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/TemporalIndexAccessor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/TemporalIndexAccessor.java index 600ec5e61099e..508dfcee39bf9 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/TemporalIndexAccessor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/TemporalIndexAccessor.java @@ -37,7 +37,7 @@ import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.api.index.IndexUpdateMode; import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingConfig; import org.neo4j.storageengine.api.schema.IndexDescriptor; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/TemporalIndexPopulatingUpdater.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/TemporalIndexPopulatingUpdater.java index 4ca6028415e86..032fb225c9f10 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/TemporalIndexPopulatingUpdater.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/TemporalIndexPopulatingUpdater.java @@ -24,7 +24,7 @@ import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.values.storable.ValueGroup; public class TemporalIndexPopulatingUpdater extends TemporalIndexCache implements IndexUpdater diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/TemporalIndexPopulator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/TemporalIndexPopulator.java index 446a902822400..e701515f0a0c4 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/TemporalIndexPopulator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/TemporalIndexPopulator.java @@ -32,7 +32,7 @@ import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingConfig; import org.neo4j.storageengine.api.schema.IndexSample; import org.neo4j.storageengine.api.schema.StoreIndexDescriptor; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/TemporalIndexReader.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/TemporalIndexReader.java index 7efd51ed4dac7..80cf1a8159596 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/TemporalIndexReader.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/TemporalIndexReader.java @@ -29,6 +29,7 @@ import org.neo4j.internal.kernel.api.IndexQuery.ExistsPredicate; import org.neo4j.kernel.impl.api.schema.BridgingIndexProgressor; import org.neo4j.kernel.impl.index.schema.fusion.FusionIndexSampler; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.storageengine.api.schema.IndexDescriptor; import org.neo4j.storageengine.api.schema.IndexProgressor; import org.neo4j.storageengine.api.schema.IndexReader; @@ -126,14 +127,14 @@ public boolean hasFullValuePrecision( IndexQuery... predicates ) } @Override - public void distinctValues( IndexProgressor.NodeValueClient cursor ) + public void distinctValues( IndexProgressor.NodeValueClient cursor, NodePropertyAccessor propertyAccessor ) { loadAll(); BridgingIndexProgressor multiProgressor = new BridgingIndexProgressor( cursor, descriptor.schema().getPropertyIds() ); cursor.initialize( descriptor, multiProgressor, new IndexQuery[0], IndexOrder.NONE, cursor.needsValues() ); for ( NativeIndexReader reader : this ) { - reader.distinctValues( multiProgressor ); + reader.distinctValues( multiProgressor, propertyAccessor ); } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/WorkSyncedNativeIndexPopulator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/WorkSyncedNativeIndexPopulator.java index 0ebf29d5af3dc..9b762982e5d2d 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/WorkSyncedNativeIndexPopulator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/WorkSyncedNativeIndexPopulator.java @@ -29,7 +29,7 @@ import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.storageengine.api.schema.IndexSample; import org.neo4j.util.concurrent.Work; import org.neo4j.util.concurrent.WorkSync; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/FusionIndexAccessor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/FusionIndexAccessor.java index 4262b454558cf..97cd7692fe46b 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/FusionIndexAccessor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/FusionIndexAccessor.java @@ -29,7 +29,7 @@ import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; import org.neo4j.kernel.api.index.IndexAccessor; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.api.index.IndexUpdateMode; import org.neo4j.kernel.impl.index.schema.fusion.FusionIndexProvider.DropAction; import org.neo4j.storageengine.api.schema.IndexReader; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/FusionIndexPopulator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/FusionIndexPopulator.java index b721199e0c674..d734ae8f5db82 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/FusionIndexPopulator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/FusionIndexPopulator.java @@ -26,7 +26,7 @@ import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.index.schema.fusion.FusionIndexProvider.DropAction; import org.neo4j.storageengine.api.schema.IndexSample; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/FusionIndexReader.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/FusionIndexReader.java index e8a12bda2c199..bec1c927e9da5 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/FusionIndexReader.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/fusion/FusionIndexReader.java @@ -28,6 +28,7 @@ import org.neo4j.internal.kernel.api.IndexQuery.ExistsPredicate; import org.neo4j.internal.kernel.api.exceptions.schema.IndexNotApplicableKernelException; import org.neo4j.kernel.impl.api.schema.BridgingIndexProgressor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.storageengine.api.schema.IndexDescriptor; import org.neo4j.storageengine.api.schema.IndexProgressor; import org.neo4j.storageengine.api.schema.IndexReader; @@ -130,12 +131,12 @@ public synchronized IndexNotApplicableKernelException getCause() } @Override - public void distinctValues( IndexProgressor.NodeValueClient cursor ) + public void distinctValues( IndexProgressor.NodeValueClient cursor, NodePropertyAccessor propertyAccessor ) { BridgingIndexProgressor multiProgressor = new BridgingIndexProgressor( cursor, descriptor.schema().getPropertyIds() ); cursor.initialize( descriptor, multiProgressor, new IndexQuery[0], IndexOrder.NONE, cursor.needsValues() ); - instanceSelector.forAll( reader -> reader.distinctValues( multiProgressor ) ); + instanceSelector.forAll( reader -> reader.distinctValues( multiProgressor, propertyAccessor ) ); } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/CursorPropertyAccessor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/CursorPropertyAccessor.java new file mode 100644 index 0000000000000..72370c6fe528d --- /dev/null +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/newapi/CursorPropertyAccessor.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2002-2018 "Neo4j," + * Neo4j Sweden AB [http://neo4j.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.neo4j.kernel.impl.newapi; + +import org.neo4j.internal.kernel.api.NodeCursor; +import org.neo4j.internal.kernel.api.PropertyCursor; +import org.neo4j.internal.kernel.api.Read; +import org.neo4j.internal.kernel.api.exceptions.EntityNotFoundException; +import org.neo4j.io.IOUtils; +import org.neo4j.storageengine.api.EntityType; +import org.neo4j.storageengine.api.NodePropertyAccessor; +import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.Values; + +/** + * Generic single-threaded {@link NodePropertyAccessor} given a {@link NodeCursor} and {@link PropertyCursor}. + */ +class CursorPropertyAccessor implements NodePropertyAccessor, AutoCloseable +{ + private final NodeCursor nodeCursor; + private final PropertyCursor propertyCursor; + private final Read read; + + CursorPropertyAccessor( NodeCursor nodeCursor, PropertyCursor propertyCursor, Read read ) + { + this.nodeCursor = nodeCursor; + this.propertyCursor = propertyCursor; + this.read = read; + } + + @Override + public void close() + { + IOUtils.closeAllSilently( propertyCursor, nodeCursor ); + } + + @Override + public Value getNodePropertyValue( long nodeId, int propertyKeyId ) throws EntityNotFoundException + { + read.singleNode( nodeId, nodeCursor ); + if ( !nodeCursor.next() ) + { + throw new EntityNotFoundException( EntityType.NODE, nodeId ); + } + + nodeCursor.properties( propertyCursor ); + while ( propertyCursor.next() ) + { + if ( propertyCursor.propertyKey() == propertyKeyId ) + { + return propertyCursor.propertyValue(); + } + } + return Values.NO_VALUE; + } +} 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 1b05a4689593e..f2bcd50b81ff5 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 @@ -106,7 +106,10 @@ public void nodeIndexDistinctValues( IndexReference index, NodeValueIndexCursor DefaultNodeValueIndexCursor cursorImpl = (DefaultNodeValueIndexCursor) cursor; IndexReader reader = indexReader( index, true ); cursorImpl.setRead( this, null ); - reader.distinctValues( cursorImpl ); + try ( CursorPropertyAccessor accessor = new CursorPropertyAccessor( cursors.allocateNodeCursor(), cursors.allocatePropertyCursor(), this ) ) + { + reader.distinctValues( cursorImpl, accessor ); + } } private IndexProgressor.NodeValueClient injectFullValuePrecision( IndexProgressor.NodeValueClient cursor, diff --git a/community/kernel/src/test/java/org/neo4j/kernel/api/index/TestNodePropertyAccessor.java b/community/kernel/src/test/java/org/neo4j/kernel/api/index/TestNodePropertyAccessor.java index c80796b9044ee..1c9877a0584c5 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/api/index/TestNodePropertyAccessor.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/api/index/TestNodePropertyAccessor.java @@ -23,6 +23,7 @@ import java.util.Map; import org.neo4j.internal.kernel.api.schema.SchemaDescriptor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.values.storable.Value; import org.neo4j.values.storable.Values; diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/constraints/ConstraintIndexCreatorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/constraints/ConstraintIndexCreatorTest.java index 2daa1369bff69..1b6d6967e9509 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/constraints/ConstraintIndexCreatorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/constraints/ConstraintIndexCreatorTest.java @@ -44,7 +44,7 @@ import org.neo4j.kernel.api.exceptions.index.IndexPopulationFailedKernelException; import org.neo4j.kernel.api.exceptions.schema.AlreadyConstrainedException; import org.neo4j.kernel.api.exceptions.schema.UniquePropertyValueValidationException; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.api.schema.SchemaDescriptorFactory; import org.neo4j.kernel.api.schema.index.TestIndexDescriptorFactory; import org.neo4j.kernel.api.txstate.TransactionState; diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexPopulationTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexPopulationTest.java index 44b8eaf045f5c..8d39558c0aa5c 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexPopulationTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexPopulationTest.java @@ -30,7 +30,7 @@ import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.api.labelscan.NodeLabelUpdate; import org.neo4j.kernel.api.schema.LabelSchemaDescriptor; import org.neo4j.kernel.api.schema.SchemaDescriptorFactory; 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 6ed633eb7c3fd..ab1e0164ae39f 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 @@ -39,7 +39,7 @@ import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.api.schema.SchemaDescriptorFactory; import org.neo4j.kernel.api.schema.index.TestIndexDescriptorFactory; import org.neo4j.kernel.impl.api.SchemaState; diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/FailingGenericNativeIndexProviderFactory.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/FailingGenericNativeIndexProviderFactory.java index e7bef88f51eab..0e5b5c9e4700a 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/FailingGenericNativeIndexProviderFactory.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/FailingGenericNativeIndexProviderFactory.java @@ -34,7 +34,7 @@ import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.extension.ExtensionType; import org.neo4j.kernel.extension.KernelExtensionFactory; import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingConfig; diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/IndexPopulationStressTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/IndexPopulationStressTest.java index 31204442946f6..06971653cbbde 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/IndexPopulationStressTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/IndexPopulationStressTest.java @@ -49,7 +49,7 @@ import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingConfig; import org.neo4j.storageengine.api.schema.IndexReader; import org.neo4j.storageengine.api.schema.SimpleNodeValueClient; diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeDistinctValuesProgressorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeDistinctValuesProgressorTest.java index 4dce64a8f442b..b03cde6a146c3 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeDistinctValuesProgressorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeDistinctValuesProgressorTest.java @@ -61,7 +61,7 @@ public void shouldCountDistinctValues() // when NativeDistinctValuesProgressor progressor = - new NativeDistinctValuesProgressor<>( source, client, new ArrayList<>(), layout ); + new NativeDistinctValuesProgressor<>( source, client, new ArrayList<>(), layout, layout::compareValue ); Map expectedCounts = asDistinctCounts( strings ); // then diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeIndexPopulatorTests.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeIndexPopulatorTests.java index 82cc0609b9e1f..b08332dd39cf5 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeIndexPopulatorTests.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeIndexPopulatorTests.java @@ -43,7 +43,7 @@ import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.storageengine.api.schema.IndexDescriptor; import org.neo4j.storageengine.api.schema.IndexSample; import org.neo4j.values.storable.Values; diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/ParallelNativeIndexPopulatorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/ParallelNativeIndexPopulatorTest.java index d61b53fda0c9f..7c214c371e550 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/ParallelNativeIndexPopulatorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/ParallelNativeIndexPopulatorTest.java @@ -54,7 +54,7 @@ import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.index.schema.config.ConfiguredSpaceFillingCurveSettingsCache; import org.neo4j.kernel.impl.index.schema.config.IndexSpecificSpaceFillingCurveSettingsCache; diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/CursorPropertyAccessorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/CursorPropertyAccessorTest.java new file mode 100644 index 0000000000000..35d4356219385 --- /dev/null +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/CursorPropertyAccessorTest.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2002-2018 "Neo4j," + * Neo4j Sweden AB [http://neo4j.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.neo4j.kernel.impl.newapi; + +import org.junit.Test; + +import org.neo4j.internal.kernel.api.exceptions.EntityNotFoundException; +import org.neo4j.internal.kernel.api.helpers.StubNodeCursor; +import org.neo4j.internal.kernel.api.helpers.StubPropertyCursor; +import org.neo4j.internal.kernel.api.helpers.StubRead; +import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.Values; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; +import static org.neo4j.helpers.collection.MapUtil.genericMap; +import static org.neo4j.values.storable.Values.NO_VALUE; + +public class CursorPropertyAccessorTest +{ + @Test + public void shouldLookupProperty() throws EntityNotFoundException + { + // given + long nodeId = 10; + Value value = Values.of( "abc" ); + int propertyKeyId = 0; + StubNodeCursor nodeCursor = new StubNodeCursor().withNode( nodeId, new long[]{}, genericMap( 999, Values.of( 12345 ), propertyKeyId, value ) ); + CursorPropertyAccessor accessor = new CursorPropertyAccessor( nodeCursor, new StubPropertyCursor(), new StubRead() ); + + // when + Value readValue = accessor.getNodePropertyValue( nodeId, propertyKeyId ); + + // then + assertEquals( value, readValue ); + } + + @Test + public void shouldReturnNoValueOnMissingProperty() throws EntityNotFoundException + { + // given + long nodeId = 10; + StubNodeCursor nodeCursor = new StubNodeCursor().withNode( nodeId, new long[]{}, genericMap( 999, Values.of( 12345 ) ) ); + CursorPropertyAccessor accessor = new CursorPropertyAccessor( nodeCursor, new StubPropertyCursor(), new StubRead() ); + + // when + Value readValue = accessor.getNodePropertyValue( nodeId, 0 ); + + // then + assertEquals( NO_VALUE, readValue ); + } + + @Test + public void shouldThrowOnEntityNotFound() + { + // given + long nodeId = 10; + Value value = Values.of( "abc" ); + int propertyKeyId = 0; + StubNodeCursor nodeCursor = new StubNodeCursor().withNode( nodeId, new long[]{}, genericMap( 999, Values.of( 12345 ), propertyKeyId, value ) ); + CursorPropertyAccessor accessor = new CursorPropertyAccessor( nodeCursor, new StubPropertyCursor(), new StubRead() ); + + // when + try + { + accessor.getNodePropertyValue( nodeId + 1, propertyKeyId ); + fail(); + } + catch ( EntityNotFoundException e ) + { + // then good + } + } +} diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/OperationsLockTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/OperationsLockTest.java index e92a4dd886a9d..e8e9d4da47d9d 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/OperationsLockTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/OperationsLockTest.java @@ -526,7 +526,7 @@ public void detachDeleteNodeWithoutRelationshipsExclusivelyLockNode() throws Ker { long nodeId = 1L; returnRelationships( transaction, false, new TestRelationshipChain( nodeId ) ); - when( transaction.ambientNodeCursor() ).thenReturn( new StubNodeCursor( false ) ); + when( transaction.ambientNodeCursor() ).thenReturn( new StubNodeCursor( false ).withNode( nodeId ) ); when( nodeCursor.next() ).thenReturn( true ); LabelSet labels = mock( LabelSet.class ); when( labels.all() ).thenReturn( EMPTY_LONG_ARRAY ); @@ -545,7 +545,7 @@ public void detachDeleteNodeExclusivelyLockNodes() throws KernelException long nodeId = 1L; returnRelationships( transaction, false, new TestRelationshipChain( nodeId ).outgoing( 1, 2L, 42 ) ); - when( transaction.ambientNodeCursor() ).thenReturn( new StubNodeCursor( false ) ); + when( transaction.ambientNodeCursor() ).thenReturn( new StubNodeCursor( false ).withNode( nodeId ) ); LabelSet labels = mock( LabelSet.class ); when( labels.all() ).thenReturn( EMPTY_LONG_ARRAY ); when( nodeCursor.labels() ).thenReturn( labels ); @@ -591,7 +591,7 @@ public void shouldAcquiredSharedLabelLocksWhenDetachDeletingNode() throws Kernel long labelId2 = 2; returnRelationships( transaction, false, new TestRelationshipChain( nodeId ) ); - when( transaction.ambientNodeCursor() ).thenReturn( new StubNodeCursor( false ) ); + when( transaction.ambientNodeCursor() ).thenReturn( new StubNodeCursor( false ).withNode( nodeId ) ); when( nodeCursor.next() ).thenReturn( true ); LabelSet labels = mock( LabelSet.class ); when( labels.all() ).thenReturn( new long[]{labelId1, labelId2} ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/TwoPhaseNodeForRelationshipLockingTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/TwoPhaseNodeForRelationshipLockingTest.java index 7eb978fd561ba..de291766c1cff 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/TwoPhaseNodeForRelationshipLockingTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/newapi/TwoPhaseNodeForRelationshipLockingTest.java @@ -73,7 +73,7 @@ public void shouldLockNodesInOrderAndConsumeTheRelationships() throws Throwable InOrder inOrder = inOrder( locks ); // when - locking.lockAllNodesAndConsumeRelationships( nodeId, transaction, new StubNodeCursor( false ) ); + locking.lockAllNodesAndConsumeRelationships( nodeId, transaction, new StubNodeCursor( false ).withNode( nodeId ) ); // then inOrder.verify( locks ).acquireExclusive( NONE, NODE, 3L, 40L, 41L, nodeId, 43L, 49L ); @@ -97,7 +97,7 @@ public void shouldLockNodesInOrderAndConsumeTheRelationshipsAndRetryIfTheNewRela InOrder inOrder = inOrder( locks ); // when - locking.lockAllNodesAndConsumeRelationships( nodeId, transaction, new StubNodeCursor( false ) ); + locking.lockAllNodesAndConsumeRelationships( nodeId, transaction, new StubNodeCursor( false ).withNode( nodeId ) ); // then inOrder.verify( locks ).acquireExclusive( NONE, NODE, 40L, 41L, nodeId ); @@ -115,7 +115,7 @@ public void lockNodeWithoutRelationships() throws Exception TwoPhaseNodeForRelationshipLocking locking = new TwoPhaseNodeForRelationshipLocking( collector, locks, NONE ); returnRelationships( transaction, false, new TestRelationshipChain( 42 ) ); - locking.lockAllNodesAndConsumeRelationships( nodeId, transaction, new StubNodeCursor( false ) ); + locking.lockAllNodesAndConsumeRelationships( nodeId, transaction, new StubNodeCursor( false ).withNode( nodeId ) ); verify( locks ).acquireExclusive( NONE, NODE, nodeId ); verifyNoMoreInteractions( locks ); diff --git a/community/kernel/src/test/java/org/neo4j/storageengine/api/schema/DefaultIndexReaderTest.java b/community/kernel/src/test/java/org/neo4j/storageengine/api/schema/DefaultIndexReaderTest.java index 85bbdb09f54ad..161c15b54b04d 100644 --- a/community/kernel/src/test/java/org/neo4j/storageengine/api/schema/DefaultIndexReaderTest.java +++ b/community/kernel/src/test/java/org/neo4j/storageengine/api/schema/DefaultIndexReaderTest.java @@ -24,6 +24,7 @@ import org.neo4j.collection.PrimitiveLongResourceIterator; import org.neo4j.internal.kernel.api.IndexOrder; import org.neo4j.internal.kernel.api.IndexQuery; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.values.storable.Value; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -74,7 +75,7 @@ public boolean hasFullValuePrecision( IndexQuery... predicates ) } @Override - public void distinctValues( IndexProgressor.NodeValueClient client ) + public void distinctValues( IndexProgressor.NodeValueClient client, NodePropertyAccessor propertyAccessor ) { } diff --git a/community/kernel/src/test/java/org/neo4j/storageengine/api/schema/QueryResultComparingIndexReader.java b/community/kernel/src/test/java/org/neo4j/storageengine/api/schema/QueryResultComparingIndexReader.java index ec924ce5dd0ca..c7c6a948129cd 100644 --- a/community/kernel/src/test/java/org/neo4j/storageengine/api/schema/QueryResultComparingIndexReader.java +++ b/community/kernel/src/test/java/org/neo4j/storageengine/api/schema/QueryResultComparingIndexReader.java @@ -25,6 +25,7 @@ import org.neo4j.internal.kernel.api.IndexQuery; import org.neo4j.internal.kernel.api.exceptions.schema.IndexNotApplicableKernelException; import org.neo4j.kernel.impl.index.schema.NodeValueIterator; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.values.storable.Value; import static java.lang.String.format; @@ -171,9 +172,9 @@ public boolean needsValues() } @Override - public void distinctValues( IndexProgressor.NodeValueClient client ) + public void distinctValues( IndexProgressor.NodeValueClient client, NodePropertyAccessor propertyAccessor ) { - actual.distinctValues( client ); + actual.distinctValues( client, propertyAccessor ); } @Override diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/index/AbstractLuceneIndexAccessor.java b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/index/AbstractLuceneIndexAccessor.java index 46bc6c08049e9..8847c45de9795 100644 --- a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/index/AbstractLuceneIndexAccessor.java +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/index/AbstractLuceneIndexAccessor.java @@ -36,7 +36,7 @@ import org.neo4j.kernel.api.index.IndexAccessor; import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.api.index.IndexUpdateMode; import org.neo4j.storageengine.api.schema.IndexDescriptor; import org.neo4j.storageengine.api.schema.IndexReader; diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/LuceneIndexAccessor.java b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/LuceneIndexAccessor.java index 03d8f3c8d5459..7c0f18f0ae868 100644 --- a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/LuceneIndexAccessor.java +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/LuceneIndexAccessor.java @@ -26,7 +26,7 @@ import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; import org.neo4j.kernel.api.impl.index.AbstractLuceneIndexAccessor; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.api.LuceneIndexValueValidator; import org.neo4j.kernel.impl.api.index.IndexUpdateMode; import org.neo4j.storageengine.api.schema.IndexDescriptor; diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/LuceneSchemaIndex.java b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/LuceneSchemaIndex.java index 74eaefac55a81..66ecf283c12d1 100644 --- a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/LuceneSchemaIndex.java +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/LuceneSchemaIndex.java @@ -35,7 +35,7 @@ import org.neo4j.kernel.api.impl.schema.verification.PartitionedUniquenessVerifier; import org.neo4j.kernel.api.impl.schema.verification.SimpleUniquenessVerifier; import org.neo4j.kernel.api.impl.schema.verification.UniquenessVerifier; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingConfig; import org.neo4j.storageengine.api.schema.IndexDescriptor; import org.neo4j.storageengine.api.schema.IndexReader; diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/ReadOnlyDatabaseSchemaIndex.java b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/ReadOnlyDatabaseSchemaIndex.java index e73043028c224..ff3bee519af34 100644 --- a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/ReadOnlyDatabaseSchemaIndex.java +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/ReadOnlyDatabaseSchemaIndex.java @@ -26,7 +26,7 @@ import org.neo4j.kernel.api.impl.index.ReadOnlyAbstractDatabaseIndex; import org.neo4j.kernel.api.impl.index.partition.ReadOnlyIndexPartitionFactory; import org.neo4j.kernel.api.impl.index.storage.PartitionedIndexStorage; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingConfig; import org.neo4j.storageengine.api.schema.IndexDescriptor; import org.neo4j.storageengine.api.schema.IndexReader; diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/SchemaIndex.java b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/SchemaIndex.java index 3545d83f42b97..76aacbabeb37a 100644 --- a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/SchemaIndex.java +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/SchemaIndex.java @@ -25,7 +25,7 @@ import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; import org.neo4j.kernel.api.impl.index.DatabaseIndex; import org.neo4j.kernel.api.impl.schema.verification.UniquenessVerifier; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.storageengine.api.schema.IndexReader; import org.neo4j.values.storable.Value; diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/WritableDatabaseSchemaIndex.java b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/WritableDatabaseSchemaIndex.java index 0869cedeffdee..9994d8ea9a307 100644 --- a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/WritableDatabaseSchemaIndex.java +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/WritableDatabaseSchemaIndex.java @@ -26,7 +26,7 @@ import org.neo4j.kernel.api.impl.index.WritableAbstractDatabaseIndex; import org.neo4j.kernel.api.impl.index.partition.WritableIndexPartitionFactory; import org.neo4j.kernel.api.impl.index.storage.PartitionedIndexStorage; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingConfig; import org.neo4j.storageengine.api.schema.IndexDescriptor; import org.neo4j.storageengine.api.schema.IndexReader; diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/populator/NonUniqueLuceneIndexPopulator.java b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/populator/NonUniqueLuceneIndexPopulator.java index c20a6a0cb2f5c..5b35a09dadfe8 100644 --- a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/populator/NonUniqueLuceneIndexPopulator.java +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/populator/NonUniqueLuceneIndexPopulator.java @@ -23,7 +23,7 @@ import org.neo4j.kernel.api.impl.schema.SchemaIndex; import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.api.index.sampling.DefaultNonUniqueIndexSampler; import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingConfig; import org.neo4j.kernel.impl.api.index.sampling.NonUniqueIndexSampler; diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/populator/UniqueLuceneIndexPopulatingUpdater.java b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/populator/UniqueLuceneIndexPopulatingUpdater.java index d10521cd562cc..2ce5be9838a0b 100644 --- a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/populator/UniqueLuceneIndexPopulatingUpdater.java +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/populator/UniqueLuceneIndexPopulatingUpdater.java @@ -28,7 +28,7 @@ import org.neo4j.kernel.api.impl.schema.SchemaIndex; import org.neo4j.kernel.api.impl.schema.writer.LuceneIndexWriter; import org.neo4j.kernel.api.index.IndexEntryUpdate; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.api.index.sampling.UniqueIndexSampler; import org.neo4j.values.storable.Value; diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/populator/UniqueLuceneIndexPopulator.java b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/populator/UniqueLuceneIndexPopulator.java index c459805d9e7ea..f8f0b073a28a9 100644 --- a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/populator/UniqueLuceneIndexPopulator.java +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/populator/UniqueLuceneIndexPopulator.java @@ -26,7 +26,7 @@ import org.neo4j.kernel.api.impl.schema.SchemaIndex; import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.impl.api.index.sampling.UniqueIndexSampler; import org.neo4j.storageengine.api.schema.IndexDescriptor; import org.neo4j.storageengine.api.schema.IndexSample; diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/reader/PartitionedIndexReader.java b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/reader/PartitionedIndexReader.java index 07a3bde45d916..108f32ea1961c 100644 --- a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/reader/PartitionedIndexReader.java +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/reader/PartitionedIndexReader.java @@ -35,6 +35,7 @@ import org.neo4j.kernel.api.impl.index.sampler.AggregatingIndexSampler; import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingConfig; import org.neo4j.kernel.impl.api.schema.BridgingIndexProgressor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.storageengine.api.schema.AbstractIndexReader; import org.neo4j.storageengine.api.schema.IndexDescriptor; import org.neo4j.storageengine.api.schema.IndexProgressor; @@ -115,10 +116,10 @@ public boolean hasFullValuePrecision( IndexQuery... predicates ) } @Override - public void distinctValues( IndexProgressor.NodeValueClient client ) + public void distinctValues( IndexProgressor.NodeValueClient client, NodePropertyAccessor propertyAccessor ) { BridgingIndexProgressor bridgingIndexProgressor = new BridgingIndexProgressor( client, descriptor.schema().getPropertyIds() ); - indexReaders.parallelStream().forEach( reader -> reader.distinctValues( bridgingIndexProgressor ) ); + indexReaders.parallelStream().forEach( reader -> reader.distinctValues( bridgingIndexProgressor, propertyAccessor ) ); client.initialize( descriptor, bridgingIndexProgressor, new IndexQuery[0], IndexOrder.NONE, client.needsValues() ); } diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/reader/SimpleIndexReader.java b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/reader/SimpleIndexReader.java index 9d0b023816602..ebe6f87fc944b 100644 --- a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/reader/SimpleIndexReader.java +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/reader/SimpleIndexReader.java @@ -52,6 +52,7 @@ import org.neo4j.kernel.api.impl.schema.sampler.UniqueLuceneIndexSampler; import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingConfig; import org.neo4j.kernel.impl.api.schema.BridgingIndexProgressor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.storageengine.api.schema.AbstractIndexReader; import org.neo4j.storageengine.api.schema.IndexDescriptor; import org.neo4j.storageengine.api.schema.IndexProgressor; @@ -204,9 +205,10 @@ public boolean hasFullValuePrecision( IndexQuery... predicates ) * instances for those. * * @param client {@link IndexProgressor.NodeValueClient} to get initialized with this progression. + * @param propertyAccessor {@link NodePropertyAccessor} for reading property values. */ @Override - public void distinctValues( IndexProgressor.NodeValueClient client ) + public void distinctValues( IndexProgressor.NodeValueClient client, NodePropertyAccessor propertyAccessor ) { try { diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/verification/CompositeDuplicateCheckingCollector.java b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/verification/CompositeDuplicateCheckingCollector.java index a00e1be03e6e5..36630c78de970 100644 --- a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/verification/CompositeDuplicateCheckingCollector.java +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/verification/CompositeDuplicateCheckingCollector.java @@ -27,7 +27,7 @@ import org.neo4j.internal.kernel.api.exceptions.KernelException; import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; import org.neo4j.kernel.api.impl.schema.LuceneDocumentStructure; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.values.storable.Value; public class CompositeDuplicateCheckingCollector extends DuplicateCheckingCollector diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/verification/DuplicateCheckingCollector.java b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/verification/DuplicateCheckingCollector.java index e0a55eb568f07..337ae662c62a2 100644 --- a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/verification/DuplicateCheckingCollector.java +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/verification/DuplicateCheckingCollector.java @@ -30,7 +30,7 @@ import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; import org.neo4j.kernel.api.impl.schema.LuceneDocumentStructure; import org.neo4j.kernel.api.impl.schema.verification.DuplicateCheckStrategy.BucketsDuplicateCheckStrategy; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.values.storable.Value; public class DuplicateCheckingCollector extends SimpleCollector diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/verification/PartitionedUniquenessVerifier.java b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/verification/PartitionedUniquenessVerifier.java index b2140091758f1..5c8bbb0c2fc11 100644 --- a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/verification/PartitionedUniquenessVerifier.java +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/verification/PartitionedUniquenessVerifier.java @@ -43,7 +43,7 @@ import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; import org.neo4j.kernel.api.impl.index.partition.PartitionSearcher; import org.neo4j.kernel.api.impl.schema.LuceneDocumentStructure; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.values.storable.Value; import static java.util.stream.Collectors.toList; diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/verification/SimpleUniquenessVerifier.java b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/verification/SimpleUniquenessVerifier.java index d209654439cd0..5339a95ee9cbf 100644 --- a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/verification/SimpleUniquenessVerifier.java +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/verification/SimpleUniquenessVerifier.java @@ -34,7 +34,7 @@ import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; import org.neo4j.kernel.api.impl.index.partition.PartitionSearcher; import org.neo4j.kernel.api.impl.schema.LuceneDocumentStructure; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.values.storable.Value; /** diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/verification/UniquenessVerifier.java b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/verification/UniquenessVerifier.java index 9420aed57cf5a..5863463551622 100644 --- a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/verification/UniquenessVerifier.java +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/verification/UniquenessVerifier.java @@ -24,7 +24,7 @@ import java.util.List; import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.values.storable.Value; /** diff --git a/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/index/LuceneSchemaIndexUniquenessVerificationIT.java b/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/index/LuceneSchemaIndexUniquenessVerificationIT.java index 8b7a216ef7406..59ffc0aabf477 100644 --- a/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/index/LuceneSchemaIndexUniquenessVerificationIT.java +++ b/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/index/LuceneSchemaIndexUniquenessVerificationIT.java @@ -47,7 +47,7 @@ import org.neo4j.kernel.api.impl.schema.LuceneDocumentStructure; import org.neo4j.kernel.api.impl.schema.LuceneSchemaIndexBuilder; import org.neo4j.kernel.api.impl.schema.SchemaIndex; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.api.schema.index.TestIndexDescriptorFactory; import org.neo4j.kernel.configuration.Config; import org.neo4j.storageengine.api.schema.IndexDescriptor; diff --git a/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/index/TestPropertyAccessor.java b/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/index/TestPropertyAccessor.java index ce3f201a4d419..242939a12d9b5 100644 --- a/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/index/TestPropertyAccessor.java +++ b/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/index/TestPropertyAccessor.java @@ -21,7 +21,7 @@ import java.util.List; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.values.storable.Value; public class TestPropertyAccessor implements NodePropertyAccessor diff --git a/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/index/verification/PartitionedUniquenessVerifierTest.java b/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/index/verification/PartitionedUniquenessVerifierTest.java index 1299d372e87e8..298398f9fa99d 100644 --- a/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/index/verification/PartitionedUniquenessVerifierTest.java +++ b/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/index/verification/PartitionedUniquenessVerifierTest.java @@ -33,7 +33,7 @@ import org.neo4j.kernel.api.impl.schema.LuceneDocumentStructure; import org.neo4j.kernel.api.impl.schema.verification.DuplicateCheckingCollector; import org.neo4j.kernel.api.impl.schema.verification.PartitionedUniquenessVerifier; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.values.storable.Values; import static org.mockito.ArgumentMatchers.any; diff --git a/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/index/verification/SimpleUniquenessVerifierTest.java b/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/index/verification/SimpleUniquenessVerifierTest.java index 7ff6a09478c45..40edaec5fb24f 100644 --- a/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/index/verification/SimpleUniquenessVerifierTest.java +++ b/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/index/verification/SimpleUniquenessVerifierTest.java @@ -45,7 +45,7 @@ import org.neo4j.kernel.api.impl.schema.LuceneDocumentStructure; import org.neo4j.kernel.api.impl.schema.verification.SimpleUniquenessVerifier; import org.neo4j.kernel.api.impl.schema.verification.UniquenessVerifier; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.test.extension.Inject; import org.neo4j.test.extension.TestDirectoryExtension; import org.neo4j.test.rule.TestDirectory; diff --git a/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/LuceneSchemaIndexPopulatorTest.java b/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/LuceneSchemaIndexPopulatorTest.java index 82703d628f344..beea3e90bcd30 100644 --- a/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/LuceneSchemaIndexPopulatorTest.java +++ b/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/LuceneSchemaIndexPopulatorTest.java @@ -44,7 +44,7 @@ import org.neo4j.kernel.api.index.IndexProvider; import org.neo4j.kernel.api.index.IndexQueryHelper; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.api.index.IndexStoreView; import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingConfig; diff --git a/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/populator/UniqueDatabaseIndexPopulatingUpdaterTest.java b/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/populator/UniqueDatabaseIndexPopulatingUpdaterTest.java index 2bb8748703e4e..14918d07ffa92 100644 --- a/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/populator/UniqueDatabaseIndexPopulatingUpdaterTest.java +++ b/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/populator/UniqueDatabaseIndexPopulatingUpdaterTest.java @@ -29,7 +29,7 @@ import org.neo4j.kernel.api.exceptions.index.IndexEntryConflictException; import org.neo4j.kernel.api.impl.schema.SchemaIndex; import org.neo4j.kernel.api.impl.schema.writer.LuceneIndexWriter; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.api.schema.SchemaDescriptorFactory; import org.neo4j.kernel.impl.api.index.sampling.UniqueIndexSampler; import org.neo4j.storageengine.api.schema.IndexSample; diff --git a/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/populator/UniqueDatabaseIndexPopulatorTest.java b/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/populator/UniqueDatabaseIndexPopulatorTest.java index 09267b5ba4998..94be9eda334fe 100644 --- a/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/populator/UniqueDatabaseIndexPopulatorTest.java +++ b/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/populator/UniqueDatabaseIndexPopulatorTest.java @@ -46,7 +46,7 @@ import org.neo4j.kernel.api.impl.schema.SchemaIndex; import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.kernel.api.index.NodePropertyAccessor; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.api.schema.SchemaDescriptorFactory; import org.neo4j.kernel.api.schema.index.TestIndexDescriptorFactory; import org.neo4j.kernel.configuration.Config; diff --git a/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/reader/SimpleIndexReaderDistinctValuesTest.java b/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/reader/SimpleIndexReaderDistinctValuesTest.java index 2191fae7945fa..85b3873ac25f4 100644 --- a/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/reader/SimpleIndexReaderDistinctValuesTest.java +++ b/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/reader/SimpleIndexReaderDistinctValuesTest.java @@ -35,6 +35,7 @@ import org.neo4j.kernel.api.schema.SchemaDescriptorFactory; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.index.schema.GatheringNodeValueClient; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.storageengine.api.schema.IndexDescriptorFactory; import org.neo4j.storageengine.api.schema.IndexReader; import org.neo4j.test.rule.RandomRule; @@ -46,6 +47,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.neo4j.kernel.api.impl.schema.LuceneDocumentStructure.documentRepresentingProperties; import static org.neo4j.values.storable.Values.stringValue; @@ -92,9 +95,10 @@ public void shouldGetDistinctStringValues() throws IOException // when/then GatheringNodeValueClient client = new GatheringNodeValueClient(); + NodePropertyAccessor propertyAccessor = mock( NodePropertyAccessor.class ); try ( IndexReader reader = index.getIndexReader() ) { - reader.distinctValues( client ); + reader.distinctValues( client, propertyAccessor ); while ( client.progressor.next() ) { Value value = client.values[0]; @@ -104,6 +108,7 @@ public void shouldGetDistinctStringValues() throws IOException } assertTrue( expectedCounts.isEmpty() ); } + verifyNoMoreInteractions( propertyAccessor ); } @Test @@ -121,9 +126,10 @@ public void shouldCountDistinctValues() throws IOException // when/then GatheringNodeValueClient client = new GatheringNodeValueClient(); + NodePropertyAccessor propertyAccessor = mock( NodePropertyAccessor.class ); try ( IndexReader reader = index.getIndexReader() ) { - reader.distinctValues( client ); + reader.distinctValues( client, propertyAccessor ); int actualCount = 0; while ( client.progressor.next() ) { @@ -131,5 +137,6 @@ public void shouldCountDistinctValues() throws IOException } assertEquals( expectedCount, actualCount ); } + verifyNoMoreInteractions( propertyAccessor ); } }