diff --git a/community/values/src/main/java/org/neo4j/values/ArrayValue.java b/community/values/src/main/java/org/neo4j/values/DirectArray.java similarity index 96% rename from community/values/src/main/java/org/neo4j/values/ArrayValue.java rename to community/values/src/main/java/org/neo4j/values/DirectArray.java index f5ec2d75c06b8..119a2564fdcba 100644 --- a/community/values/src/main/java/org/neo4j/values/ArrayValue.java +++ b/community/values/src/main/java/org/neo4j/values/DirectArray.java @@ -19,7 +19,7 @@ */ package org.neo4j.values; -abstract class ArrayValue extends Value +abstract class DirectArray extends Value { abstract int length(); diff --git a/community/values/src/main/java/org/neo4j/values/DirectBooleanArray.java b/community/values/src/main/java/org/neo4j/values/DirectBooleanArray.java index d453e947da1fa..b1f7287271ab4 100644 --- a/community/values/src/main/java/org/neo4j/values/DirectBooleanArray.java +++ b/community/values/src/main/java/org/neo4j/values/DirectBooleanArray.java @@ -23,7 +23,7 @@ import static java.lang.String.format; -final class DirectBooleanArray extends ArrayValue implements ValueGroup.VBooleanArray +final class DirectBooleanArray extends DirectArray implements ValueGroup.VBooleanArray { private final boolean[] value; @@ -130,12 +130,7 @@ static int hash( boolean[] value ) @Override void writeTo( ValueWriter writer ) { - writer.beginArray( value.length, ValueWriter.ArrayType.BOOLEAN ); - for ( boolean x : value ) - { - writer.writeBoolean( x ); - } - writer.endArray(); + PrimitiveArrayWriting.writeTo( writer, value ); } @Override diff --git a/community/values/src/main/java/org/neo4j/values/DirectByteArray.java b/community/values/src/main/java/org/neo4j/values/DirectByteArray.java index 86eea57f5e9f6..3f22285d8fcac 100644 --- a/community/values/src/main/java/org/neo4j/values/DirectByteArray.java +++ b/community/values/src/main/java/org/neo4j/values/DirectByteArray.java @@ -84,12 +84,7 @@ boolean equals( double[] x ) @Override void writeTo( ValueWriter writer ) { - writer.beginArray( value.length, ValueWriter.ArrayType.BYTE ); - for ( byte x : value ) - { - writer.writeInteger( x ); - } - writer.endArray(); + PrimitiveArrayWriting.writeTo( writer, value ); } @Override diff --git a/community/values/src/main/java/org/neo4j/values/DirectCharArray.java b/community/values/src/main/java/org/neo4j/values/DirectCharArray.java index 882dd42446a16..43faa9de7cd77 100644 --- a/community/values/src/main/java/org/neo4j/values/DirectCharArray.java +++ b/community/values/src/main/java/org/neo4j/values/DirectCharArray.java @@ -23,7 +23,7 @@ import static java.lang.String.format; -final class DirectCharArray extends ArrayValue +final class DirectCharArray extends DirectArray { final char[] value; diff --git a/community/values/src/main/java/org/neo4j/values/DirectDoubleArray.java b/community/values/src/main/java/org/neo4j/values/DirectDoubleArray.java index 4e5fbd529664e..058114b411430 100644 --- a/community/values/src/main/java/org/neo4j/values/DirectDoubleArray.java +++ b/community/values/src/main/java/org/neo4j/values/DirectDoubleArray.java @@ -84,12 +84,7 @@ boolean equals( double[] x ) @Override void writeTo( ValueWriter writer ) { - writer.beginArray( value.length, ValueWriter.ArrayType.DOUBLE ); - for ( double x : value ) - { - writer.writeFloatingPoint( x ); - } - writer.endArray(); + PrimitiveArrayWriting.writeTo( writer, value ); } @Override diff --git a/community/values/src/main/java/org/neo4j/values/DirectFloatArray.java b/community/values/src/main/java/org/neo4j/values/DirectFloatArray.java index b738d72a1d5b3..9a8e9190b4d24 100644 --- a/community/values/src/main/java/org/neo4j/values/DirectFloatArray.java +++ b/community/values/src/main/java/org/neo4j/values/DirectFloatArray.java @@ -84,12 +84,7 @@ boolean equals( double[] x ) @Override void writeTo( ValueWriter writer ) { - writer.beginArray( value.length, ValueWriter.ArrayType.FLOAT ); - for ( float x : value ) - { - writer.writeFloatingPoint( x ); - } - writer.endArray(); + PrimitiveArrayWriting.writeTo( writer, value ); } @Override diff --git a/community/values/src/main/java/org/neo4j/values/DirectFloatingPointArray.java b/community/values/src/main/java/org/neo4j/values/DirectFloatingPointArray.java index caa1e3728d0cb..f70debc3a999f 100644 --- a/community/values/src/main/java/org/neo4j/values/DirectFloatingPointArray.java +++ b/community/values/src/main/java/org/neo4j/values/DirectFloatingPointArray.java @@ -19,7 +19,7 @@ */ package org.neo4j.values; -abstract class DirectFloatingPointArray extends ArrayValue implements ValueGroup.VFloatingPointArray +abstract class DirectFloatingPointArray extends DirectArray implements ValueGroup.VFloatingPointArray { public abstract double doubleValue( int index ); @@ -77,29 +77,11 @@ public final int hashCode() public int compareTo( ValueGroup.VIntegerArray other ) { - int i = 0; - int length = length(); - int x = length - other.length(); - - while ( x == 0 && i < length ) - { - x = NumberValues.compareDoubleAgainstLong( doubleValue( i ), other.longValue( i ) ); - i++; - } - return x; + return -NumberValues.compareIntegerVsFloatArrays( other, this ); } public int compareTo( ValueGroup.VFloatingPointArray other ) { - int i = 0; - int length = length(); - int x = length - other.length(); - - while ( x == 0 && i < length ) - { - x = Double.compare( doubleValue( i ), other.doubleValue( i ) ); - i++; - } - return x; + return NumberValues.compareFloatArrays( this, other ); } } diff --git a/community/values/src/main/java/org/neo4j/values/DirectIntArray.java b/community/values/src/main/java/org/neo4j/values/DirectIntArray.java index ae790f4e169cf..84faf879b0ee0 100644 --- a/community/values/src/main/java/org/neo4j/values/DirectIntArray.java +++ b/community/values/src/main/java/org/neo4j/values/DirectIntArray.java @@ -84,12 +84,7 @@ boolean equals( double[] x ) @Override void writeTo( ValueWriter writer ) { - writer.beginArray( value.length, ValueWriter.ArrayType.INT ); - for ( int x : value ) - { - writer.writeInteger( x ); - } - writer.endArray(); + PrimitiveArrayWriting.writeTo( writer, value ); } @Override diff --git a/community/values/src/main/java/org/neo4j/values/DirectIntegralArray.java b/community/values/src/main/java/org/neo4j/values/DirectIntegralArray.java index 6ac2ee8d52dcc..4d9d97633ff8c 100644 --- a/community/values/src/main/java/org/neo4j/values/DirectIntegralArray.java +++ b/community/values/src/main/java/org/neo4j/values/DirectIntegralArray.java @@ -19,7 +19,7 @@ */ package org.neo4j.values; -abstract class DirectIntegralArray extends ArrayValue implements ValueGroup.VIntegerArray +abstract class DirectIntegralArray extends DirectArray implements ValueGroup.VIntegerArray { @Override boolean equals( boolean[] x ) @@ -76,30 +76,13 @@ public final int hashCode() @Override public int compareTo( ValueGroup.VIntegerArray other ) { - int i = 0; - int length = length(); - int x = length - other.length(); - - while ( x == 0 && i < length ) - { - x = Long.compare( longValue( i ), other.longValue( i ) ); - i++; - } - return x; + return NumberValues.compareIntegerArrays( this, other ); } @Override public int compareTo( ValueGroup.VFloatingPointArray other ) { - int i = 0; - int length = length(); - int x = length - other.length(); - - while ( x == 0 && i < length ) - { - x = NumberValues.compareLongAgainstDouble( longValue( i ), other.doubleValue( i ) ); - i++; - } - return x; + return NumberValues.compareIntegerVsFloatArrays( this, other ); } + } diff --git a/community/values/src/main/java/org/neo4j/values/DirectLongArray.java b/community/values/src/main/java/org/neo4j/values/DirectLongArray.java index 923e0c3c268cc..8c704c822328c 100644 --- a/community/values/src/main/java/org/neo4j/values/DirectLongArray.java +++ b/community/values/src/main/java/org/neo4j/values/DirectLongArray.java @@ -84,12 +84,7 @@ boolean equals( double[] x ) @Override void writeTo( ValueWriter writer ) { - writer.beginArray( value.length, ValueWriter.ArrayType.LONG ); - for ( long x : value ) - { - writer.writeInteger( x ); - } - writer.endArray(); + PrimitiveArrayWriting.writeTo( writer, value ); } @Override diff --git a/community/values/src/main/java/org/neo4j/values/DirectShortArray.java b/community/values/src/main/java/org/neo4j/values/DirectShortArray.java index e703ab93c9347..59aad840cd8d9 100644 --- a/community/values/src/main/java/org/neo4j/values/DirectShortArray.java +++ b/community/values/src/main/java/org/neo4j/values/DirectShortArray.java @@ -84,12 +84,7 @@ boolean equals( double[] x ) @Override void writeTo( ValueWriter writer ) { - writer.beginArray( value.length, ValueWriter.ArrayType.SHORT ); - for ( short x : value ) - { - writer.writeInteger( x ); - } - writer.endArray(); + PrimitiveArrayWriting.writeTo( writer, value ); } @Override diff --git a/community/values/src/main/java/org/neo4j/values/DirectStringArray.java b/community/values/src/main/java/org/neo4j/values/DirectStringArray.java index 81e2c45819848..5fb724a36a8c6 100644 --- a/community/values/src/main/java/org/neo4j/values/DirectStringArray.java +++ b/community/values/src/main/java/org/neo4j/values/DirectStringArray.java @@ -23,7 +23,7 @@ import static java.lang.String.format; -final class DirectStringArray extends ArrayValue +final class DirectStringArray extends DirectArray { final String[] value; @@ -114,12 +114,7 @@ public int hashCode() @Override void writeTo( ValueWriter writer ) { - writer.beginArray( value.length, ValueWriter.ArrayType.STRING ); - for ( String x : value ) - { - writer.writeString( x ); - } - writer.endArray(); + PrimitiveArrayWriting.writeTo( writer, value ); } @Override diff --git a/community/values/src/main/java/org/neo4j/values/NumberValues.java b/community/values/src/main/java/org/neo4j/values/NumberValues.java index fa58de1363653..67664d4a3fa43 100644 --- a/community/values/src/main/java/org/neo4j/values/NumberValues.java +++ b/community/values/src/main/java/org/neo4j/values/NumberValues.java @@ -240,4 +240,46 @@ public static boolean numbersEqual( ValueGroup.VFloatingPointArray fps, ValueGro } return true; } + + public static int compareIntegerArrays( ValueGroup.VIntegerArray a, ValueGroup.VIntegerArray b ) + { + int i = 0; + int length = a.length(); + int x = length - b.length(); + + while ( x == 0 && i < length ) + { + x = Long.compare( a.longValue( i ), b.longValue( i ) ); + i++; + } + return x; + } + + public static int compareIntegerVsFloatArrays( ValueGroup.VIntegerArray a, ValueGroup.VFloatingPointArray b ) + { + int i = 0; + int length = a.length(); + int x = length - b.length(); + + while ( x == 0 && i < length ) + { + x = compareLongAgainstDouble( a.longValue( i ), b.doubleValue( i ) ); + i++; + } + return x; + } + + public static int compareFloatArrays( ValueGroup.VFloatingPointArray a, ValueGroup.VFloatingPointArray b ) + { + int i = 0; + int length = a.length(); + int x = length - b.length(); + + while ( x == 0 && i < length ) + { + x = Double.compare( a.doubleValue( i ), b.doubleValue( i ) ); + i++; + } + return x; + } } diff --git a/community/values/src/main/java/org/neo4j/values/PrimitiveArrayWriting.java b/community/values/src/main/java/org/neo4j/values/PrimitiveArrayWriting.java new file mode 100644 index 0000000000000..da95c1b188a50 --- /dev/null +++ b/community/values/src/main/java/org/neo4j/values/PrimitiveArrayWriting.java @@ -0,0 +1,113 @@ +/* + * 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.values; + +public class PrimitiveArrayWriting +{ + public static void writeTo( ValueWriter writer, byte[] values ) + { + writer.beginArray( values.length, ValueWriter.ArrayType.BYTE ); + for ( byte x : values ) + { + writer.writeInteger( x ); + } + writer.endArray(); + } + + public static void writeTo( ValueWriter writer, short[] values ) + { + writer.beginArray( values.length, ValueWriter.ArrayType.SHORT ); + for ( short x : values ) + { + writer.writeInteger( x ); + } + writer.endArray(); + } + + public static void writeTo( ValueWriter writer, int[] values ) + { + writer.beginArray( values.length, ValueWriter.ArrayType.INT ); + for ( int x : values ) + { + writer.writeInteger( x ); + } + writer.endArray(); + } + + public static void writeTo( ValueWriter writer, long[] values ) + { + writer.beginArray( values.length, ValueWriter.ArrayType.LONG ); + for ( long x : values ) + { + writer.writeInteger( x ); + } + writer.endArray(); + } + + public static void writeTo( ValueWriter writer, float[] values ) + { + writer.beginArray( values.length, ValueWriter.ArrayType.FLOAT ); + for ( float x : values ) + { + writer.writeFloatingPoint( x ); + } + writer.endArray(); + } + + public static void writeTo( ValueWriter writer, double[] values ) + { + writer.beginArray( values.length, ValueWriter.ArrayType.DOUBLE ); + for ( double x : values ) + { + writer.writeFloatingPoint( x ); + } + writer.endArray(); + } + + public static void writeTo( ValueWriter writer, boolean[] values ) + { + writer.beginArray( values.length, ValueWriter.ArrayType.BOOLEAN ); + for ( boolean x : values ) + { + writer.writeBoolean( x ); + } + writer.endArray(); + } + + public static void writeTo( ValueWriter writer, char[] values ) + { + writer.beginArray( values.length, ValueWriter.ArrayType.CHAR ); + for ( char x : values ) + { + writer.writeString( x ); + } + writer.endArray(); + } + + public static void writeTo( ValueWriter writer, String[] values ) + { + writer.beginArray( values.length, ValueWriter.ArrayType.STRING ); + for ( String x : values ) + { + writer.writeString( x ); + } + writer.endArray(); + } +}