diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/ConflictDetectingValueMerger.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/ConflictDetectingValueMerger.java index 7754f7f482904..352dc90bc3c15 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/ConflictDetectingValueMerger.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/ConflictDetectingValueMerger.java @@ -30,7 +30,7 @@ * * @param type of values being merged. */ -class ConflictDetectingValueMerger implements ValueMerger +public class ConflictDetectingValueMerger implements ValueMerger { private boolean conflict; private long existingNodeId; @@ -51,7 +51,7 @@ public VALUE merge( KEY existingKey, KEY newKey, VALUE existingValue, VALUE newV /** * @return whether or not merge conflicted with an existing key. This call also clears the conflict flag. */ - boolean wasConflict() + public boolean wasConflict() { boolean result = conflict; if ( conflict ) @@ -61,12 +61,12 @@ boolean wasConflict() return result; } - long existingNodeId() + public long existingNodeId() { return existingNodeId; } - long addedNodeId() + public long addedNodeId() { return addedNodeId; } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/FailureHeaderWriter.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/FailureHeaderWriter.java index 7e4e0e504b0e6..17d1fdaa78d67 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/FailureHeaderWriter.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/FailureHeaderWriter.java @@ -46,7 +46,7 @@ class FailureHeaderWriter implements Consumer public void accept( PageCursor cursor ) { byte[] bytesToWrite = failureBytes; - cursor.putByte( NativeSchemaNumberIndexPopulator.BYTE_FAILED ); + cursor.putByte( NativeSchemaIndexPopulator.BYTE_FAILED ); int availableSpace = cursor.getCurrentPageSize() - cursor.getOffset(); if ( bytesToWrite.length + HEADER_LENGTH_FIELD_LENGTH > availableSpace ) { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/FullScanNonUniqueIndexSampler.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/FullScanNonUniqueIndexSampler.java index f6f0aad812468..2df22e9415f78 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/FullScanNonUniqueIndexSampler.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/FullScanNonUniqueIndexSampler.java @@ -37,14 +37,14 @@ * @param type of keys in tree. * @param type of values in tree. */ -class FullScanNonUniqueIndexSampler +public class FullScanNonUniqueIndexSampler extends NonUniqueIndexSampler.Adapter { private final GBPTree gbpTree; private final Layout layout; private final IndexSamplingConfig samplingConfig; - FullScanNonUniqueIndexSampler( GBPTree gbpTree, Layout layout, + public FullScanNonUniqueIndexSampler( GBPTree gbpTree, Layout layout, IndexSamplingConfig samplingConfig ) { this.gbpTree = gbpTree; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberAllEntriesReader.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeAllEntriesReader.java similarity index 92% rename from community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberAllEntriesReader.java rename to community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeAllEntriesReader.java index ec6772e35cfa4..7938ecd6aab4e 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberAllEntriesReader.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeAllEntriesReader.java @@ -30,13 +30,13 @@ import org.neo4j.index.internal.gbptree.Hit; import org.neo4j.index.internal.gbptree.Layout; -public class NumberAllEntriesReader implements BoundedIterable +public class NativeAllEntriesReader implements BoundedIterable { private final GBPTree tree; private final Layout layout; private RawCursor,IOException> seeker; - NumberAllEntriesReader( GBPTree tree, Layout layout ) + public NativeAllEntriesReader( GBPTree tree, Layout layout ) { this.tree = tree; this.layout = layout; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberHitIndexProgressor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeHitIndexProgressor.java similarity index 90% rename from community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberHitIndexProgressor.java rename to community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeHitIndexProgressor.java index 7737ff5d5a0e8..f3c20a4dcae21 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberHitIndexProgressor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeHitIndexProgressor.java @@ -27,14 +27,14 @@ import org.neo4j.index.internal.gbptree.Hit; import org.neo4j.storageengine.api.schema.IndexProgressor; -public class NumberHitIndexProgressor implements IndexProgressor +public class NativeHitIndexProgressor implements IndexProgressor { private final RawCursor,IOException> seeker; private final NodeValueClient client; private final Collection,IOException>> toRemoveFromOnClose; private boolean closed; - NumberHitIndexProgressor( RawCursor,IOException> seeker, NodeValueClient client, + public NativeHitIndexProgressor( RawCursor,IOException> seeker, NodeValueClient client, Collection,IOException>> toRemoveFromOnClose ) { this.seeker = seeker; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeNonUniqueSchemaNumberIndexPopulator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeNonUniqueSchemaIndexPopulator.java similarity index 87% rename from community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeNonUniqueSchemaNumberIndexPopulator.java rename to community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeNonUniqueSchemaIndexPopulator.java index 4a95216c150d7..f3e615a7d07cd 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeNonUniqueSchemaNumberIndexPopulator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeNonUniqueSchemaIndexPopulator.java @@ -35,16 +35,16 @@ import org.neo4j.storageengine.api.schema.IndexSample; /** - * {@link NativeSchemaNumberIndexPopulator} which can accept duplicate values (for different entity ids). + * {@link NativeSchemaIndexPopulator} which can accept duplicate values (for different entity ids). */ -class NativeNonUniqueSchemaNumberIndexPopulator - extends NativeSchemaNumberIndexPopulator +public class NativeNonUniqueSchemaIndexPopulator + extends NativeSchemaIndexPopulator { private final IndexSamplingConfig samplingConfig; private boolean updateSampling; private NonUniqueIndexSampler sampler; - NativeNonUniqueSchemaNumberIndexPopulator( PageCache pageCache, FileSystemAbstraction fs, File storeFile, Layout layout, + public NativeNonUniqueSchemaIndexPopulator( PageCache pageCache, FileSystemAbstraction fs, File storeFile, Layout layout, IndexSamplingConfig samplingConfig, SchemaIndexProvider.Monitor monitor, IndexDescriptor descriptor, long indexId ) { super( pageCache, fs, storeFile, layout, monitor, descriptor, indexId ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndex.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndex.java similarity index 83% rename from community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndex.java rename to community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndex.java index 294ef67b0f66f..7a291e1e912ed 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndex.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndex.java @@ -38,19 +38,19 @@ import static org.neo4j.helpers.collection.MapUtil.map; import static org.neo4j.index.internal.gbptree.GBPTree.NO_HEADER_READER; -class NativeSchemaNumberIndex +public class NativeSchemaIndex { final PageCache pageCache; - final File storeFile; - final Layout layout; - final GBPTreeFileUtil gbpTreeFileUtil; - final IndexDescriptor descriptor; + protected final File storeFile; + protected final Layout layout; + protected final GBPTreeFileUtil gbpTreeFileUtil; + protected final IndexDescriptor descriptor; private final long indexId; private final SchemaIndexProvider.Monitor monitor; - GBPTree tree; + protected GBPTree tree; - NativeSchemaNumberIndex( PageCache pageCache, FileSystemAbstraction fs, File storeFile, Layout layout, + public NativeSchemaIndex( PageCache pageCache, FileSystemAbstraction fs, File storeFile, Layout layout, SchemaIndexProvider.Monitor monitor, IndexDescriptor descriptor, long indexId ) { this.pageCache = pageCache; @@ -62,7 +62,7 @@ class NativeSchemaNumberIndex headerWriter ) + public void instantiateTree( RecoveryCleanupWorkCollector recoveryCleanupWorkCollector, Consumer headerWriter ) throws IOException { ensureDirectoryExist(); @@ -92,12 +92,12 @@ private void ensureDirectoryExist() throws IOException gbpTreeFileUtil.mkdirs( storeFile.getParentFile() ); } - void closeTree() throws IOException + public void closeTree() throws IOException { tree = closeIfPresent( tree ); } - T closeIfPresent( T closeable ) throws IOException + public T closeIfPresent( T closeable ) throws IOException { if ( closeable != null ) { @@ -106,7 +106,7 @@ T closeIfPresent( T closeable ) throws IOException return null; } - void assertOpen() + public void assertOpen() { if ( tree == null ) { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexAccessor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexAccessor.java similarity index 84% rename from community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexAccessor.java rename to community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexAccessor.java index 837716632ebc6..22880ade45c81 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexAccessor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexAccessor.java @@ -44,13 +44,13 @@ import static org.neo4j.helpers.collection.Iterators.iterator; import static org.neo4j.index.internal.gbptree.GBPTree.NO_HEADER_WRITER; -public class NativeSchemaNumberIndexAccessor - extends NativeSchemaNumberIndex implements IndexAccessor +public abstract class NativeSchemaIndexAccessor + extends NativeSchemaIndex implements IndexAccessor { - private final NativeSchemaNumberIndexUpdater singleUpdater; - private final IndexSamplingConfig samplingConfig; + private final NativeSchemaIndexUpdater singleUpdater; + protected final IndexSamplingConfig samplingConfig; - NativeSchemaNumberIndexAccessor( + NativeSchemaIndexAccessor( PageCache pageCache, FileSystemAbstraction fs, File storeFile, @@ -62,7 +62,7 @@ public class NativeSchemaNumberIndexAccessor( layout.newKey(), layout.newValue() ); + singleUpdater = new NativeSchemaIndexUpdater<>( layout.newKey(), layout.newValue() ); this.samplingConfig = samplingConfig; instantiateTree( recoveryCleanupWorkCollector, NO_HEADER_WRITER ); } @@ -107,17 +107,12 @@ public void close() throws IOException closeTree(); } - @Override - public IndexReader newReader() - { - assertOpen(); - return new NativeSchemaNumberIndexReader<>( tree, layout, samplingConfig, descriptor ); - } + public abstract IndexReader newReader(); @Override public BoundedIterable newAllEntriesReader() { - return new NumberAllEntriesReader<>( tree, layout ); + return new NativeAllEntriesReader<>( tree, layout ); } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexHeaderReader.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexHeaderReader.java index e39d1587e28d2..2fd114ff89b6c 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexHeaderReader.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexHeaderReader.java @@ -24,12 +24,12 @@ import org.neo4j.index.internal.gbptree.Header; -import static org.neo4j.kernel.impl.index.schema.NativeSchemaNumberIndexPopulator.BYTE_FAILED; +import static org.neo4j.kernel.impl.index.schema.NativeSchemaIndexPopulator.BYTE_FAILED; -class NativeSchemaIndexHeaderReader implements Header.Reader +public class NativeSchemaIndexHeaderReader implements Header.Reader { - byte state; - String failureMessage; + public byte state; + public String failureMessage; @Override public void read( ByteBuffer headerData ) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexHeaderWriter.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexHeaderWriter.java index 235acd40d209c..b9ca931b779b7 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexHeaderWriter.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexHeaderWriter.java @@ -27,11 +27,11 @@ /** * Writes index state in the {@link GBPTree} header. */ -class NativeSchemaIndexHeaderWriter implements Consumer +public class NativeSchemaIndexHeaderWriter implements Consumer { private final byte state; - NativeSchemaIndexHeaderWriter( byte state ) + public NativeSchemaIndexHeaderWriter( byte state ) { this.state = state; } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexPopulator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexPopulator.java similarity index 90% rename from community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexPopulator.java rename to community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexPopulator.java index a901609ad3612..7534da6cb8dff 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexPopulator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexPopulator.java @@ -49,15 +49,15 @@ /** * {@link IndexPopulator} backed by a {@link GBPTree}. * - * @param type of {@link SchemaNumberKey}. - * @param type of {@link SchemaNumberValue}. + * @param type of {@link NativeSchemaKey}. + * @param type of {@link NativeSchemaValue}. */ -public abstract class NativeSchemaNumberIndexPopulator - extends NativeSchemaNumberIndex implements IndexPopulator +public abstract class NativeSchemaIndexPopulator + extends NativeSchemaIndex implements IndexPopulator { - static final byte BYTE_FAILED = 0; - static final byte BYTE_ONLINE = 1; - static final byte BYTE_POPULATING = 2; + public static final byte BYTE_FAILED = 0; + public static final byte BYTE_ONLINE = 1; + public static final byte BYTE_POPULATING = 2; private final KEY treeKey; private final VALUE treeValue; @@ -68,7 +68,7 @@ public abstract class NativeSchemaNumberIndexPopulator layout, + NativeSchemaIndexPopulator( PageCache pageCache, FileSystemAbstraction fs, File storeFile, Layout layout, SchemaIndexProvider.Monitor monitor, IndexDescriptor descriptor, long indexId ) { super( pageCache, fs, storeFile, layout, monitor, descriptor, indexId ); @@ -242,7 +242,7 @@ void closeWriter() throws IOException singleTreeWriter = closeIfPresent( singleTreeWriter ); } - private static class IndexUpdateApply + private static class IndexUpdateApply { private final KEY treeKey; private final VALUE treeValue; @@ -260,11 +260,11 @@ private static class IndexUpdateApply indexEntryUpdate ) throws Exception { - NativeSchemaNumberIndexUpdater.processUpdate( treeKey, treeValue, indexEntryUpdate, writer, conflictDetectingValueMerger ); + NativeSchemaIndexUpdater.processUpdate( treeKey, treeValue, indexEntryUpdate, writer, conflictDetectingValueMerger ); } } - private static class IndexUpdateWork + private static class IndexUpdateWork implements Work,IndexUpdateWork> { private final Collection> updates; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexReader.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexReader.java similarity index 53% rename from community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexReader.java rename to community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexReader.java index a0192893efbda..46d6a2af79e28 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexReader.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexReader.java @@ -19,24 +19,18 @@ */ package org.neo4j.kernel.impl.index.schema; -import org.apache.commons.lang3.ArrayUtils; - import java.io.IOException; import java.io.UncheckedIOException; -import java.util.Arrays; import java.util.HashSet; import java.util.Set; import org.neo4j.collection.primitive.PrimitiveLongResourceIterator; import org.neo4j.cursor.RawCursor; -import org.neo4j.helpers.ArrayUtil; import org.neo4j.index.internal.gbptree.GBPTree; import org.neo4j.index.internal.gbptree.Hit; import org.neo4j.index.internal.gbptree.Layout; import org.neo4j.internal.kernel.api.IndexOrder; import org.neo4j.internal.kernel.api.IndexQuery; -import org.neo4j.internal.kernel.api.IndexQuery.ExactPredicate; -import org.neo4j.internal.kernel.api.IndexQuery.NumberRangePredicate; import org.neo4j.io.IOUtils; import org.neo4j.kernel.api.exceptions.index.IndexNotApplicableKernelException; import org.neo4j.kernel.api.schema.index.IndexDescriptor; @@ -45,20 +39,18 @@ import org.neo4j.storageengine.api.schema.IndexReader; import org.neo4j.storageengine.api.schema.IndexSampler; import org.neo4j.values.storable.Value; -import org.neo4j.values.storable.ValueGroup; - -import static java.lang.String.format; -class NativeSchemaNumberIndexReader +public abstract class NativeSchemaIndexReader implements IndexReader { - private final GBPTree tree; - private final Layout layout; - private final IndexSamplingConfig samplingConfig; + protected final GBPTree tree; + protected final Layout layout; + protected final IndexSamplingConfig samplingConfig; + private final Set,IOException>> openSeekers; - private final IndexDescriptor descriptor; + protected final IndexDescriptor descriptor; - NativeSchemaNumberIndexReader( GBPTree tree, Layout layout, + NativeSchemaIndexReader( GBPTree tree, Layout layout, IndexSamplingConfig samplingConfig, IndexDescriptor descriptor ) { @@ -123,96 +115,12 @@ public PrimitiveLongResourceIterator query( IndexQuery... predicates ) throws In return nodeValueIterator; } - @Override - public void query( IndexProgressor.NodeValueClient cursor, IndexOrder indexOrder, IndexQuery... predicates ) - { - validateQuery( indexOrder, predicates ); - - KEY treeKeyFrom = layout.newKey(); - KEY treeKeyTo = layout.newKey(); - - IndexQuery predicate = predicates[0]; - switch ( predicate.type() ) - { - case exists: - treeKeyFrom.initAsLowest(); - treeKeyTo.initAsHighest(); - startSeekForInitializedRange( cursor, treeKeyFrom, treeKeyTo, predicates ); - break; - case exact: - ExactPredicate exactPredicate = (ExactPredicate) predicate; - treeKeyFrom.from( Long.MIN_VALUE, exactPredicate.value() ); - treeKeyTo.from( Long.MAX_VALUE, exactPredicate.value() ); - startSeekForInitializedRange( cursor, treeKeyFrom, treeKeyTo, predicates ); - break; - case rangeNumeric: - NumberRangePredicate rangePredicate = (NumberRangePredicate) predicate; - initFromForRange( rangePredicate, treeKeyFrom ); - initToForRange( rangePredicate, treeKeyTo ); - startSeekForInitializedRange( cursor, treeKeyFrom, treeKeyTo, predicates ); - break; - default: - throw new IllegalArgumentException( "IndexQuery of type " + predicate.type() + " is not supported." ); - } - } - - private void validateQuery( IndexOrder indexOrder, IndexQuery[] predicates ) - { - if ( predicates.length != 1 ) - { - throw new UnsupportedOperationException(); - } - - if ( indexOrder != IndexOrder.NONE ) - { - ValueGroup valueGroup = predicates[0].valueGroup(); - IndexOrder[] capability = NativeSchemaNumberIndexProvider.CAPABILITY.orderCapability( valueGroup ); - if ( !ArrayUtil.contains( capability, indexOrder ) ) - { - capability = ArrayUtils.add( capability, IndexOrder.NONE ); - throw new UnsupportedOperationException( - format( "Tried to query index with unsupported order %s. Supported orders for query %s are %s.", - indexOrder, Arrays.toString( predicates ), Arrays.toString( capability ) ) ); - } - } - } - - private void initToForRange( NumberRangePredicate rangePredicate, KEY treeKeyTo ) - { - Value toValue = rangePredicate.toAsValue(); - if ( toValue.valueGroup() == ValueGroup.NO_VALUE ) - { - treeKeyTo.initAsHighest(); - } - else - { - treeKeyTo.from( rangePredicate.toInclusive() ? Long.MAX_VALUE : Long.MIN_VALUE, toValue ); - treeKeyTo.entityIdIsSpecialTieBreaker = true; - } - } - - private void initFromForRange( NumberRangePredicate rangePredicate, KEY treeKeyFrom ) - { - Value fromValue = rangePredicate.fromAsValue(); - if ( fromValue.valueGroup() == ValueGroup.NO_VALUE ) - { - treeKeyFrom.initAsLowest(); - } - else - { - treeKeyFrom.from( rangePredicate.fromInclusive() ? Long.MIN_VALUE : Long.MAX_VALUE, fromValue ); - treeKeyFrom.entityIdIsSpecialTieBreaker = true; - } - } + public abstract void query( IndexProgressor.NodeValueClient cursor, IndexOrder indexOrder, IndexQuery... predicates ); @Override - public boolean hasFullNumberPrecision( IndexQuery... predicates ) - { - return true; - } + public abstract boolean hasFullNumberPrecision( IndexQuery... predicates ); - private void startSeekForInitializedRange( IndexProgressor.NodeValueClient client, KEY treeKeyFrom, KEY treeKeyTo, - IndexQuery[] query ) + void startSeekForInitializedRange( IndexProgressor.NodeValueClient client, KEY treeKeyFrom, KEY treeKeyTo, IndexQuery[] query ) { if ( layout.compare( treeKeyFrom, treeKeyTo ) > 0 ) { @@ -223,7 +131,7 @@ private void startSeekForInitializedRange( IndexProgressor.NodeValueClient clien { RawCursor,IOException> seeker = tree.seek( treeKeyFrom, treeKeyTo ); openSeekers.add( seeker ); - IndexProgressor hitProgressor = new NumberHitIndexProgressor<>( seeker, client, openSeekers ); + IndexProgressor hitProgressor = new NativeHitIndexProgressor<>( seeker, client, openSeekers ); client.initialize( descriptor, hitProgressor, query ); } catch ( IOException e ) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexUpdater.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexUpdater.java similarity index 84% rename from community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexUpdater.java rename to community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexUpdater.java index 15eb2e1d1121a..c8f2829461999 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexUpdater.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexUpdater.java @@ -27,7 +27,7 @@ import org.neo4j.kernel.api.index.IndexUpdater; import org.neo4j.values.storable.ValueTuple; -class NativeSchemaNumberIndexUpdater +public class NativeSchemaIndexUpdater implements IndexUpdater { private final KEY treeKey; @@ -38,14 +38,14 @@ class NativeSchemaNumberIndexUpdater(); } - NativeSchemaNumberIndexUpdater initialize( Writer writer, boolean manageClosingOfWriter ) + public NativeSchemaIndexUpdater initialize( Writer writer, boolean manageClosingOfWriter ) { if ( !closed ) { @@ -83,7 +83,7 @@ private void assertOpen() } } - static void processUpdate( KEY treeKey, VALUE treeValue, + public static void processUpdate( KEY treeKey, VALUE treeValue, IndexEntryUpdate update, Writer writer, ConflictDetectingValueMerger conflictDetectingValueMerger ) throws IOException, IndexEntryConflictException { @@ -103,7 +103,7 @@ static void proce } } - private static void processRemove( KEY treeKey, + private static void processRemove( KEY treeKey, IndexEntryUpdate update, Writer writer ) throws IOException { // todo Do we need to verify that we actually removed something at all? @@ -112,7 +112,7 @@ private static vo writer.remove( treeKey ); } - private static void processChange( KEY treeKey, VALUE treeValue, + private static void processChange( KEY treeKey, VALUE treeValue, IndexEntryUpdate update, Writer writer, ConflictDetectingValueMerger conflictDetectingValueMerger ) throws IOException, IndexEntryConflictException @@ -127,7 +127,7 @@ private static vo assertNoConflict( update, conflictDetectingValueMerger ); } - static void processAdd( KEY treeKey, VALUE treeValue, + public static void processAdd( KEY treeKey, VALUE treeValue, IndexEntryUpdate update, Writer writer, ConflictDetectingValueMerger conflictDetectingValueMerger ) throws IOException, IndexEntryConflictException @@ -138,7 +138,7 @@ static void proce assertNoConflict( update, conflictDetectingValueMerger ); } - private static void assertNoConflict( IndexEntryUpdate update, + private static void assertNoConflict( IndexEntryUpdate update, ConflictDetectingValueMerger conflictDetectingValueMerger ) throws IndexEntryConflictException { if ( conflictDetectingValueMerger.wasConflict() ) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaKey.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaKey.java new file mode 100644 index 0000000000000..357cd042db7f5 --- /dev/null +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaKey.java @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2002-2017 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.neo4j.kernel.impl.index.schema; + +import org.neo4j.index.internal.gbptree.GBPTree; +import org.neo4j.values.storable.NumberValue; +import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.ValueWriter; + +/** + * Includes value and entity id (to be able to handle non-unique values). + * A value can be any {@link Number} and is represented as a {@code long} to store the raw bits and a type + * to say if it's a long, double or float. + * + * Distinction between double and float exists because coersions between each other and long may differ. + * TODO this should be figured out and potentially reduced to long, double types only. + */ +public abstract class NativeSchemaKey extends ValueWriter.Adapter +{ +// public static final int SIZE = +// Byte.BYTES + /* type of value */ +// Long.BYTES + /* raw value bits */ +// +// // TODO this could use 6 bytes instead and have the highest 2 bits stored in the type byte +// Long.BYTES; /* entityId */ + + public byte type; + public long rawValueBits; + public long entityId; + + /** + * Marks that comparisons with this key requires also comparing entityId, this allows functionality + * of inclusive/exclusive bounds of range queries. + * This is because {@link GBPTree} only support from inclusive and to exclusive. + *

+ * Note that {@code entityIdIsSpecialTieBreaker} is only an in memory state. + */ + public boolean entityIdIsSpecialTieBreaker; + + public void from( long entityId, Value... values ) + { + extractRawBitsAndType( assertValidValue( values ) ); + this.entityId = entityId; + entityIdIsSpecialTieBreaker = false; + } + + public abstract Value assertValidValue( Value... values ); + + public String propertiesAsString() + { + return asValue().toString(); + } + + public abstract NumberValue asValue(); + + public abstract void initAsLowest(); + + public abstract void initAsHighest(); + /** + * Compares the value of this key to that of another key. + * This method is expected to be called in scenarios where inconsistent reads may happen (and later retried). + * + * @param other the {@link NativeSchemaKey} to compare to. + * @return comparison against the {@code other} {@link NativeSchemaKey}. + */ + public int compareValueTo( NativeSchemaKey other ) + { + return RawBits.compare( rawValueBits, type, other.rawValueBits, other.type ); + } + + /** + * Extracts raw bits and type from a {@link Value} and store as state of this {@link NativeSchemaKey} instance. + * + * @param value actual {@link Value} value. + */ + private void extractRawBitsAndType( Value value ) + { + value.writeTo( this ); + } + + @Override + public abstract String toString(); +} diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SchemaNumberValue.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaValue.java similarity index 82% rename from community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SchemaNumberValue.java rename to community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaValue.java index 754fc1ea9bb05..10900370e186d 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SchemaNumberValue.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaValue.java @@ -25,18 +25,18 @@ /** * Value in a {@link GBPTree} handling numbers suitable for schema indexing. * - * NOTE: For the time being no data exists in {@link SchemaNumberValue}, but since the layout is under development + * NOTE: For the time being no data exists in {@link NativeSchemaValue}, but since the layout is under development * it's very convenient to have this class still exist so that it's very easy to try out different types * of layouts without changing the entire stack of arguments. In the end it may just be that this class * will be deleted, but for now it sticks around. */ -class SchemaNumberValue +public class NativeSchemaValue { - static final int SIZE = 0; + public static final int SIZE = 0; - static final SchemaNumberValue INSTANCE = new SchemaNumberValue(); + public static final NativeSchemaValue INSTANCE = new NativeSchemaValue(); - void from( Value... values ) + public void from( Value... values ) { // not needed a.t.m. } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSelector.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSelector.java index f6aed81cd066c..15e4d578c8827 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSelector.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSelector.java @@ -26,7 +26,7 @@ public class NativeSelector implements FusionSchemaIndexProvider.Selector { @Override - public T select( T nativeInstance, T luceneInstance, Value... values ) + public T select( T numberInstance, T luceneInstance, Value... values ) { if ( values.length > 1 ) { @@ -38,7 +38,7 @@ public T select( T nativeInstance, T luceneInstance, Value... values ) if ( singleValue.valueGroup() == ValueGroup.NUMBER ) { // It's a number, the native can handle this - return nativeInstance; + return numberInstance; } return luceneInstance; } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeUniqueSchemaNumberIndexPopulator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeUniqueSchemaIndexPopulator.java similarity index 82% rename from community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeUniqueSchemaNumberIndexPopulator.java rename to community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeUniqueSchemaIndexPopulator.java index 03d2d71b03e94..353fa87176553 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeUniqueSchemaNumberIndexPopulator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeUniqueSchemaIndexPopulator.java @@ -31,14 +31,14 @@ import org.neo4j.storageengine.api.schema.IndexSample; /** - * {@link NativeSchemaNumberIndexPopulator} which can enforces unique values. + * {@link NativeSchemaIndexPopulator} which can enforces unique values. */ -class NativeUniqueSchemaNumberIndexPopulator - extends NativeSchemaNumberIndexPopulator +public class NativeUniqueSchemaIndexPopulator + extends NativeSchemaIndexPopulator { private final UniqueIndexSampler sampler; - NativeUniqueSchemaNumberIndexPopulator( PageCache pageCache, FileSystemAbstraction fs, File storeFile, Layout layout, + public NativeUniqueSchemaIndexPopulator( PageCache pageCache, FileSystemAbstraction fs, File storeFile, Layout layout, SchemaIndexProvider.Monitor monitor, IndexDescriptor descriptor, long indexId ) { super( pageCache, fs, storeFile, layout, monitor, descriptor, indexId ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberLayout.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberLayout.java index b52e1f6d1ec44..c89fe44fc3514 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberLayout.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberLayout.java @@ -25,17 +25,17 @@ /** * {@link Layout} for numbers where numbers doesn't need to be unique. */ -abstract class NumberLayout extends Layout.Adapter +abstract class NumberLayout extends Layout.Adapter { @Override - public SchemaNumberKey newKey() + public NumberSchemaKey newKey() { - return new SchemaNumberKey(); + return new NumberSchemaKey(); } @Override - public SchemaNumberKey copyKey( SchemaNumberKey key, - SchemaNumberKey into ) + public NumberSchemaKey copyKey( NumberSchemaKey key, + NumberSchemaKey into ) { into.type = key.type; into.rawValueBits = key.rawValueBits; @@ -45,25 +45,25 @@ public SchemaNumberKey copyKey( SchemaNumberKey key, } @Override - public SchemaNumberValue newValue() + public NativeSchemaValue newValue() { - return SchemaNumberValue.INSTANCE; + return NativeSchemaValue.INSTANCE; } @Override public int keySize() { - return SchemaNumberKey.SIZE; + return NumberSchemaKey.SIZE; } @Override public int valueSize() { - return SchemaNumberValue.SIZE; + return NativeSchemaValue.SIZE; } @Override - public void writeKey( PageCursor cursor, SchemaNumberKey key ) + public void writeKey( PageCursor cursor, NumberSchemaKey key ) { cursor.putByte( key.type ); cursor.putLong( key.rawValueBits ); @@ -71,12 +71,12 @@ public void writeKey( PageCursor cursor, SchemaNumberKey key ) } @Override - public void writeValue( PageCursor cursor, SchemaNumberValue value ) + public void writeValue( PageCursor cursor, NativeSchemaValue value ) { } @Override - public void readKey( PageCursor cursor, SchemaNumberKey into ) + public void readKey( PageCursor cursor, NumberSchemaKey into ) { into.type = cursor.getByte(); into.rawValueBits = cursor.getLong(); @@ -84,7 +84,7 @@ public void readKey( PageCursor cursor, SchemaNumberKey into ) } @Override - public void readValue( PageCursor cursor, SchemaNumberValue into ) + public void readValue( PageCursor cursor, NativeSchemaValue into ) { } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NonUniqueNumberLayout.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberLayoutNonUnique.java similarity index 90% rename from community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NonUniqueNumberLayout.java rename to community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberLayoutNonUnique.java index 0c7d290d1d402..d6c3ee954cdd5 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NonUniqueNumberLayout.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberLayoutNonUnique.java @@ -21,12 +21,12 @@ import org.neo4j.index.internal.gbptree.Layout; -public class NonUniqueNumberLayout extends NumberLayout +public class NumberLayoutNonUnique extends NumberLayout { private static final String IDENTIFIER_NAME = "NUNI"; static final int MAJOR_VERSION = 0; static final int MINOR_VERSION = 1; - static long IDENTIFIER = Layout.namedIdentifier( IDENTIFIER_NAME, SchemaNumberValue.SIZE ); + static long IDENTIFIER = Layout.namedIdentifier( IDENTIFIER_NAME, NativeSchemaValue.SIZE ); @Override public long identifier() @@ -47,7 +47,7 @@ public int minorVersion() } @Override - public int compare( SchemaNumberKey o1, SchemaNumberKey o2 ) + public int compare( NumberSchemaKey o1, NumberSchemaKey o2 ) { int comparison = o1.compareValueTo( o2 ); return comparison != 0 ? comparison : Long.compare( o1.entityId, o2.entityId ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/UniqueNumberLayout.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberLayoutUnique.java similarity index 93% rename from community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/UniqueNumberLayout.java rename to community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberLayoutUnique.java index 800bcbd9cdda9..0227c55124c28 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/UniqueNumberLayout.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberLayoutUnique.java @@ -24,12 +24,12 @@ /** * {@link Layout} for numbers where numbers need to be unique. */ -class UniqueNumberLayout extends NumberLayout +class NumberLayoutUnique extends NumberLayout { private static final String IDENTIFIER_NAME = "UNI"; static final int MAJOR_VERSION = 0; static final int MINOR_VERSION = 1; - static long IDENTIFIER = Layout.namedIdentifier( IDENTIFIER_NAME, SchemaNumberKey.SIZE ); + static long IDENTIFIER = Layout.namedIdentifier( IDENTIFIER_NAME, NumberSchemaKey.SIZE ); @Override public long identifier() @@ -51,7 +51,7 @@ public int minorVersion() } @Override - public int compare( SchemaNumberKey o1, SchemaNumberKey o2 ) + public int compare( NumberSchemaKey o1, NumberSchemaKey o2 ) { int comparison = o1.compareValueTo( o2 ); if ( comparison == 0 ) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexAccessor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexAccessor.java new file mode 100644 index 0000000000000..cadf889d56b3b --- /dev/null +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexAccessor.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2002-2017 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.neo4j.kernel.impl.index.schema; + +import java.io.File; +import java.io.IOException; + +import org.neo4j.index.internal.gbptree.Layout; +import org.neo4j.index.internal.gbptree.RecoveryCleanupWorkCollector; +import org.neo4j.io.fs.FileSystemAbstraction; +import org.neo4j.io.pagecache.PageCache; +import org.neo4j.kernel.api.index.SchemaIndexProvider; +import org.neo4j.kernel.api.schema.index.IndexDescriptor; +import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingConfig; +import org.neo4j.storageengine.api.schema.IndexReader; + +public class NumberSchemaIndexAccessor + extends NativeSchemaIndexAccessor +{ + NumberSchemaIndexAccessor( + PageCache pageCache, + FileSystemAbstraction fs, + File storeFile, + Layout layout, + RecoveryCleanupWorkCollector recoveryCleanupWorkCollector, + SchemaIndexProvider.Monitor monitor, + IndexDescriptor descriptor, + long indexId, + IndexSamplingConfig samplingConfig ) throws IOException + { + super( pageCache, fs, storeFile, layout, recoveryCleanupWorkCollector, monitor, descriptor, indexId, samplingConfig ); + } + + @Override + public IndexReader newReader() + { + assertOpen(); + return new NumberSchemaIndexReader<>( tree, layout, samplingConfig, descriptor ); + } +} diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexProvider.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexProvider.java similarity index 86% rename from community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexProvider.java rename to community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexProvider.java index b2ccde84bacdf..b4e1678948da2 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexProvider.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexProvider.java @@ -40,14 +40,14 @@ import org.neo4j.kernel.impl.storemigration.StoreMigrationParticipant; import org.neo4j.values.storable.ValueGroup; -import static org.neo4j.kernel.impl.index.schema.NativeSchemaNumberIndexPopulator.BYTE_FAILED; -import static org.neo4j.kernel.impl.index.schema.NativeSchemaNumberIndexPopulator.BYTE_ONLINE; -import static org.neo4j.kernel.impl.index.schema.NativeSchemaNumberIndexPopulator.BYTE_POPULATING; +import static org.neo4j.kernel.impl.index.schema.NativeSchemaIndexPopulator.BYTE_FAILED; +import static org.neo4j.kernel.impl.index.schema.NativeSchemaIndexPopulator.BYTE_ONLINE; +import static org.neo4j.kernel.impl.index.schema.NativeSchemaIndexPopulator.BYTE_POPULATING; /** * Schema index provider for native indexes backed by e.g. {@link GBPTree}. */ -public class NativeSchemaNumberIndexProvider extends SchemaIndexProvider +public class NumberSchemaIndexProvider extends SchemaIndexProvider { public static final String KEY = "native"; public static final Descriptor NATIVE_PROVIDER_DESCRIPTOR = new Descriptor( KEY, "1.0" ); @@ -59,7 +59,7 @@ public class NativeSchemaNumberIndexProvider extends SchemaIndexProvider private final RecoveryCleanupWorkCollector recoveryCleanupWorkCollector; private final boolean readOnly; - public NativeSchemaNumberIndexProvider( PageCache pageCache, FileSystemAbstraction fs, + public NumberSchemaIndexProvider( PageCache pageCache, FileSystemAbstraction fs, IndexDirectoryStructure.Factory directoryStructure, Monitor monitor, RecoveryCleanupWorkCollector recoveryCleanupWorkCollector, boolean readOnly ) { @@ -83,10 +83,10 @@ public IndexPopulator getPopulator( long indexId, IndexDescriptor descriptor, In switch ( descriptor.type() ) { case GENERAL: - return new NativeNonUniqueSchemaNumberIndexPopulator<>( pageCache, fs, storeFile, new NonUniqueNumberLayout(), samplingConfig, + return new NativeNonUniqueSchemaIndexPopulator<>( pageCache, fs, storeFile, new NumberLayoutNonUnique(), samplingConfig, monitor, descriptor, indexId ); case UNIQUE: - return new NativeUniqueSchemaNumberIndexPopulator<>( pageCache, fs, storeFile, new UniqueNumberLayout(), monitor, descriptor, + return new NativeUniqueSchemaIndexPopulator<>( pageCache, fs, storeFile, new NumberLayoutUnique(), monitor, descriptor, indexId ); default: throw new UnsupportedOperationException( "Can not create index populator of type " + descriptor.type() ); @@ -102,15 +102,15 @@ public IndexAccessor getOnlineAccessor( switch ( descriptor.type() ) { case GENERAL: - layout = new NonUniqueNumberLayout(); + layout = new NumberLayoutNonUnique(); break; case UNIQUE: - layout = new UniqueNumberLayout(); + layout = new NumberLayoutUnique(); break; default: throw new UnsupportedOperationException( "Can not create index accessor of type " + descriptor.type() ); } - return new NativeSchemaNumberIndexAccessor<>( + return new NumberSchemaIndexAccessor<>( pageCache, fs, storeFile, layout, recoveryCleanupWorkCollector, monitor, descriptor, indexId, samplingConfig ); } @@ -197,12 +197,12 @@ private class ReadOnlyMetaNumberLayout extends Layout.ReadOnlyMetaLayout @Override public boolean compatibleWith( long layoutIdentifier, int majorVersion, int minorVersion ) { - return (layoutIdentifier == UniqueNumberLayout.IDENTIFIER && - majorVersion == UniqueNumberLayout.MAJOR_VERSION && - minorVersion == UniqueNumberLayout.MINOR_VERSION) || - (layoutIdentifier == NonUniqueNumberLayout.IDENTIFIER && - majorVersion == NonUniqueNumberLayout.MAJOR_VERSION && - minorVersion == NonUniqueNumberLayout.MINOR_VERSION); + return (layoutIdentifier == NumberLayoutUnique.IDENTIFIER && + majorVersion == NumberLayoutUnique.MAJOR_VERSION && + minorVersion == NumberLayoutUnique.MINOR_VERSION) || + (layoutIdentifier == NumberLayoutNonUnique.IDENTIFIER && + majorVersion == NumberLayoutNonUnique.MAJOR_VERSION && + minorVersion == NumberLayoutNonUnique.MINOR_VERSION); } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexReader.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexReader.java new file mode 100644 index 0000000000000..c7cc2bc437451 --- /dev/null +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexReader.java @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2002-2017 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.neo4j.kernel.impl.index.schema; + +import org.apache.commons.lang3.ArrayUtils; + +import java.util.Arrays; + +import org.neo4j.helpers.ArrayUtil; +import org.neo4j.index.internal.gbptree.GBPTree; +import org.neo4j.index.internal.gbptree.Layout; +import org.neo4j.internal.kernel.api.IndexOrder; +import org.neo4j.internal.kernel.api.IndexQuery; +import org.neo4j.internal.kernel.api.IndexQuery.ExactPredicate; +import org.neo4j.internal.kernel.api.IndexQuery.NumberRangePredicate; +import org.neo4j.kernel.api.schema.index.IndexDescriptor; +import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingConfig; +import org.neo4j.storageengine.api.schema.IndexProgressor; +import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.ValueGroup; + +import static java.lang.String.format; + +class NumberSchemaIndexReader extends NativeSchemaIndexReader +{ + + NumberSchemaIndexReader( GBPTree tree, Layout layout, IndexSamplingConfig samplingConfig, IndexDescriptor descriptor ) + { + super( tree, layout, samplingConfig, descriptor ); + } + + @Override + public void query( IndexProgressor.NodeValueClient cursor, IndexOrder indexOrder, IndexQuery... predicates ) + { + validateQuery( indexOrder, predicates ); + + KEY treeKeyFrom = layout.newKey(); + KEY treeKeyTo = layout.newKey(); + + IndexQuery predicate = predicates[0]; + switch ( predicate.type() ) + { + case exists: + treeKeyFrom.initAsLowest(); + treeKeyTo.initAsHighest(); + startSeekForInitializedRange( cursor, treeKeyFrom, treeKeyTo, predicates ); + break; + case exact: + ExactPredicate exactPredicate = (ExactPredicate) predicate; + treeKeyFrom.from( Long.MIN_VALUE, exactPredicate.value() ); + treeKeyTo.from( Long.MAX_VALUE, exactPredicate.value() ); + startSeekForInitializedRange( cursor, treeKeyFrom, treeKeyTo, predicates ); + break; + case rangeNumeric: + NumberRangePredicate rangePredicate = (NumberRangePredicate) predicate; + initFromForRange( rangePredicate, treeKeyFrom ); + initToForRange( rangePredicate, treeKeyTo ); + startSeekForInitializedRange( cursor, treeKeyFrom, treeKeyTo, predicates ); + break; + default: + throw new IllegalArgumentException( "IndexQuery of type " + predicate.type() + " is not supported." ); + } + } + + private void validateQuery( IndexOrder indexOrder, IndexQuery[] predicates ) + { + if ( predicates.length != 1 ) + { + throw new UnsupportedOperationException(); + } + + if ( indexOrder != IndexOrder.NONE ) + { + ValueGroup valueGroup = predicates[0].valueGroup(); + IndexOrder[] capability = NumberSchemaIndexProvider.CAPABILITY.orderCapability( valueGroup ); + if ( !ArrayUtil.contains( capability, indexOrder ) ) + { + capability = ArrayUtils.add( capability, IndexOrder.NONE ); + throw new UnsupportedOperationException( + format( "Tried to query index with unsupported order %s. Supported orders for query %s are %s.", indexOrder, + Arrays.toString( predicates ), Arrays.toString( capability ) ) ); + } + } + } + + private void initToForRange( NumberRangePredicate rangePredicate, KEY treeKeyTo ) + { + Value toValue = rangePredicate.toAsValue(); + if ( toValue.valueGroup() == ValueGroup.NO_VALUE ) + { + treeKeyTo.initAsHighest(); + } + else + { + treeKeyTo.from( rangePredicate.toInclusive() ? Long.MAX_VALUE : Long.MIN_VALUE, toValue ); + treeKeyTo.entityIdIsSpecialTieBreaker = true; + } + } + + private void initFromForRange( NumberRangePredicate rangePredicate, KEY treeKeyFrom ) + { + Value fromValue = rangePredicate.fromAsValue(); + if ( fromValue.valueGroup() == ValueGroup.NO_VALUE ) + { + treeKeyFrom.initAsLowest(); + } + else + { + treeKeyFrom.from( rangePredicate.fromInclusive() ? Long.MIN_VALUE : Long.MAX_VALUE, fromValue ); + treeKeyFrom.entityIdIsSpecialTieBreaker = true; + } + } + + @Override + public boolean hasFullNumberPrecision( IndexQuery... predicates ) + { + return true; + } +} diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SchemaNumberKey.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberSchemaKey.java similarity index 66% rename from community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SchemaNumberKey.java rename to community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberSchemaKey.java index b346bef9af2f8..60cf5cfe52522 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/SchemaNumberKey.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/NumberSchemaKey.java @@ -19,10 +19,8 @@ */ package org.neo4j.kernel.impl.index.schema; -import org.neo4j.index.internal.gbptree.GBPTree; import org.neo4j.values.storable.NumberValue; import org.neo4j.values.storable.Value; -import org.neo4j.values.storable.ValueWriter; import org.neo4j.values.storable.Values; import static java.lang.String.format; @@ -35,7 +33,7 @@ * Distinction between double and float exists because coersions between each other and long may differ. * TODO this should be figured out and potentially reduced to long, double types only. */ -class SchemaNumberKey extends ValueWriter.Adapter +class NumberSchemaKey extends NativeSchemaKey { static final int SIZE = Byte.BYTES + /* type of value */ @@ -44,27 +42,8 @@ class SchemaNumberKey extends ValueWriter.Adapter // TODO this could use 6 bytes instead and have the highest 2 bits stored in the type byte Long.BYTES; /* entityId */ - byte type; - long rawValueBits; - long entityId; - - /** - * Marks that comparisons with this key requires also comparing entityId, this allows functionality - * of inclusive/exclusive bounds of range queries. - * This is because {@link GBPTree} only support from inclusive and to exclusive. - *

- * Note that {@code entityIdIsSpecialTieBreaker} is only an in memory state. - */ - boolean entityIdIsSpecialTieBreaker; - - void from( long entityId, Value... values ) - { - extractRawBitsAndType( assertValidSingleNumber( values ) ); - this.entityId = entityId; - entityIdIsSpecialTieBreaker = false; - } - - private static NumberValue assertValidSingleNumber( Value... values ) + @Override + public NumberValue assertValidValue( Value... values ) { // TODO: support multiple values, right? if ( values.length > 1 ) @@ -83,52 +62,28 @@ private static NumberValue assertValidSingleNumber( Value... values ) return (NumberValue) values[0]; } - String propertiesAsString() - { - return asValue().toString(); - } - - NumberValue asValue() + @Override + public NumberValue asValue() { return RawBits.asNumberValue( rawValueBits, type ); } - void initAsLowest() + @Override + public void initAsLowest() { writeFloatingPoint( Double.NEGATIVE_INFINITY ); entityId = Long.MIN_VALUE; entityIdIsSpecialTieBreaker = true; } - void initAsHighest() + @Override + public void initAsHighest() { writeFloatingPoint( Double.POSITIVE_INFINITY ); entityId = Long.MAX_VALUE; entityIdIsSpecialTieBreaker = true; } - /** - * Compares the value of this key to that of another key. - * This method is expected to be called in scenarios where inconsistent reads may happen (and later retried). - * - * @param other the {@link SchemaNumberKey} to compare to. - * @return comparison against the {@code other} {@link SchemaNumberKey}. - */ - int compareValueTo( SchemaNumberKey other ) - { - return RawBits.compare( rawValueBits, type, other.rawValueBits, other.type ); - } - - /** - * Extracts raw bits and type from a {@link NumberValue} and store as state of this {@link SchemaNumberKey} instance. - * - * @param value actual {@link NumberValue} value. - */ - private void extractRawBitsAndType( NumberValue value ) - { - value.writeTo( this ); - } - @Override public String toString() { diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/LayoutTestUtil.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/LayoutTestUtil.java index f27f73e5de215..588fde592d790 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/LayoutTestUtil.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/LayoutTestUtil.java @@ -31,15 +31,16 @@ import org.neo4j.helpers.collection.PrefetchingIterator; import org.neo4j.index.internal.gbptree.Layout; +import org.neo4j.internal.kernel.api.IndexQuery; import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.schema.index.IndexDescriptor; import org.neo4j.test.rule.RandomRule; import org.neo4j.values.storable.Value; import org.neo4j.values.storable.Values; -abstract class LayoutTestUtil +abstract class LayoutTestUtil { - private final IndexDescriptor indexDescriptor; + final IndexDescriptor indexDescriptor; LayoutTestUtil( IndexDescriptor indexDescriptor ) { @@ -52,6 +53,10 @@ abstract class LayoutTestUtil - *

  • {@link NativeSchemaNumberIndexAccessor}
  • - *
  • {@link NativeSchemaNumberIndexUpdater}
  • - *
  • {@link NativeSchemaNumberIndexReader}
  • + *
  • {@link NumberSchemaIndexAccessor}
  • + *
  • {@link NativeSchemaIndexUpdater}
  • + *
  • {@link NumberSchemaIndexReader}
  • * */ -public abstract class NativeSchemaNumberIndexAccessorTest - extends SchemaNumberIndexTestUtil +public abstract class NativeSchemaIndexAccessorTest + extends NativeSchemaIndexTestUtil { - private NativeSchemaNumberIndexAccessor accessor; + NativeSchemaIndexAccessor accessor; @Rule public ExpectedException expected = ExpectedException.none(); @@ -99,14 +97,10 @@ public abstract class NativeSchemaNumberIndexAccessorTest( - pageCache, fs, indexFile, layout, IMMEDIATE, monitor, indexDescriptor, indexId, samplingConfig ); - } + abstract NativeSchemaIndexAccessor makeAccessorWithSamplingConfig( IndexSamplingConfig samplingConfig ) throws IOException; @After public void closeAccessor() throws IOException @@ -169,7 +163,7 @@ public void shouldIndexChange() throws Exception for ( int i = 0; i < updates.length; i++ ) { IndexEntryUpdate update = updates[i]; - Object newValue; + Number newValue; switch ( i % 3 ) { case 0: @@ -184,7 +178,7 @@ public void shouldIndexChange() throws Exception default: throw new IllegalArgumentException(); } - updates[i] = change( update.getEntityId(), indexDescriptor, update.values()[0], of( newValue ) ); + updates[i] = change( update.getEntityId(), indexDescriptor, update.values()[0], layoutUtil.asValue( newValue ) ); } // when @@ -251,7 +245,7 @@ public void shouldReturnZeroCountForEmptyIndex() throws Exception try ( IndexReader reader = accessor.newReader() ) { // when - long count = reader.countIndexedNodes( 123, of( 456 ) ); + long count = reader.countIndexedNodes( 123, layoutUtil.asValue( 456 ) ); // then assertEquals( 0, count ); @@ -277,7 +271,7 @@ public void shouldReturnCountOneForExistingData() throws Exception } // and when - long count = reader.countIndexedNodes( 123, of( 456 ) ); + long count = reader.countIndexedNodes( 123, layoutUtil.asValue( 456 ) ); // then assertEquals( 0, count ); @@ -298,7 +292,7 @@ public void shouldReturnCountZeroForMismatchingData() throws Exception { long countWithMismatchingData = reader.countIndexedNodes( update.getEntityId() + 1, update.values() ); long countWithNonExistentEntityId = reader.countIndexedNodes( NON_EXISTENT_ENTITY_ID, update.values() ); - long countWithNonExistentValue = reader.countIndexedNodes( update.getEntityId(), of( NON_EXISTENT_VALUE ) ); + long countWithNonExistentValue = reader.countIndexedNodes( update.getEntityId(), layoutUtil.asValue( NON_EXISTENT_VALUE ) ); // then assertEquals( 0, countWithMismatchingData ); @@ -360,7 +354,7 @@ public void shouldReturnNoEntriesForMismatchingExactPredicate() throws Exception // when IndexReader reader = accessor.newReader(); - Object value = NON_EXISTENT_VALUE; + Object value = layoutUtil.asValue( NON_EXISTENT_VALUE ); PrimitiveLongIterator result = query( reader, IndexQuery.exact( 0, value ) ); assertEntityIdHits( EMPTY_LONG_ARRAY, result ); } @@ -375,8 +369,8 @@ public void shouldReturnMatchingEntriesForRangePredicateWithInclusiveStartAndExc // when IndexReader reader = accessor.newReader(); PrimitiveLongIterator result = query( reader, - IndexQuery.range( 0, Double.NEGATIVE_INFINITY, true, Double.POSITIVE_INFINITY, false ) ); - assertEntityIdHits( extractEntityIds( updates, lessThan( Double.POSITIVE_INFINITY ) ), result ); + layoutUtil.rangeQuery( Double.NEGATIVE_INFINITY, true, Double.POSITIVE_INFINITY, false ) ); + assertEntityIdHits( extractEntityIds( updates, lessThan( layoutUtil.asValue( Double.POSITIVE_INFINITY ) ) ), result ); } @Test @@ -389,7 +383,7 @@ public void shouldReturnMatchingEntriesForRangePredicateWithInclusiveStartAndInc // when IndexReader reader = accessor.newReader(); PrimitiveLongIterator result = query( reader, - IndexQuery.range( 0, Double.NEGATIVE_INFINITY, true, Double.POSITIVE_INFINITY, true ) ); + layoutUtil.rangeQuery( Double.NEGATIVE_INFINITY, true, Double.POSITIVE_INFINITY, true ) ); assertEntityIdHits( extractEntityIds( updates, alwaysTrue() ), result ); } @@ -403,9 +397,9 @@ public void shouldReturnMatchingEntriesForRangePredicateWithExclusiveStartAndExc // when IndexReader reader = accessor.newReader(); PrimitiveLongIterator result = query( reader, - IndexQuery.range( 0, Double.NEGATIVE_INFINITY, false, Double.POSITIVE_INFINITY, false ) ); + layoutUtil.rangeQuery( Double.NEGATIVE_INFINITY, false, Double.POSITIVE_INFINITY, false ) ); assertEntityIdHits( extractEntityIds( updates, - all( greaterThan( Double.NEGATIVE_INFINITY ), lessThan( Double.POSITIVE_INFINITY ) ) ), result ); + all( greaterThan( layoutUtil.asValue( Double.NEGATIVE_INFINITY ) ), lessThan( layoutUtil.asValue( Double.POSITIVE_INFINITY ) ) ) ), result ); } @Test @@ -418,9 +412,12 @@ public void shouldReturnMatchingEntriesForRangePredicateWithExclusiveStartAndInc // when IndexReader reader = accessor.newReader(); PrimitiveLongIterator result = query( reader, - IndexQuery.range( 0, Double.NEGATIVE_INFINITY, false, Double.POSITIVE_INFINITY, true ) ); + layoutUtil.rangeQuery( Double.NEGATIVE_INFINITY, false, Double.POSITIVE_INFINITY, true ) ); assertEntityIdHits( extractEntityIds( updates, - all( greaterThan( Double.NEGATIVE_INFINITY ), greaterThan( Double.NEGATIVE_INFINITY ) ) ), result ); + all( + greaterThan( layoutUtil.asValue( Double.NEGATIVE_INFINITY ) ), + lessThanOrEqual( layoutUtil.asValue( Double.POSITIVE_INFINITY ) ) + ) ), result ); } // @@ -445,41 +442,6 @@ public void throwForUnsupportedIndexOrder() throws Exception reader.query( new SimpleNodeValueClient(), unsupportedOrder, unsupportedQuery ); } - @Test - public void respectIndexOrder() throws Exception - { - // given - IndexEntryUpdate[] someUpdates = layoutUtil.someUpdates(); - processAll( someUpdates ); - Value[] expectedValues = layoutUtil.extractValuesFromUpdates( someUpdates ); - - // when - IndexReader reader = accessor.newReader(); - IndexQuery.NumberRangePredicate supportedQuery = - IndexQuery.range( 0, Double.NEGATIVE_INFINITY, true, Double.POSITIVE_INFINITY, true ); - - for ( IndexOrder supportedOrder : NativeSchemaNumberIndexProvider.CAPABILITY.orderCapability( ValueGroup.NUMBER ) ) - { - if ( supportedOrder == IndexOrder.ASCENDING ) - { - Arrays.sort( expectedValues, Values.COMPARATOR ); - } - if ( supportedOrder == IndexOrder.DESCENDING ) - { - Arrays.sort( expectedValues, Values.COMPARATOR.reversed() ); - } - - SimpleNodeValueClient client = new SimpleNodeValueClient(); - reader.query( client, supportedOrder, supportedQuery ); - int i = 0; - while ( client.next() ) - { - assertEquals( "values in order", expectedValues[i++], client.values[0] ); - } - assertTrue( "found all values", i == expectedValues.length ); - } - } - // @Test @@ -492,7 +454,7 @@ public void shouldReturnNoEntriesForRangePredicateOutsideAnyMatch() throws Excep // when IndexReader reader = accessor.newReader(); PrimitiveLongIterator result = query( reader, - IndexQuery.range( 0, NON_EXISTENT_VALUE, true, NON_EXISTENT_VALUE + 10, true ) ); + layoutUtil.rangeQuery( NON_EXISTENT_VALUE, true, NON_EXISTENT_VALUE + 10, true ) ); assertEntityIdHits( EMPTY_LONG_ARRAY, result ); } @@ -503,18 +465,20 @@ public void mustHandleNestedQueries() throws Exception // given IndexEntryUpdate[] updates = new IndexEntryUpdate[] { - IndexEntryUpdate.add( 0, indexDescriptor, Values.of( 0 ) ), - IndexEntryUpdate.add( 1, indexDescriptor, Values.of( 1 ) ), - IndexEntryUpdate.add( 2, indexDescriptor, Values.of( 2 ) ), - IndexEntryUpdate.add( 3, indexDescriptor, Values.of( 3 ) ) + IndexEntryUpdate.add( 0, indexDescriptor, layoutUtil.asValue( 0 ) ), + IndexEntryUpdate.add( 1, indexDescriptor, layoutUtil.asValue( 1 ) ), + IndexEntryUpdate.add( 2, indexDescriptor, layoutUtil.asValue( 2 ) ), + IndexEntryUpdate.add( 3, indexDescriptor, layoutUtil.asValue( 3 ) ), + IndexEntryUpdate.add( 4, indexDescriptor, layoutUtil.asValue( 4 ) ), + IndexEntryUpdate.add( 5, indexDescriptor, layoutUtil.asValue( 5 ) ) }; processAll( updates ); // when IndexReader reader = accessor.newReader(); - IndexQuery.NumberRangePredicate outerQuery = IndexQuery.range( 0, 2, true, 3, true ); - IndexQuery.NumberRangePredicate innerQuery = IndexQuery.range( 0, 0, true, 1, true ); + IndexQuery outerQuery = layoutUtil.rangeQuery( 2, true, 3, true ); + IndexQuery innerQuery = layoutUtil.rangeQuery( 0, true, 1, true ); long[] expectedOuter = new long[]{2, 3}; long[] expectedInner = new long[]{0, 1}; @@ -537,21 +501,21 @@ public void mustHandleMultipleNestedQueries() throws Exception // given IndexEntryUpdate[] updates = new IndexEntryUpdate[] { - IndexEntryUpdate.add( 0, indexDescriptor, Values.of( 0 ) ), - IndexEntryUpdate.add( 1, indexDescriptor, Values.of( 1 ) ), - IndexEntryUpdate.add( 2, indexDescriptor, Values.of( 2 ) ), - IndexEntryUpdate.add( 3, indexDescriptor, Values.of( 3 ) ), - IndexEntryUpdate.add( 4, indexDescriptor, Values.of( 4 ) ), - IndexEntryUpdate.add( 5, indexDescriptor, Values.of( 5 ) ), + IndexEntryUpdate.add( 0, indexDescriptor, layoutUtil.asValue( 0 ) ), + IndexEntryUpdate.add( 1, indexDescriptor, layoutUtil.asValue( 1 ) ), + IndexEntryUpdate.add( 2, indexDescriptor, layoutUtil.asValue( 2 ) ), + IndexEntryUpdate.add( 3, indexDescriptor, layoutUtil.asValue( 3 ) ), + IndexEntryUpdate.add( 4, indexDescriptor, layoutUtil.asValue( 4 ) ), + IndexEntryUpdate.add( 5, indexDescriptor, layoutUtil.asValue( 5 ) ) }; processAll( updates ); // when IndexReader reader = accessor.newReader(); - IndexQuery.NumberRangePredicate query1 = IndexQuery.range( 0, 4, true, 5, true ); - IndexQuery.NumberRangePredicate query2 = IndexQuery.range( 0, 2, true, 3, true ); - IndexQuery.NumberRangePredicate query3 = IndexQuery.range( 0, 0, true, 1, true ); + IndexQuery query1 = layoutUtil.rangeQuery( 4, true, 5, true ); + IndexQuery query2 = layoutUtil.rangeQuery( 2, true, 3, true ); + IndexQuery query3 = layoutUtil.rangeQuery( 0, true, 1, true ); long[] expected1 = new long[]{4, 5}; long[] expected2 = new long[]{2, 3}; @@ -828,17 +792,22 @@ private PrimitiveLongIterator query( IndexReader reader, IndexQuery query ) thro return client; } - private static int compare( Value value, Number other ) + private static int compare( Value value, Value other ) { - return COMPARATOR.compare( value, Values.of( other ) ); + return COMPARATOR.compare( value, other ); } - private static Predicate lessThan( Double other ) + private static Predicate lessThan( Value other ) { return t -> compare( t, other ) < 0; } - private static Predicate greaterThan( Double other ) + private static Predicate lessThanOrEqual( Value other ) + { + return t -> compare( t, other ) <= 0; + } + + private static Predicate greaterThan( Value other ) { return t -> compare( t, other ) > 0; } @@ -957,7 +926,7 @@ private IndexEntryUpdate selectRandomItem( Set... updates ) + final void processAll( IndexEntryUpdate... updates ) throws IOException, IndexEntryConflictException { try ( IndexUpdater updater = accessor.newUpdater( ONLINE ) ) diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexPopulatorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexPopulatorTest.java similarity index 96% rename from community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexPopulatorTest.java rename to community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexPopulatorTest.java index e8a3893347fbc..4fd3e91818a79 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexPopulatorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexPopulatorTest.java @@ -59,11 +59,11 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.neo4j.index.internal.gbptree.GBPTree.NO_HEADER_WRITER; -import static org.neo4j.kernel.impl.index.schema.NativeSchemaNumberIndexPopulator.BYTE_FAILED; -import static org.neo4j.kernel.impl.index.schema.NativeSchemaNumberIndexPopulator.BYTE_ONLINE; +import static org.neo4j.kernel.impl.index.schema.NativeSchemaIndexPopulator.BYTE_FAILED; +import static org.neo4j.kernel.impl.index.schema.NativeSchemaIndexPopulator.BYTE_ONLINE; -public abstract class NativeSchemaNumberIndexPopulatorTest - extends SchemaNumberIndexTestUtil +public abstract class NativeSchemaIndexPopulatorTest + extends NativeSchemaIndexTestUtil { private static final int LARGE_AMOUNT_OF_UPDATES = 1_000; static final PropertyAccessor null_property_accessor = ( nodeId, propKeyId ) -> @@ -71,7 +71,7 @@ public abstract class NativeSchemaNumberIndexPopulatorTest populator; + NativeSchemaIndexPopulator populator; @Before public void setupPopulator() @@ -80,7 +80,7 @@ public void setupPopulator() populator = createPopulator( pageCache, fs, indexFile, layout, samplingConfig ); } - abstract NativeSchemaNumberIndexPopulator createPopulator( PageCache pageCache, FileSystemAbstraction fs, File indexFile, + abstract NativeSchemaIndexPopulator createPopulator( PageCache pageCache, FileSystemAbstraction fs, File indexFile, Layout layout, IndexSamplingConfig samplingConfig ); @Test @@ -543,7 +543,7 @@ private String longString( int length ) return RandomStringUtils.random( length, true, true ); } - private void applyInterleaved( IndexEntryUpdate[] updates, NativeSchemaNumberIndexPopulator populator ) + private void applyInterleaved( IndexEntryUpdate[] updates, NativeSchemaIndexPopulator populator ) throws IOException, IndexEntryConflictException { boolean useUpdater = true; diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/SchemaNumberIndexTestUtil.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexTestUtil.java similarity index 98% rename from community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/SchemaNumberIndexTestUtil.java rename to community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexTestUtil.java index f06fc78ea486c..8dbad3eb8e6af 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/SchemaNumberIndexTestUtil.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeSchemaIndexTestUtil.java @@ -55,7 +55,7 @@ import static org.neo4j.index.internal.gbptree.GBPTree.NO_HEADER_WRITER; import static org.neo4j.test.rule.PageCacheRule.config; -public abstract class SchemaNumberIndexTestUtil +public abstract class NativeSchemaIndexTestUtil { static final long NON_EXISTENT_VALUE = Short.MAX_VALUE + 1; static final long NON_EXISTENT_ENTITY_ID = 1_000_000_000; diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/ConflictDetectingValueMergerTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberConflictDetectingValueMergerTest.java similarity index 78% rename from community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/ConflictDetectingValueMergerTest.java rename to community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberConflictDetectingValueMergerTest.java index fad3089a28052..7e1cdc28bc2dc 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/ConflictDetectingValueMergerTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberConflictDetectingValueMergerTest.java @@ -29,9 +29,9 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -public class ConflictDetectingValueMergerTest +public class NumberConflictDetectingValueMergerTest { - private final ConflictDetectingValueMerger detector = new ConflictDetectingValueMerger<>(); + private final ConflictDetectingValueMerger detector = new ConflictDetectingValueMerger<>(); @Test public void shouldReportConflictOnSameValueAndDifferentEntityIds() throws Exception @@ -42,11 +42,11 @@ public void shouldReportConflictOnSameValueAndDifferentEntityIds() throws Except long entityId2 = 20; // when - SchemaNumberValue merged = detector.merge( + NativeSchemaValue merged = detector.merge( key( entityId1, value ), key( entityId2, value ), - SchemaNumberValue.INSTANCE, - SchemaNumberValue.INSTANCE ); + NativeSchemaValue.INSTANCE, + NativeSchemaValue.INSTANCE ); // then assertNull( merged ); @@ -63,20 +63,20 @@ public void shouldNotReportConflictOnSameValueSameEntityId() throws Exception long entityId = 10; // when - SchemaNumberValue merged = detector.merge( + NativeSchemaValue merged = detector.merge( key( entityId, value ), key( entityId, value ), - SchemaNumberValue.INSTANCE, - SchemaNumberValue.INSTANCE ); + NativeSchemaValue.INSTANCE, + NativeSchemaValue.INSTANCE ); // then assertNull( merged ); assertFalse( detector.wasConflict() ); } - private static SchemaNumberKey key( long entityId, Value... value ) + private static NumberSchemaKey key( long entityId, Value... value ) { - SchemaNumberKey key = new SchemaNumberKey(); + NumberSchemaKey key = new NumberSchemaKey(); key.from( entityId, value ); return key; } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/FullScanNonUniqueIndexSamplerTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberFullScanNonUniqueIndexSamplerTest.java similarity index 83% rename from community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/FullScanNonUniqueIndexSamplerTest.java rename to community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberFullScanNonUniqueIndexSamplerTest.java index f83aae5846e0f..ec56086511243 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/FullScanNonUniqueIndexSamplerTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberFullScanNonUniqueIndexSamplerTest.java @@ -37,7 +37,7 @@ import static org.neo4j.kernel.impl.index.schema.LayoutTestUtil.countUniqueValues; import static org.neo4j.values.storable.Values.values; -public class FullScanNonUniqueIndexSamplerTest extends SchemaNumberIndexTestUtil +public class NumberFullScanNonUniqueIndexSamplerTest extends NativeSchemaIndexTestUtil { @Test public void shouldIncludeAllValuesInTree() throws Exception @@ -48,10 +48,10 @@ public void shouldIncludeAllValuesInTree() throws Exception // WHEN IndexSample sample; - try ( GBPTree gbpTree = getTree() ) + try ( GBPTree gbpTree = getTree() ) { IndexSamplingConfig samplingConfig = new IndexSamplingConfig( Config.defaults() ); - FullScanNonUniqueIndexSampler sampler = + FullScanNonUniqueIndexSampler sampler = new FullScanNonUniqueIndexSampler<>( gbpTree, layout, samplingConfig ); sample = sampler.result(); } @@ -75,12 +75,12 @@ private Number[] generateNumberValues() private void buildTree( Number[] values ) throws IOException { - try ( GBPTree gbpTree = getTree() ) + try ( GBPTree gbpTree = getTree() ) { - try ( Writer writer = gbpTree.writer() ) + try ( Writer writer = gbpTree.writer() ) { - SchemaNumberKey key = layout.newKey(); - SchemaNumberValue value = layout.newValue(); + NumberSchemaKey key = layout.newKey(); + NativeSchemaValue value = layout.newValue(); long nodeId = 0; for ( Number number : values ) { @@ -95,8 +95,8 @@ private void buildTree( Number[] values ) throws IOException } @Override - protected LayoutTestUtil createLayoutTestUtil() + protected LayoutTestUtil createLayoutTestUtil() { - return new NonUniqueLayoutTestUtil(); + return new NumberNonUniqueLayoutTestUtil(); } } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberLayoutTestUtil.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberLayoutTestUtil.java new file mode 100644 index 0000000000000..2c0fb473fb79b --- /dev/null +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberLayoutTestUtil.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2002-2018 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.neo4j.kernel.impl.index.schema; + +import org.neo4j.internal.kernel.api.IndexQuery; +import org.neo4j.kernel.api.schema.index.IndexDescriptor; +import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.Values; + +abstract class NumberLayoutTestUtil extends LayoutTestUtil +{ + NumberLayoutTestUtil( IndexDescriptor indexDescriptor ) + { + super( indexDescriptor ); + } + + @Override + IndexQuery rangeQuery( Number from, boolean fromInclusive, Number to, boolean toInclusive ) + { + return IndexQuery.range( 0, from, fromInclusive, to, toInclusive ); + } + + @Override + Value asValue( Number value ) + { + return Values.of( value ); + } +} diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NonUniqueLayoutTestUtil.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberNonUniqueLayoutTestUtil.java similarity index 86% rename from community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NonUniqueLayoutTestUtil.java rename to community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberNonUniqueLayoutTestUtil.java index f4caee32a0871..7c1fd7f482ee6 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NonUniqueLayoutTestUtil.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberNonUniqueLayoutTestUtil.java @@ -24,17 +24,17 @@ import org.neo4j.kernel.api.schema.index.IndexDescriptor; import org.neo4j.kernel.api.schema.index.IndexDescriptorFactory; -class NonUniqueLayoutTestUtil extends LayoutTestUtil +class NumberNonUniqueLayoutTestUtil extends NumberLayoutTestUtil { - NonUniqueLayoutTestUtil() + NumberNonUniqueLayoutTestUtil() { super( IndexDescriptorFactory.forLabel( 42, 666 ) ); } @Override - Layout createLayout() + Layout createLayout() { - return new NonUniqueNumberLayout(); + return new NumberLayoutNonUnique(); } @Override diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeUniqueSchemaNumberIndexAccessorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberNonUniqueSchemaIndexAccessorTest.java similarity index 78% rename from community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeUniqueSchemaNumberIndexAccessorTest.java rename to community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberNonUniqueSchemaIndexAccessorTest.java index 115bf70b3f941..e6073a5e24864 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeUniqueSchemaNumberIndexAccessorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberNonUniqueSchemaIndexAccessorTest.java @@ -19,12 +19,11 @@ */ package org.neo4j.kernel.impl.index.schema; -public class NativeUniqueSchemaNumberIndexAccessorTest - extends NativeSchemaNumberIndexAccessorTest +public class NumberNonUniqueSchemaIndexAccessorTest extends NumberSchemaIndexAccessorTest { @Override - protected LayoutTestUtil createLayoutTestUtil() + protected LayoutTestUtil createLayoutTestUtil() { - return new UniqueLayoutTestUtil(); + return new NumberNonUniqueLayoutTestUtil(); } } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeNonUniqueSchemaNumberIndexPopulatorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberNonUniqueSchemaIndexPopulatorTest.java similarity index 86% rename from community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeNonUniqueSchemaNumberIndexPopulatorTest.java rename to community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberNonUniqueSchemaIndexPopulatorTest.java index c5d31754af30e..7895755d4c672 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeNonUniqueSchemaNumberIndexPopulatorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberNonUniqueSchemaIndexPopulatorTest.java @@ -38,14 +38,13 @@ import static org.neo4j.helpers.ArrayUtil.array; import static org.neo4j.kernel.impl.index.schema.LayoutTestUtil.countUniqueValues; -public class NativeNonUniqueSchemaNumberIndexPopulatorTest - extends NativeSchemaNumberIndexPopulatorTest +public class NumberNonUniqueSchemaIndexPopulatorTest extends NativeSchemaIndexPopulatorTest { @Override - NativeSchemaNumberIndexPopulator createPopulator( PageCache pageCache, FileSystemAbstraction fs, - File indexFile, Layout layout, IndexSamplingConfig samplingConfig ) + NativeSchemaIndexPopulator createPopulator( PageCache pageCache, FileSystemAbstraction fs, + File indexFile, Layout layout, IndexSamplingConfig samplingConfig ) { - return new NativeNonUniqueSchemaNumberIndexPopulator<>( pageCache, fs, indexFile, layout, samplingConfig, monitor, indexDescriptor, + return new NativeNonUniqueSchemaIndexPopulator<>( pageCache, fs, indexFile, layout, samplingConfig, monitor, indexDescriptor, indexId ); } @@ -114,8 +113,8 @@ public void shouldSampleUpdatesIfConfiguredForOnlineSampling() throws Exception } @Override - protected LayoutTestUtil createLayoutTestUtil() + protected LayoutTestUtil createLayoutTestUtil() { - return new NonUniqueLayoutTestUtil(); + return new NumberNonUniqueLayoutTestUtil(); } } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexAccessorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexAccessorTest.java new file mode 100644 index 0000000000000..2fb506822a2e1 --- /dev/null +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexAccessorTest.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2002-2018 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.neo4j.kernel.impl.index.schema; + +import org.junit.Test; + +import java.io.IOException; +import java.util.Arrays; + +import org.neo4j.internal.kernel.api.IndexOrder; +import org.neo4j.internal.kernel.api.IndexQuery; +import org.neo4j.kernel.api.index.IndexEntryUpdate; +import org.neo4j.kernel.api.schema.index.IndexDescriptor; +import org.neo4j.kernel.impl.api.index.sampling.IndexSamplingConfig; +import org.neo4j.storageengine.api.schema.IndexReader; +import org.neo4j.storageengine.api.schema.SimpleNodeValueClient; +import org.neo4j.values.storable.Value; +import org.neo4j.values.storable.ValueGroup; +import org.neo4j.values.storable.Values; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.neo4j.index.internal.gbptree.RecoveryCleanupWorkCollector.IMMEDIATE; + +public abstract class NumberSchemaIndexAccessorTest + extends NativeSchemaIndexAccessorTest +{ + NativeSchemaIndexAccessor makeAccessorWithSamplingConfig( IndexSamplingConfig samplingConfig ) throws IOException + { + return new NumberSchemaIndexAccessor<>( pageCache, fs, indexFile, layout, IMMEDIATE, monitor, indexDescriptor, indexId, samplingConfig ); + } + + @Test + public void respectIndexOrder() throws Exception + { + // given + IndexEntryUpdate[] someUpdates = layoutUtil.someUpdates(); + processAll( someUpdates ); + Value[] expectedValues = layoutUtil.extractValuesFromUpdates( someUpdates ); + + // when + IndexReader reader = accessor.newReader(); + IndexQuery.NumberRangePredicate supportedQuery = + IndexQuery.range( 0, Double.NEGATIVE_INFINITY, true, Double.POSITIVE_INFINITY, true ); + + for ( IndexOrder supportedOrder : NumberSchemaIndexProvider.CAPABILITY.orderCapability( ValueGroup.NUMBER ) ) + { + if ( supportedOrder == IndexOrder.ASCENDING ) + { + Arrays.sort( expectedValues, Values.COMPARATOR ); + } + if ( supportedOrder == IndexOrder.DESCENDING ) + { + Arrays.sort( expectedValues, Values.COMPARATOR.reversed() ); + } + + SimpleNodeValueClient client = new SimpleNodeValueClient(); + reader.query( client, supportedOrder, supportedQuery ); + int i = 0; + while ( client.next() ) + { + assertEquals( "values in order", expectedValues[i++], client.values[0] ); + } + assertTrue( "found all values", i == expectedValues.length ); + } + } +} diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexProviderTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexProviderTest.java similarity index 94% rename from community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexProviderTest.java rename to community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexProviderTest.java index a58c1724be661..f1d8ebcf32e27 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexProviderTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberSchemaIndexProviderTest.java @@ -55,7 +55,7 @@ import static org.neo4j.index.internal.gbptree.RecoveryCleanupWorkCollector.IMMEDIATE; import static org.neo4j.kernel.api.index.IndexDirectoryStructure.directoriesByProvider; -public class NativeSchemaNumberIndexProviderTest +public class NumberSchemaIndexProviderTest { @Rule public PageCacheAndDependenciesRule rules = new PageCacheAndDependenciesRule(); @@ -63,7 +63,7 @@ public class NativeSchemaNumberIndexProviderTest private static final int indexId = 1; private static final int labelId = 1; private static final int propId = 1; - private NativeSchemaNumberIndexProvider provider; + private NumberSchemaIndexProvider provider; private final AssertableLogProvider logging = new AssertableLogProvider(); private SchemaIndexProvider.Monitor monitor = new LoggingMonitor( logging.getLog( "test" ) ); @@ -105,7 +105,7 @@ public void getPopulatorMustCreateUniquePopulatorForTypeUnique() throws Exceptio IndexPopulator populator = provider.getPopulator( indexId, descriptorUnique(), samplingConfig() ); // then - assertTrue( "Expected populator to be unique populator", populator instanceof NativeUniqueSchemaNumberIndexPopulator ); + assertTrue( "Expected populator to be unique populator", populator instanceof NativeUniqueSchemaIndexPopulator ); } @Test @@ -118,7 +118,7 @@ public void getPopulatorMustCreateNonUniquePopulatorForTypeGeneral() throws Exce IndexPopulator populator = provider.getPopulator( indexId, descriptor(), samplingConfig() ); // then - assertTrue( "Expected populator to be non-unique populator", populator instanceof NativeNonUniqueSchemaNumberIndexPopulator ); + assertTrue( "Expected populator to be non-unique populator", populator instanceof NativeNonUniqueSchemaIndexPopulator ); } /* getOnlineAccessor */ @@ -203,7 +203,7 @@ public void getPopulationFailureMustThrowEvenIfFailureOnOtherIndex() throws Exce // given provider = newProvider(); - int nonFailedIndexId = NativeSchemaNumberIndexProviderTest.indexId; + int nonFailedIndexId = NumberSchemaIndexProviderTest.indexId; IndexPopulator nonFailedPopulator = provider.getPopulator( nonFailedIndexId, descriptor(), samplingConfig() ); nonFailedPopulator.create(); nonFailedPopulator.close( true ); @@ -387,14 +387,14 @@ private IndexDescriptor descriptorUnique() return IndexDescriptorFactory.uniqueForLabel( labelId, propId ); } - private NativeSchemaNumberIndexProvider newProvider() + private NumberSchemaIndexProvider newProvider() { - return new NativeSchemaNumberIndexProvider( pageCache(), fs(), directoriesByProvider( baseDir() ), monitor, IMMEDIATE, false ); + return new NumberSchemaIndexProvider( pageCache(), fs(), directoriesByProvider( baseDir() ), monitor, IMMEDIATE, false ); } - private NativeSchemaNumberIndexProvider newReadOnlyProvider() + private NumberSchemaIndexProvider newReadOnlyProvider() { - return new NativeSchemaNumberIndexProvider( pageCache(), fs(), directoriesByProvider( baseDir() ), monitor, IMMEDIATE, true ); + return new NumberSchemaIndexProvider( pageCache(), fs(), directoriesByProvider( baseDir() ), monitor, IMMEDIATE, true ); } private PageCache pageCache() diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/UniqueLayoutTestUtil.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberUniqueLayoutTestUtil.java similarity index 86% rename from community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/UniqueLayoutTestUtil.java rename to community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberUniqueLayoutTestUtil.java index eb9e8e0fd843f..0a6f26376fc1e 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/UniqueLayoutTestUtil.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberUniqueLayoutTestUtil.java @@ -24,17 +24,17 @@ import org.neo4j.kernel.api.schema.index.IndexDescriptor; import org.neo4j.kernel.api.schema.index.IndexDescriptorFactory; -public class UniqueLayoutTestUtil extends LayoutTestUtil +public class NumberUniqueLayoutTestUtil extends NumberLayoutTestUtil { - UniqueLayoutTestUtil() + NumberUniqueLayoutTestUtil() { super( IndexDescriptorFactory.uniqueForLabel( 42, 666 ) ); } @Override - public Layout createLayout() + public Layout createLayout() { - return new UniqueNumberLayout(); + return new NumberLayoutUnique(); } @Override diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeNonUniqueSchemaNumberIndexAccessorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberUniqueSchemaIndexAccessorTest.java similarity index 77% rename from community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeNonUniqueSchemaNumberIndexAccessorTest.java rename to community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberUniqueSchemaIndexAccessorTest.java index 67e449a4150cb..35bd69f64bc52 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeNonUniqueSchemaNumberIndexAccessorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberUniqueSchemaIndexAccessorTest.java @@ -19,12 +19,12 @@ */ package org.neo4j.kernel.impl.index.schema; -public class NativeNonUniqueSchemaNumberIndexAccessorTest - extends NativeSchemaNumberIndexAccessorTest +public class NumberUniqueSchemaIndexAccessorTest + extends NumberSchemaIndexAccessorTest { @Override - protected LayoutTestUtil createLayoutTestUtil() + protected LayoutTestUtil createLayoutTestUtil() { - return new NonUniqueLayoutTestUtil(); + return new NumberUniqueLayoutTestUtil(); } } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeUniqueSchemaNumberIndexPopulatorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberUniqueSchemaIndexPopulatorTest.java similarity index 88% rename from community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeUniqueSchemaNumberIndexPopulatorTest.java rename to community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberUniqueSchemaIndexPopulatorTest.java index f3e645e63b69c..ef60da8095929 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeUniqueSchemaNumberIndexPopulatorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NumberUniqueSchemaIndexPopulatorTest.java @@ -40,20 +40,20 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -public class NativeUniqueSchemaNumberIndexPopulatorTest extends NativeSchemaNumberIndexPopulatorTest +public class NumberUniqueSchemaIndexPopulatorTest extends NativeSchemaIndexPopulatorTest { @Override - NativeSchemaNumberIndexPopulator createPopulator( + NativeSchemaIndexPopulator createPopulator( PageCache pageCache, FileSystemAbstraction fs, File indexFile, - Layout layout, IndexSamplingConfig samplingConfig ) + Layout layout, IndexSamplingConfig samplingConfig ) { - return new NativeUniqueSchemaNumberIndexPopulator<>( pageCache, fs, indexFile, layout, monitor, indexDescriptor, indexId ); + return new NativeUniqueSchemaIndexPopulator<>( pageCache, fs, indexFile, layout, monitor, indexDescriptor, indexId ); } @Override - protected LayoutTestUtil createLayoutTestUtil() + protected LayoutTestUtil createLayoutTestUtil() { - return new UniqueLayoutTestUtil(); + return new NumberUniqueLayoutTestUtil(); } @Test diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/RawBitsTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/RawBitsTest.java index 4cdb68d8e9c6f..6d977a72ba8c8 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/RawBitsTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/RawBitsTest.java @@ -52,10 +52,10 @@ public static List layouts() { return asList( new Object[]{"Unique", - new UniqueNumberLayout() + new NumberLayoutUnique() }, new Object[]{"NonUnique", - new NonUniqueNumberLayout() + new NumberLayoutNonUnique() } ); } @@ -113,7 +113,7 @@ public void mustSortInSameOrderAsValueComparator() throws Exception { // given List values = asValueObjects( objects ); - List schemaNumberKeys = asSchemaNumberKeys( values ); + List schemaNumberKeys = asSchemaNumberKeys( values ); Collections.shuffle( values ); Collections.shuffle( schemaNumberKeys ); @@ -131,18 +131,18 @@ public void shouldCompareAllValuesToAllOtherValuesLikeValueComparator() throws E { // given List values = asValueObjects( objects ); - List schemaNumberKeys = asSchemaNumberKeys( values ); + List schemaNumberKeys = asSchemaNumberKeys( values ); values.sort( Values.COMPARATOR ); // when - for ( SchemaNumberKey numberKey : schemaNumberKeys ) + for ( NumberSchemaKey numberKey : schemaNumberKeys ) { - List withoutThisOne = new ArrayList<>( schemaNumberKeys ); + List withoutThisOne = new ArrayList<>( schemaNumberKeys ); assertTrue( withoutThisOne.remove( numberKey ) ); withoutThisOne = unmodifiableList( withoutThisOne ); for ( int i = 0; i < withoutThisOne.size(); i++ ) { - List withThisOneInWrongPlace = new ArrayList<>( withoutThisOne ); + List withThisOneInWrongPlace = new ArrayList<>( withoutThisOne ); withThisOneInWrongPlace.add( i, numberKey ); withThisOneInWrongPlace.sort( layout ); List actual = asValues( withThisOneInWrongPlace ); @@ -158,18 +158,18 @@ public void shouldHaveSameCompareResultsAsValueCompare() throws Exception { // given List values = asValueObjects( objects ); - List schemaNumberKeys = asSchemaNumberKeys( values ); + List schemaNumberKeys = asSchemaNumberKeys( values ); // when for ( int i = 0; i < values.size(); i++ ) { Value value1 = values.get( i ); - SchemaNumberKey schemaNumberKey1 = schemaNumberKeys.get( i ); + NumberSchemaKey schemaNumberKey1 = schemaNumberKeys.get( i ); for ( int j = 0; j < values.size(); j++ ) { // then Value value2 = values.get( j ); - SchemaNumberKey schemaNumberKey2 = schemaNumberKeys.get( j ); + NumberSchemaKey schemaNumberKey2 = schemaNumberKeys.get( j ); assertEquals( Values.COMPARATOR.compare( value1, value2 ), layout.compare( schemaNumberKey1, schemaNumberKey2 ) ); assertEquals( Values.COMPARATOR.compare( value2, value1 ), @@ -178,7 +178,7 @@ public void shouldHaveSameCompareResultsAsValueCompare() throws Exception } } - private List asValues( List schemaNumberKeys ) + private List asValues( List schemaNumberKeys ) { return schemaNumberKeys.stream() .map( k -> RawBits.asNumberValue( k.rawValueBits, k.type ) ) @@ -214,12 +214,12 @@ private List asValueObjects( List objects ) return values; } - private List asSchemaNumberKeys( List values ) + private List asSchemaNumberKeys( List values ) { - List schemaNumberKeys = new ArrayList<>(); + List schemaNumberKeys = new ArrayList<>(); for ( Value value : values ) { - SchemaNumberKey key = new SchemaNumberKey(); + NumberSchemaKey key = new NumberSchemaKey(); key.from( 0, value ); schemaNumberKeys.add( key ); } diff --git a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/NativeLuceneFusionSchemaIndexProviderFactory.java b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/NativeLuceneFusionSchemaIndexProviderFactory.java index 726ec4d4f8ac9..d072c4ae5379e 100644 --- a/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/NativeLuceneFusionSchemaIndexProviderFactory.java +++ b/community/lucene-index/src/main/java/org/neo4j/kernel/api/impl/schema/NativeLuceneFusionSchemaIndexProviderFactory.java @@ -32,7 +32,7 @@ import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.extension.KernelExtensionFactory; import org.neo4j.kernel.impl.factory.OperationalMode; -import org.neo4j.kernel.impl.index.schema.NativeSchemaNumberIndexProvider; +import org.neo4j.kernel.impl.index.schema.NumberSchemaIndexProvider; import org.neo4j.kernel.impl.index.schema.NativeSelector; import org.neo4j.kernel.impl.index.schema.fusion.FusionSchemaIndexProvider; import org.neo4j.kernel.impl.spi.KernelContext; @@ -46,7 +46,7 @@ public class NativeLuceneFusionSchemaIndexProviderFactory extends KernelExtensionFactory { - public static final String KEY = LuceneSchemaIndexProviderFactory.KEY + "+" + NativeSchemaNumberIndexProvider.KEY; + public static final String KEY = LuceneSchemaIndexProviderFactory.KEY + "+" + NumberSchemaIndexProvider.KEY; private static final int PRIORITY = LuceneSchemaIndexProvider.PRIORITY + 1; public static final SchemaIndexProvider.Descriptor DESCRIPTOR = new SchemaIndexProvider.Descriptor( KEY, "1.0" ); @@ -85,8 +85,8 @@ public static FusionSchemaIndexProvider newInstance( PageCache pageCache, File s { IndexDirectoryStructure.Factory childDirectoryStructure = subProviderDirectoryStructure( storeDir ); boolean readOnly = isReadOnly( config, operationalMode ); - NativeSchemaNumberIndexProvider nativeProvider = - new NativeSchemaNumberIndexProvider( pageCache, fs, childDirectoryStructure, monitor, recoveryCleanupWorkCollector, readOnly ); + NumberSchemaIndexProvider nativeProvider = + new NumberSchemaIndexProvider( pageCache, fs, childDirectoryStructure, monitor, recoveryCleanupWorkCollector, readOnly ); LuceneSchemaIndexProvider luceneProvider = LuceneSchemaIndexProviderFactory.create( fs, childDirectoryStructure, monitor, config, operationalMode ); boolean useNativeIndex = config.get( GraphDatabaseSettings.enable_native_schema_index ); diff --git a/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/FusionIndexIT.java b/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/FusionIndexIT.java index 3ddfd211ab837..e83f8fccef4ed 100644 --- a/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/FusionIndexIT.java +++ b/community/lucene-index/src/test/java/org/neo4j/kernel/api/impl/schema/FusionIndexIT.java @@ -33,7 +33,7 @@ import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.kernel.api.index.SchemaIndexProvider; import org.neo4j.kernel.configuration.Settings; -import org.neo4j.kernel.impl.index.schema.NativeSchemaNumberIndexProvider; +import org.neo4j.kernel.impl.index.schema.NumberSchemaIndexProvider; import org.neo4j.kernel.internal.GraphDatabaseAPI; import org.neo4j.test.rule.DatabaseRule; import org.neo4j.test.rule.EmbeddedDatabaseRule; @@ -68,7 +68,7 @@ public void mustRebuildFusionIndexIfNativePartIsMissing() throws Exception initializeIndexWithDataAndShutdown(); // when - SchemaIndexProvider.Descriptor descriptor = NativeSchemaNumberIndexProvider.NATIVE_PROVIDER_DESCRIPTOR; + SchemaIndexProvider.Descriptor descriptor = NumberSchemaIndexProvider.NATIVE_PROVIDER_DESCRIPTOR; deleteIndexFilesFor( descriptor ); // then @@ -99,7 +99,7 @@ public void mustRebuildFusionIndexIfCompletelyMissing() throws Exception // when SchemaIndexProvider.Descriptor luceneDescriptor = LuceneSchemaIndexProviderFactory.PROVIDER_DESCRIPTOR; - SchemaIndexProvider.Descriptor nativeDescriptor = NativeSchemaNumberIndexProvider.NATIVE_PROVIDER_DESCRIPTOR; + SchemaIndexProvider.Descriptor nativeDescriptor = NumberSchemaIndexProvider.NATIVE_PROVIDER_DESCRIPTOR; deleteIndexFilesFor( luceneDescriptor ); deleteIndexFilesFor( nativeDescriptor );