From 1b8d89ab7cc05a2870e3d94871084ea61a39c622 Mon Sep 17 00:00:00 2001 From: Pontus Melke Date: Tue, 22 Aug 2017 14:57:57 +0200 Subject: [PATCH] Move StringValue production one step down --- .../api/store/StorePropertyPayloadCursor.java | 11 ++++++----- .../kernel/impl/store/LongerShortString.java | 18 ++++++++++-------- .../neo4j/kernel/impl/store/PropertyType.java | 2 +- .../store/StorePropertyPayloadCursorTest.java | 3 ++- .../impl/store/TestLongerShortString.java | 15 +++++++++------ 5 files changed, 28 insertions(+), 21 deletions(-) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/store/StorePropertyPayloadCursor.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/store/StorePropertyPayloadCursor.java index 15189a93d5946..e2126892b2a45 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/store/StorePropertyPayloadCursor.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/store/StorePropertyPayloadCursor.java @@ -31,6 +31,7 @@ import org.neo4j.kernel.impl.store.record.Record; import org.neo4j.kernel.impl.util.Bits; import org.neo4j.string.UTF8; +import org.neo4j.values.storable.TextValue; import org.neo4j.values.storable.Value; import org.neo4j.values.storable.Values; @@ -188,18 +189,18 @@ long longValue() return Double.longBitsToDouble( data[position + 1] ); } - String shortStringValue() + TextValue shortStringValue() { assertOfType( SHORT_STRING ); return LongerShortString.decode( data, position, currentBlocksUsed() ); } - String stringValue() + TextValue stringValue() { assertOfType( STRING ); readFromStore( stringRecordCursor ); buffer.flip(); - return UTF8.decode( buffer.array(), 0, buffer.limit() ); + return Values.stringValue( UTF8.decode( buffer.array(), 0, buffer.limit() ) ); } Value shortArrayValue() @@ -238,9 +239,9 @@ Value value() case DOUBLE: return Values.doubleValue( doubleValue() ); case SHORT_STRING: - return Values.stringValue( shortStringValue() ); + return shortStringValue(); case STRING: - return Values.stringValue( stringValue() ); + return stringValue(); case SHORT_ARRAY: return shortArrayValue(); case ARRAY: diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/LongerShortString.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/LongerShortString.java index 7b1117b227dde..c08e6fd559565 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/LongerShortString.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/LongerShortString.java @@ -26,6 +26,8 @@ import org.neo4j.kernel.impl.util.Bits; import org.neo4j.string.UTF8; import org.neo4j.unsafe.impl.internal.dragons.UnsafeUtil; +import org.neo4j.values.storable.TextValue; +import org.neo4j.values.storable.Values; /** * Supports encoding alphanumerical and SP . - + , ' : / _ @@ -897,17 +899,17 @@ private static void writeHeader( Bits bits, int keyId, int encoding, int stringL * @param block the value to decode to a short string. * @return the decoded short string */ - public static String decode( PropertyBlock block ) + public static TextValue decode( PropertyBlock block ) { return decode( block.getValueBlocks(), 0, block.getValueBlocks().length ); } - public static String decode( long[] blocks, int offset, int length ) + public static TextValue decode( long[] blocks, int offset, int length ) { long firstLong = blocks[offset]; if ( (firstLong & 0xFFFFFF0FFFFFFFFFL) == 0 ) { - return ""; + return Values.EMPTY_STRING; } // key(24b) + type(4) = 28 int encoding = (int) ((firstLong & 0x1F0000000L) >>> 28); // 5 bits of encoding @@ -930,7 +932,7 @@ public static String decode( long[] blocks, int offset, int length ) decode( result, blocks, offset, table ); // We know the char array is unshared, so use sharing constructor explicitly - return UnsafeUtil.newSharedArrayString( result ); + return Values.stringValue( UnsafeUtil.newSharedArrayString( result ) ); } private static void decode( char[] result, long[] blocks, int offset, LongerShortString table ) @@ -1055,7 +1057,7 @@ private void translateData( Bits bits, byte[] data, int length, final int step ) } } - private static String decodeLatin1( long[] blocks, int offset, int stringLength ) + private static TextValue decodeLatin1( long[] blocks, int offset, int stringLength ) { char[] result = new char[stringLength]; int block = offset; @@ -1071,10 +1073,10 @@ private static String decodeLatin1( long[] blocks, int offset, int stringLength } result[i] = codePoint; } - return UnsafeUtil.newSharedArrayString( result ); + return Values.stringValue( UnsafeUtil.newSharedArrayString( result ) ); } - private static String decodeUTF8( long[] blocks, int offset, int stringLength ) + private static TextValue decodeUTF8( long[] blocks, int offset, int stringLength ) { byte[] result = new byte[stringLength]; int block = offset; @@ -1090,7 +1092,7 @@ private static String decodeUTF8( long[] blocks, int offset, int stringLength ) } result[i] = codePoint; } - return UTF8.decode( result ); + return Values.stringValue( UTF8.decode( result ) ); } public static int calculateNumberOfBlocksUsed( long firstBlock ) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/PropertyType.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/PropertyType.java index 763d4e96874a9..adf0ef265f30d 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/store/PropertyType.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/store/PropertyType.java @@ -168,7 +168,7 @@ private byte[] headOf( byte[] bytes, int length ) @Override public Value value( PropertyBlock block, PropertyStore store ) { - return Values.stringValue( LongerShortString.decode( block ) ); + return LongerShortString.decode( block ); } @Override diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/store/StorePropertyPayloadCursorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/store/StorePropertyPayloadCursorTest.java index 162e477f60e6e..dc19df4f96124 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/store/StorePropertyPayloadCursorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/store/StorePropertyPayloadCursorTest.java @@ -47,6 +47,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; @@ -57,7 +58,6 @@ import static org.neo4j.kernel.impl.api.store.StorePropertyPayloadCursorTest.Param.param; import static org.neo4j.kernel.impl.api.store.StorePropertyPayloadCursorTest.Param.paramArg; import static org.neo4j.kernel.impl.api.store.StorePropertyPayloadCursorTest.Params.params; -import static org.neo4j.test.assertion.Assert.assertObjectOrArrayEquals; @RunWith( Enclosed.class ) public class StorePropertyPayloadCursorTest @@ -176,6 +176,7 @@ public void shouldUseDynamicStringAndArrayStoresThroughDifferentCursors() // When assertTrue( cursor.next() ); assertNotNull( cursor.stringValue() ); + assertNotEquals( Values.NO_VALUE, cursor.stringValue() ); assertTrue( cursor.next() ); assertNotNull( cursor.arrayValue() ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestLongerShortString.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestLongerShortString.java index 73d30d88fb980..4a4905a778290 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestLongerShortString.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/store/TestLongerShortString.java @@ -25,6 +25,7 @@ import java.util.List; import org.neo4j.kernel.impl.store.record.PropertyBlock; +import org.neo4j.values.storable.Values; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -78,7 +79,7 @@ public void testRandomStrings() throws Exception PropertyBlock record = new PropertyBlock(); if ( LongerShortString.encode( 10, string, record, DEFAULT_PAYLOAD_SIZE ) ) { - assertEquals( string, LongerShortString.decode( record ) ); + assertEquals( Values.stringValue( string ), LongerShortString.decode( record ) ); } } } @@ -104,20 +105,22 @@ public void canEncodeLower() throws Exception public void canEncodeLowerHex() throws Exception { assertCanEncodeAndDecodeToSame( "da39a3ee5e6b4b0d3255bfef95601890afd80709" ); // sha1hex('') len=40 - assertCanEncodeAndDecodeToSame( "0123456789" + "abcdefabcd" + "0a0b0c0d0e" + "1a1b1c1d1e" + "f9e8d7c6b5" + "a4f3" ); // len=54 + assertCanEncodeAndDecodeToSame( + "0123456789" + "abcdefabcd" + "0a0b0c0d0e" + "1a1b1c1d1e" + "f9e8d7c6b5" + "a4f3" ); // len=54 assertCannotEncode( "da39a3ee5e6b4b0d3255bfef95601890afd80709" + "0123456789" + "abcde" ); // len=55 // test not failing on long illegal hex - assertCannotEncode( "aaaaaaaaaa" + "bbbbbbbbbb" + "cccccccccc" + "dddddddddd" + "eeeeeeeeee" + "x"); + assertCannotEncode( "aaaaaaaaaa" + "bbbbbbbbbb" + "cccccccccc" + "dddddddddd" + "eeeeeeeeee" + "x" ); } @Test public void canEncodeUpperHex() throws Exception { assertCanEncodeAndDecodeToSame( "DA39A3EE5E6B4B0D3255BFEF95601890AFD80709" ); // sha1HEX('') len=40 - assertCanEncodeAndDecodeToSame( "0123456789" + "ABCDEFABCD" + "0A0B0C0D0E" + "1A1B1C1D1E" + "F9E8D7C6B5" + "A4F3" ); // len=54 + assertCanEncodeAndDecodeToSame( + "0123456789" + "ABCDEFABCD" + "0A0B0C0D0E" + "1A1B1C1D1E" + "F9E8D7C6B5" + "A4F3" ); // len=54 assertCannotEncode( "DA39A3EE5E6B4B0D3255BFEF95601890AFD80709" + "0123456789" + "ABCDE" ); // len=55 // test not failing on long illegal HEX - assertCannotEncode( "AAAAAAAAAA" + "BBBBBBBBBB" + "CCCCCCCCCC" + "DDDDDDDDDD" + "EEEEEEEEEE" + "X"); + assertCannotEncode( "AAAAAAAAAA" + "BBBBBBBBBB" + "CCCCCCCCCC" + "DDDDDDDDDD" + "EEEEEEEEEE" + "X" ); } @Test @@ -152,7 +155,7 @@ private void assertCanEncodeAndDecodeToSame( String string, int payloadSize ) { PropertyBlock target = new PropertyBlock(); assertTrue( LongerShortString.encode( 0, string, target, payloadSize ) ); - assertEquals( string, LongerShortString.decode( target ) ); + assertEquals( Values.stringValue( string ), LongerShortString.decode( target ) ); } private void assertCannotEncode( String string )