From a840f149bf7c90933da4df85df7f91962ce43dca Mon Sep 17 00:00:00 2001 From: Anton Persson Date: Thu, 7 Dec 2017 14:15:45 +0100 Subject: [PATCH] TestLayout is responsible for seeding key and value --- .../gbptree/InternalTreeLogicTest.java | 12 +++---- .../internal/gbptree/KeyValueSeeder.java | 10 ++++++ .../gbptree/SimpleByteArrayLayout.java | 36 ++++++++++++++++--- .../internal/gbptree/SimpleLongLayout.java | 24 ++++++++++++- .../index/internal/gbptree/TestLayout.java | 5 +++ .../gbptree/TreeNodeDynamicSizeTest.java | 20 +---------- .../gbptree/TreeNodeFixedSizeTest.java | 18 +--------- .../internal/gbptree/TreeNodeTestBase.java | 18 ++++++---- 8 files changed, 88 insertions(+), 55 deletions(-) create mode 100644 community/index/src/test/java/org/neo4j/index/internal/gbptree/KeyValueSeeder.java create mode 100644 community/index/src/test/java/org/neo4j/index/internal/gbptree/TestLayout.java diff --git a/community/index/src/test/java/org/neo4j/index/internal/gbptree/InternalTreeLogicTest.java b/community/index/src/test/java/org/neo4j/index/internal/gbptree/InternalTreeLogicTest.java index 301859e13f14a..e413a466281d4 100644 --- a/community/index/src/test/java/org/neo4j/index/internal/gbptree/InternalTreeLogicTest.java +++ b/community/index/src/test/java/org/neo4j/index/internal/gbptree/InternalTreeLogicTest.java @@ -63,7 +63,7 @@ public class InternalTreeLogicTest private final int pageSize = 256; private final SimpleIdProvider id = new SimpleIdProvider(); - private final Layout layout = new SimpleLongLayout(); + private final TestLayout layout = new SimpleLongLayout(); private final TreeNode node = new TreeNodeFixedSize<>( pageSize, layout ); private final InternalTreeLogic treeLogic = new InternalTreeLogic<>( id, node, layout ); @@ -1587,21 +1587,17 @@ private void printTree() throws IOException private MutableLong key( long seed ) { - MutableLong key = layout.newKey(); - key.setValue( seed ); - return key; + return layout.key( seed ); } private MutableLong value( long seed ) { - MutableLong value = layout.newValue(); - value.setValue( seed ); - return value; + return layout.value( seed ); } private long getSeed( MutableLong key ) { - return key.getValue(); + return layout.getSeed( key ); } private void newRootFromSplit( StructurePropagation split ) throws IOException diff --git a/community/index/src/test/java/org/neo4j/index/internal/gbptree/KeyValueSeeder.java b/community/index/src/test/java/org/neo4j/index/internal/gbptree/KeyValueSeeder.java new file mode 100644 index 0000000000000..3830ce77287a3 --- /dev/null +++ b/community/index/src/test/java/org/neo4j/index/internal/gbptree/KeyValueSeeder.java @@ -0,0 +1,10 @@ +package org.neo4j.index.internal.gbptree; + +interface KeyValueSeeder +{ + KEY key( long seed ); + + VALUE value( long seed ); + + long getSeed( KEY key ); +} diff --git a/community/index/src/test/java/org/neo4j/index/internal/gbptree/SimpleByteArrayLayout.java b/community/index/src/test/java/org/neo4j/index/internal/gbptree/SimpleByteArrayLayout.java index 7b4811c725eb4..481c5ea3cd985 100644 --- a/community/index/src/test/java/org/neo4j/index/internal/gbptree/SimpleByteArrayLayout.java +++ b/community/index/src/test/java/org/neo4j/index/internal/gbptree/SimpleByteArrayLayout.java @@ -19,9 +19,11 @@ */ package org.neo4j.index.internal.gbptree; +import java.nio.ByteBuffer; + import org.neo4j.io.pagecache.PageCursor; -public class SimpleByteArrayLayout extends Layout.Adapter +public class SimpleByteArrayLayout extends TestLayout { @Override public RawBytes newKey() @@ -112,10 +114,11 @@ public int minorVersion() @Override public int compare( RawBytes o1, RawBytes o2 ) { - return byteArrayCompare( o1.bytes, o2.bytes ); + int compare = Long.compare( getSeed( o1 ), getSeed( o2 ) ); + return compare != 0 ? compare : byteArrayCompare( o1.bytes, o2.bytes, Long.BYTES ); } - private int byteArrayCompare( byte[] a, byte[] b ) + private int byteArrayCompare( byte[] a, byte[] b, int fromPos ) { assert a != null && b != null : "Null arrays not supported."; @@ -125,7 +128,7 @@ private int byteArrayCompare( byte[] a, byte[] b ) } int length = Math.min( a.length, b.length ); - for ( int i = 0; i < length; i++ ) + for ( int i = fromPos; i < length; i++ ) { int compare = Byte.compare( a[i], b[i] ); if ( compare != 0 ) @@ -145,4 +148,29 @@ private int byteArrayCompare( byte[] a, byte[] b ) } return 0; } + + @Override + public RawBytes key( long seed ) + { + RawBytes key = newKey(); + key.bytes = ByteBuffer.allocate( 16 ).putLong( seed ).putLong( seed ).array(); + return key; + } + + @Override + public RawBytes value( long seed ) + { + RawBytes value = newValue(); + value.bytes = ByteBuffer.allocate( 17 ).putLong( seed ).putLong( seed ).array(); + return value; + } + + @Override + public long getSeed( RawBytes rawBytes ) + { + ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES); + buffer.put( rawBytes.bytes, 0, Long.BYTES ); + buffer.flip(); + return buffer.getLong(); + } } diff --git a/community/index/src/test/java/org/neo4j/index/internal/gbptree/SimpleLongLayout.java b/community/index/src/test/java/org/neo4j/index/internal/gbptree/SimpleLongLayout.java index ecf2c79f9a326..110a4f538d5db 100644 --- a/community/index/src/test/java/org/neo4j/index/internal/gbptree/SimpleLongLayout.java +++ b/community/index/src/test/java/org/neo4j/index/internal/gbptree/SimpleLongLayout.java @@ -25,7 +25,7 @@ import static java.nio.charset.StandardCharsets.UTF_8; -class SimpleLongLayout extends Layout.Adapter +class SimpleLongLayout extends TestLayout { private final int keyPadding; private String customNameAsMetaData; @@ -180,4 +180,26 @@ private static String readString( PageCursor cursor ) cursor.getBytes( bytes ); return new String( bytes, UTF_8 ); } + + @Override + public MutableLong key( long seed ) + { + MutableLong key = newKey(); + key.setValue( seed ); + return key; + } + + @Override + public MutableLong value( long seed ) + { + MutableLong value = newValue(); + value.setValue( seed ); + return value; + } + + @Override + public long getSeed( MutableLong key ) + { + return key.getValue(); + } } diff --git a/community/index/src/test/java/org/neo4j/index/internal/gbptree/TestLayout.java b/community/index/src/test/java/org/neo4j/index/internal/gbptree/TestLayout.java new file mode 100644 index 0000000000000..735ab598cac49 --- /dev/null +++ b/community/index/src/test/java/org/neo4j/index/internal/gbptree/TestLayout.java @@ -0,0 +1,5 @@ +package org.neo4j.index.internal.gbptree; + +public abstract class TestLayout extends Layout.Adapter implements KeyValueSeeder +{ +} diff --git a/community/index/src/test/java/org/neo4j/index/internal/gbptree/TreeNodeDynamicSizeTest.java b/community/index/src/test/java/org/neo4j/index/internal/gbptree/TreeNodeDynamicSizeTest.java index 9e447a8b10325..37ee1f8bf4628 100644 --- a/community/index/src/test/java/org/neo4j/index/internal/gbptree/TreeNodeDynamicSizeTest.java +++ b/community/index/src/test/java/org/neo4j/index/internal/gbptree/TreeNodeDynamicSizeTest.java @@ -1,7 +1,5 @@ package org.neo4j.index.internal.gbptree; -import java.nio.ByteBuffer; - import org.neo4j.io.pagecache.PageCursor; import static org.junit.Assert.assertEquals; @@ -30,7 +28,7 @@ public class TreeNodeDynamicSizeTest extends TreeNodeTestBase private SimpleByteArrayLayout layout = new SimpleByteArrayLayout(); @Override - protected Layout getLayout() + protected TestLayout getLayout() { return layout; } @@ -41,22 +39,6 @@ protected TreeNode getNode( int pageSize, Layout( pageSize, layout ); } - @Override - protected RawBytes key( long sortOrder ) - { - RawBytes key = layout.newKey(); - key.bytes = ByteBuffer.allocate( 16 ).putLong( sortOrder ).putLong( sortOrder ).array(); - return key; - } - - @Override - protected RawBytes value( long someValue ) - { - RawBytes value = layout.newValue(); - value.bytes = ByteBuffer.allocate( 17 ).putLong( someValue ).putLong( someValue ).array(); - return value; - } - @Override boolean valuesEqual( RawBytes firstValue, RawBytes secondValue ) { diff --git a/community/index/src/test/java/org/neo4j/index/internal/gbptree/TreeNodeFixedSizeTest.java b/community/index/src/test/java/org/neo4j/index/internal/gbptree/TreeNodeFixedSizeTest.java index c22906557f83f..d807038cb8975 100644 --- a/community/index/src/test/java/org/neo4j/index/internal/gbptree/TreeNodeFixedSizeTest.java +++ b/community/index/src/test/java/org/neo4j/index/internal/gbptree/TreeNodeFixedSizeTest.java @@ -28,7 +28,7 @@ public class TreeNodeFixedSizeTest extends TreeNodeTestBase getLayout() + protected TestLayout getLayout() { return layout; } @@ -39,22 +39,6 @@ protected TreeNode getNode( int pageSize, Layout( pageSize, layout ); } - @Override - protected MutableLong key( long sortOrder ) - { - MutableLong key = layout.newKey(); - key.setValue( sortOrder ); - return key; - } - - @Override - protected MutableLong value( long someValue ) - { - MutableLong value = layout.newValue(); - value.setValue( someValue ); - return value; - } - @Override boolean valuesEqual( MutableLong firstValue, MutableLong secondValue ) { diff --git a/community/index/src/test/java/org/neo4j/index/internal/gbptree/TreeNodeTestBase.java b/community/index/src/test/java/org/neo4j/index/internal/gbptree/TreeNodeTestBase.java index 48b12267b1a25..a95d9ef267873 100644 --- a/community/index/src/test/java/org/neo4j/index/internal/gbptree/TreeNodeTestBase.java +++ b/community/index/src/test/java/org/neo4j/index/internal/gbptree/TreeNodeTestBase.java @@ -50,7 +50,7 @@ public abstract class TreeNodeTestBase private static final int PAGE_SIZE = 512; final PageCursor cursor = new PageAwareByteArrayCursor( PAGE_SIZE ); - private Layout layout; + private TestLayout layout; private TreeNode node; @Rule @@ -64,18 +64,24 @@ public void prepareCursor() throws IOException node = getNode( PAGE_SIZE, layout ); } - protected abstract Layout getLayout(); + protected abstract TestLayout getLayout(); protected abstract TreeNode getNode( int pageSize, Layout layout ); - protected abstract KEY key( long sortOrder ); - - protected abstract VALUE value( long someValue ); - abstract boolean valuesEqual( VALUE firstValue, VALUE secondValue ); abstract void assertAdditionalHeader( PageCursor cursor, TreeNode node, int pageSize ); + private KEY key( long seed ) + { + return layout.key( seed ); + }; + + private VALUE value( long seed ) + { + return layout.value( seed ); + } + @Test public void shouldInitializeLeaf() throws Exception {